Вы спрашивали о запросе.Я написал быструю процедуру VBA вместо этого просто потому, что это было так просто.Но я не уверен, подходит ли это для вашей ситуации.
Я создал tblPackets с числовым столбцом для new_PacketID.Я надеялся, что станет понятнее, что происходит.Если вам действительно необходимо заменить PacketID новым номером, вы можете изменить процедуру, чтобы сохранить CStr(lngPacketID)
в этом текстовом поле.Итак, это пример данных, с которого я начал:
PacketID new_PacketID packet_data
BDFD-2 a
R2D2-22 aa
BDFD-2 b
R2D2-22 bb
EMC2-0 aaa
EMC2-0 bbb
И это таблица после выполнения процедуры.
PacketID new_PacketID packet_data
BDFD-2 1 a
R2D2-22 3 aa
BDFD-2 1 b
R2D2-22 3 bb
EMC2-0 2 aaa
EMC2-0 2 bbb
И код ...
Public Sub RenumberPacketIDs()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim lngPacketID As Long
Dim strLastPacketID As String
Dim strSql As String
strSql = "SELECT PacketID, new_PacketID" & vbCrLf & _
"FROM tblPackets" & vbCrLf & _
"ORDER BY PacketID;"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSql)
With rs
Do While Not .EOF
If !PacketID <> strLastPacketID Then
lngPacketID = lngPacketID + 1
strLastPacketID = !PacketID
End If
.Edit
!new_PacketID = lngPacketID
.Update
.MoveNext
Loop
.Close
End With
Set rs = Nothing
Set db = Nothing
End Sub
Я думаю, что подобный подход может быть подходящим для одноразового преобразования.Однако, если это операция, которую вам нужно выполнять повторно, это может быть более сложным ... особенно если вам нужно, чтобы каждый PacketID заменялся на один и тот же номер от одного запуска к следующему ... напримерBDFD-2 был заменен на 1 в первый раз, поэтому должен заменяться на 1 при каждом запуске процедуры.