如何使用 ADODB 在 Access 表单中添加下一个和上一个
How to add Next and Previous in Access form using ADODB
我有一个小小的请求,我已经做了尽可能多的研究,并且已经完成了我想做的事情。这是我的代码:
这是模块代码:
Global con As New ADODB.Connection
Global NoRecords As Boolean
Public Enum rrCursorType
rrOpenDynamic = adOpenDynamic
rrOpenForwardOnly = adOpenForwardOnly
rrOpenKeyset = adOpenKeyset
rrOpenStatic = adOpenStatic
End Enum
Public Enum rrLockType
rrLockOptimistic = adLockOptimistic
rrLockReadOnly = adLockReadOnly
End Enum
Public Function OpenMyRecordset(rs As ADODB.Recordset, strSQL As String, Optional rrCursor As rrCursorType, Optional rrLock As rrLockType, Optional bolClientSide As Boolean) As ADODB.Recordset
If con.State = adStateClosed Then
con.ConnectionString ="Driver= {SQLServer};Server=logistics.xxx.com;Database=ITM;Trusted_Connection=Yes;"
con.Open
End If
Set rs = New ADODB.Recordset
With rs
.ActiveConnection = con
If bolClientSide Then
.CursorLocation = adUseClient
Else
.CursorLocation = adUseServer
End If
.CursorType = IIf((rrCursor = 0), adOpenStatic, rrCursor)
.LockType = IIf((rrLock = 0), adLockReadOnly, rrLock)
.Open strSQL
If .EOF And .BOF Then
NoRecords = True
Exit Function
End If
End With
End Function
下面是表单上搜索按钮背后的完整代码:
Private Sub btnSearch_Click()
'UPC Search
If Me.chkUPCSearch = False Then
strSQL = "SELECT DISTINCT[PO Master Data Table].[PO Nbr], [PO Master Data Table].UPC, [PO Master Data Table].[Item Description], " _
& "[PO Master Data Table].[Vendor Style], [PO Master Data Table].COO, [PO Master Data Table].[Currency Type], [PO Master Data Table].Cost, " _
& "[PO Master Data Table].[Assist $ Amount], [PO Master Data Table].[Supplier Name], [Vendor Table].[Manufacturer Name], " _
& "[Vendor Table].[Manufacturer Address], [Master HTS Table].[HTS DESCRIPTION], [PO Master Data Table].[Order Qty], " _
& "[PO Master Data Table].[Qty Recieved], [PO Master Data Table].[PO Comments], " _
& "[Master HTS Table].[HTS 1], [Master HTS Table].[HTS 2], [Master HTS Table].[HTS 3], [Master HTS Table].[HTS 4], [Master HTS Table].[HTS 5], " _
& "[Master HTS Table].[HTS 6], [Master HTS Table].[HTS 7], [Master HTS Table].[HTS 8], [Master HTS Table].[HTS 9], [Master HTS Table].[HTS 10], " _
& "[Master HTS Table].[Canada HTS 1], [Master Shared Compliance Review].[SCR ID] " _
& "FROM (([PO Master Data Table] LEFT JOIN [Master HTS Table] ON [PO Master Data Table].[Vendor Style] = [Master HTS Table].[Vendor Style]) " _
& "LEFT JOIN [Master Shared Compliance Review] ON ([PO Master Data Table].UPC = [Master Shared Compliance Review].UPC) AND ([PO Master Data Table].[PO Nbr] = [Master Shared Compliance Review].[PO Number])) " _
& "LEFT JOIN [Vendor Table] ON [PO Master Data Table].[Vendor Style] = [Vendor Table].[Vend Style] " _
& "WHERE [PO Nbr] = '" & Me.txtSearch & "'"
OpenMyRecordset rstRSCH, strSQL
With rstRSCH
If .RecordCount = 0 Then
Answer = MsgBox("The record you are searching for does not exist. Please verify you have typed it in correctly! Do you need to create an SCR Record?", vbYesNo + vbQuestion, " ERROR!")
If Answer = vbYes Then
DoCmd.OpenForm "Manual SCR Entry - Record Search"
Exit Sub
End If
If Answer = vbNo Then
Me.Refresh
Exit Sub
End If
Else
.MoveNext
.MovePrevious
Me.txtPO.Value = rstRSCH("PO Nbr")
Me.txtUPC.Value = rstRSCH("UPC")
Me.txtItemDesc.Value = rstRSCH("Item Description")
Me.txtStyleNbr.Value = rstRSCH("Vendor Style")
Me.txtSuppNM.Value = rstRSCH("Supplier Name")
Me.txtMFGNM.Value = rstRSCH("Manufacturer Name")
Me.txtMFGAdd.Value = rstRSCH("Manufacturer Address")
Me.txtHTSDESC.Value = rstRSCH("HTS Description")
Me.txtSCRID.Value = rstRSCH("SCR ID")
Me.txtQTY.Value = rstRSCH("Order Qty")
Me.txtCost.Value = rstRSCH("Cost")
Me.txtAssist.Value = rstRSCH("ASSIST $ AMOUNT")
Me.txtCOO.Value = rstRSCH("COO")
Me.txtHTS1.Value = rstRSCH("HTS 1")
Me.txtHTS2.Value = rstRSCH("HTS 2")
Me.txtHTS3.Value = rstRSCH("HTS 3")
Me.txtHTS4.Value = rstRSCH("HTS 4")
Me.txtHTS5.Value = rstRSCH("HTS 5")
Me.txtHTS6.Value = rstRSCH("HTS 6")
Me.txtHTS7.Value = rstRSCH("HTS 7")
Me.txtHTS8.Value = rstRSCH("HTS 8")
Me.txtHTS9.Value = rstRSCH("HTS 9")
Me.txtHTS10.Value = rstRSCH("HTS 10")
Me.txtCANHTS.Value = rstRSCH("Canada HTS 1")
End If
End With
End If
Set rstRSCH = nothing`enter code here`
这是我需要帮助的地方。上面的效果很好,它使用 ADODB.connections 和 returns 结果。但是如果我搜索 PO XYZ 并且我知道它有两个 lines/records 与之关联;它只显示表格中记录 1 of 1。如何让记录选择器分别显示 1 of 2 或 2 of 2?
我开始沿着 .movenext、.moveprevious 方法的道路前进,但后来我感到困惑。任何帮助将不胜感激。
上面的代码被严重简化了,只是为了说明这个想法。它确实调用了一个名为 OpenMyRecordset 的函数,因此大部分连接信息都在其中。
您可以使用 .MoveLast
完全初始化记录集,然后 .MoveFirst
只要它包含记录:
If .RecordCount = 0 Then
Answer = Msgbox("string",vbokonly,"title")
Else
.MoveLast
.MoveFirst
End If
请注意,在大型记录集上,这可能会降低您的性能。
我有一个小小的请求,我已经做了尽可能多的研究,并且已经完成了我想做的事情。这是我的代码:
这是模块代码:
Global con As New ADODB.Connection
Global NoRecords As Boolean
Public Enum rrCursorType
rrOpenDynamic = adOpenDynamic
rrOpenForwardOnly = adOpenForwardOnly
rrOpenKeyset = adOpenKeyset
rrOpenStatic = adOpenStatic
End Enum
Public Enum rrLockType
rrLockOptimistic = adLockOptimistic
rrLockReadOnly = adLockReadOnly
End Enum
Public Function OpenMyRecordset(rs As ADODB.Recordset, strSQL As String, Optional rrCursor As rrCursorType, Optional rrLock As rrLockType, Optional bolClientSide As Boolean) As ADODB.Recordset
If con.State = adStateClosed Then
con.ConnectionString ="Driver= {SQLServer};Server=logistics.xxx.com;Database=ITM;Trusted_Connection=Yes;"
con.Open
End If
Set rs = New ADODB.Recordset
With rs
.ActiveConnection = con
If bolClientSide Then
.CursorLocation = adUseClient
Else
.CursorLocation = adUseServer
End If
.CursorType = IIf((rrCursor = 0), adOpenStatic, rrCursor)
.LockType = IIf((rrLock = 0), adLockReadOnly, rrLock)
.Open strSQL
If .EOF And .BOF Then
NoRecords = True
Exit Function
End If
End With
End Function
下面是表单上搜索按钮背后的完整代码:
Private Sub btnSearch_Click()
'UPC Search
If Me.chkUPCSearch = False Then
strSQL = "SELECT DISTINCT[PO Master Data Table].[PO Nbr], [PO Master Data Table].UPC, [PO Master Data Table].[Item Description], " _
& "[PO Master Data Table].[Vendor Style], [PO Master Data Table].COO, [PO Master Data Table].[Currency Type], [PO Master Data Table].Cost, " _
& "[PO Master Data Table].[Assist $ Amount], [PO Master Data Table].[Supplier Name], [Vendor Table].[Manufacturer Name], " _
& "[Vendor Table].[Manufacturer Address], [Master HTS Table].[HTS DESCRIPTION], [PO Master Data Table].[Order Qty], " _
& "[PO Master Data Table].[Qty Recieved], [PO Master Data Table].[PO Comments], " _
& "[Master HTS Table].[HTS 1], [Master HTS Table].[HTS 2], [Master HTS Table].[HTS 3], [Master HTS Table].[HTS 4], [Master HTS Table].[HTS 5], " _
& "[Master HTS Table].[HTS 6], [Master HTS Table].[HTS 7], [Master HTS Table].[HTS 8], [Master HTS Table].[HTS 9], [Master HTS Table].[HTS 10], " _
& "[Master HTS Table].[Canada HTS 1], [Master Shared Compliance Review].[SCR ID] " _
& "FROM (([PO Master Data Table] LEFT JOIN [Master HTS Table] ON [PO Master Data Table].[Vendor Style] = [Master HTS Table].[Vendor Style]) " _
& "LEFT JOIN [Master Shared Compliance Review] ON ([PO Master Data Table].UPC = [Master Shared Compliance Review].UPC) AND ([PO Master Data Table].[PO Nbr] = [Master Shared Compliance Review].[PO Number])) " _
& "LEFT JOIN [Vendor Table] ON [PO Master Data Table].[Vendor Style] = [Vendor Table].[Vend Style] " _
& "WHERE [PO Nbr] = '" & Me.txtSearch & "'"
OpenMyRecordset rstRSCH, strSQL
With rstRSCH
If .RecordCount = 0 Then
Answer = MsgBox("The record you are searching for does not exist. Please verify you have typed it in correctly! Do you need to create an SCR Record?", vbYesNo + vbQuestion, " ERROR!")
If Answer = vbYes Then
DoCmd.OpenForm "Manual SCR Entry - Record Search"
Exit Sub
End If
If Answer = vbNo Then
Me.Refresh
Exit Sub
End If
Else
.MoveNext
.MovePrevious
Me.txtPO.Value = rstRSCH("PO Nbr")
Me.txtUPC.Value = rstRSCH("UPC")
Me.txtItemDesc.Value = rstRSCH("Item Description")
Me.txtStyleNbr.Value = rstRSCH("Vendor Style")
Me.txtSuppNM.Value = rstRSCH("Supplier Name")
Me.txtMFGNM.Value = rstRSCH("Manufacturer Name")
Me.txtMFGAdd.Value = rstRSCH("Manufacturer Address")
Me.txtHTSDESC.Value = rstRSCH("HTS Description")
Me.txtSCRID.Value = rstRSCH("SCR ID")
Me.txtQTY.Value = rstRSCH("Order Qty")
Me.txtCost.Value = rstRSCH("Cost")
Me.txtAssist.Value = rstRSCH("ASSIST $ AMOUNT")
Me.txtCOO.Value = rstRSCH("COO")
Me.txtHTS1.Value = rstRSCH("HTS 1")
Me.txtHTS2.Value = rstRSCH("HTS 2")
Me.txtHTS3.Value = rstRSCH("HTS 3")
Me.txtHTS4.Value = rstRSCH("HTS 4")
Me.txtHTS5.Value = rstRSCH("HTS 5")
Me.txtHTS6.Value = rstRSCH("HTS 6")
Me.txtHTS7.Value = rstRSCH("HTS 7")
Me.txtHTS8.Value = rstRSCH("HTS 8")
Me.txtHTS9.Value = rstRSCH("HTS 9")
Me.txtHTS10.Value = rstRSCH("HTS 10")
Me.txtCANHTS.Value = rstRSCH("Canada HTS 1")
End If
End With
End If
Set rstRSCH = nothing`enter code here`
这是我需要帮助的地方。上面的效果很好,它使用 ADODB.connections 和 returns 结果。但是如果我搜索 PO XYZ 并且我知道它有两个 lines/records 与之关联;它只显示表格中记录 1 of 1。如何让记录选择器分别显示 1 of 2 或 2 of 2?
我开始沿着 .movenext、.moveprevious 方法的道路前进,但后来我感到困惑。任何帮助将不胜感激。
上面的代码被严重简化了,只是为了说明这个想法。它确实调用了一个名为 OpenMyRecordset 的函数,因此大部分连接信息都在其中。
您可以使用 .MoveLast
完全初始化记录集,然后 .MoveFirst
只要它包含记录:
If .RecordCount = 0 Then
Answer = Msgbox("string",vbokonly,"title")
Else
.MoveLast
.MoveFirst
End If
请注意,在大型记录集上,这可能会降低您的性能。