найти дубликат с оператором if, затем удалить дубликат - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть таблица (BERTHAGE), которая отслеживает местоположение судов, когда они находятся в порту.

Когда судно перемещается из одного места в другое, я обрабатываю движение через форму, которая привязана к комбинированному списку.

Я использую одно поле со списком (связано с запросом), чтобы дать мне текущий список судов в порту.

Оттуда я выбираю движущееся судно.

Как только судно выбрано, я использую другое поле со списком, чтобы выбрать новое местоположение.

Оттуда я нажимаю кнопку Сохранить, и запись сохраняется в соответствующей таблице, и судно теперь привязано к новому местоположению.

Проблема, с которой я столкнулся, заключается в том, что предыдущая запись местоположения все еще существует в той же таблице (BERTHAGE).

Итак, теперь у меня есть две записи для одного судна за одну неделю, это становится проблемой, когда дело доходит до выставления счетов.

Я пытаюсь удалить одну из записей и конечно, это должна быть более старая запись / прежнее местоположение судна.

Поскольку каждой записи присваивается автоматический номер (первичный ключ) самой новой записи, движение судна из одного местоположения в другое будет всегда иметь более высокий автоматический номер.

Я пытался найти способ найти дубликат в таблице (BERTHAGE) на основе названия судна, а затем удалить более старую запись с именем дубликата судна. .

Кажется, единственный способ go об этом - это серия запросов (поиск дубликатов, добавление), и каждый раз заканчивается перезапись всей таблицы. Я пытаюсь избежать этого и придерживаюсь цели удаления только дубликатов, которые появляются на той неделе, когда судно перемещается из одного места в другое.

Хотя мой сценарий средний, я не могу не думать о том, что лучший способ достичь этой цели - что-то похожее на оператор 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 Ответ

1 голос
/ 28 апреля 2020

Вместо удаления записи я бы посоветовал установить флаг в таблице, чтобы указать, что он не активен. Это означает, что вы можете при необходимости воссоздать исторические данные.

В моих примерах я предполагаю, что таблица Berthage имеет поле первичного ключа с именем ID, которое является Autonumber, поле VesselID, которое является числовым c внешним ключом из таблицы Vessel, который предоставляет информацию о судах, а также имеет BerthageActive, что является полем Да / Нет.

Если вы можете выполнить обновление перед сохранением новой информации в таблице Berthage вы можете использовать:

CurrentDb.Execute "UPDATE Berthage SET BerthageActive=False WHERE VesselID=" & Me!VesselID & " AND BerthageActive=True;"

Если новые данные уже существуют в таблице Berthage, вы можете использовать:

CurrentDb.Execute "UPDATE Berthage SET BerthageActive=False WHERE VesselID=" & Me!VesselID & " AND ID<>" & Me!ID & " AND BerthageActive=True;"

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...