Как добавить Next и Previous в форму доступа с помощью ADODB - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть маленькая просьба, я сделал столько исследований, сколько смог, и достиг того, что я хочу сделать. Вот мой код:

Вот код модуля:

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 и возвращает результаты. Но если я ищу PO XYZ и знаю, что с ним связаны две строки / записи; это только показывает мне запись 1 из 1 в форме. Как заставить селекторы записи показывать 1 из 2 или 2 из 2 соответственно?

Я начал идти по пути .movenext, .moveprevious, методы, но затем я запутался. Любая помощь будет принята с благодарностью.

Вышеприведенный код сильно упрощен, чтобы просто донести идею до дома. Он вызывает функцию с именем OpenMyRecordset, поэтому основная часть информации о подключении находится там.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете полностью инициализировать набор записей, используя .MoveLast, а затем .MoveFirst, если он содержит записи:

If .RecordCount = 0 Then
    Answer = Msgbox("string",vbokonly,"title")
Else
    .MoveLast
    .MoveFirst
End If

Обратите внимание, что на больших наборах записей это может стоить вам некоторой производительности.

...