使用if语句查找重复项,然后删除重复项

时间:2020-04-28 14:05:06

标签: vba ms-access ms-access-2010

我有一张桌子(BERTHAGE),可以跟踪船只在港口时的位置。

当船只从一个位置移动到另一位置时,我通过绑定到组合框的表格来处理移动。

我使用一个组合框(绑定到查询中)为我提供了港口的当前船只清单。

从那里我选择正在移动的船。

选择船只后,我将使用另一个组合框选择新位置。

从那里我单击“保存”按钮,记录被保存在适当的表中,而容器现在已被绑在新位置。

我遇到的问题是,先前的位置记录仍存在于同一表(BERTHAGE)中。

所以现在我在同一周有两艘船的记录,这在开票方面就成为一个问题。

我想做的是消除其中一个条目,当然它必须是较旧的条目/船只的位置。

由于为每个条目分配了自动编号(主键),所以最新的条目将使船只从一个位置到另一个位置的移动始终具有较高的自动编号。

我一直试图根据容器名称在表(BERTHAGE)中找到重复的方法,然后删除具有重复容器名称的较早条目。

看来,解决此问题的唯一方法是一系列查询(查找重复项,附加项),最终每次都覆盖整个表。我试图避免这种情况,并坚持只删除当周船只从一个地点移到另一个地点时发生的任何重复的目标。

尽管我的脚本编写是平均水平,但我不禁要想,达到此目标的最佳方法是通过类似于保存按钮中的IF语句。我希望Access具有类似于Excel的.RemoveDuplicates的功能,但到目前为止我还没有找到它。

寻找人们可能拥有的任何指针。

Private Sub Form_Load()
DoCmd.RunCommand acCmdRecordsGoToLast
End Sub

Private Sub cmd_Clear_Click()
Me.Boat_New_Loc = ""
Me.CrNum.value = ""
Me.CrDockValue.value = ""
Me.CrFloatValue.value = ""
Me.CrOriValue.value = ""
Me.SelectNewLoc.value = ""
Me.cmd_berthed.value = ""
Me.NewFloatValue.value = ""
Me.NewDockValue.value = ""
Me.NewOrieValue.value = ""
End Sub

Private Sub Boat_New_Loc_Change()
Me.CrNum.value = Me.Boat_New_Loc.Column(4)
Me.CrDockValue.value = Me.Boat_New_Loc.Column(5)
Me.CrFloatValue.value = Me.Boat_New_Loc.Column(6)
Me.CrOriValue.value = Me.Boat_New_Loc.Column(7)
End Sub

Private Sub SelectNewLoc_Change()
Me.NewFloatValue.value = Me.SelectNewLoc.Column(1)
Me.NewDockValue.value = Me.SelectNewLoc.Column(2)
Me.NewOrieValue.value = Me.SelectNewLoc.Column(3)
End Sub

Private Sub Save_Code_But_Click()

    DoCmd.RunSQL "UPDATE BERTHAGE SET BERTHAGE.LOCATION=False WHERE LOCATION=" & Me!CrNum _
& " AND LOCATION <>" _
& Me!SelectNewLoc & _
" AND BERTHAGE.LOCATION=True;"

DoCmd.Save acForm, "Change_Boat_Location3"

cmd_Clear_Click
End Sub

1 个答案:

答案 0 :(得分:1)

除了建议删除记录外,我建议在表中设置一个标志以指示该记录未处于活动状态。这意味着您可以根据需要重新创建历史数据。

在我的示例中,我假设表Berthage具有一个称为ID的主键字段,它是一个自动编号,一个字段VesselID是来自{{1 }}表提供有关船只的信息,并且还有Vessel(是/否字段)。

如果您能够在将新信息保存到BerthageActive表中之前进行更新,则可以使用:

Berthage

如果CurrentDb.Execute "UPDATE Berthage SET BerthageActive=False WHERE VesselID=" & Me!VesselID & " AND BerthageActive=True;" 表中已经存在新数据,则可以使用:

Berthage

此致