Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

Solusi Alternatif untuk DCount dan DLookup dengan MS SQL Server Backend

Solusi Alternatif untuk DCount dan DLookup dengan MS SQL Server Backend

Salah satu masalah utama yang kami temui dengan Access adalah penggunaan DLookup dan DCount saat menggunakan tabel SQL Server. Kami baru-baru ini bekerja untuk memigrasikan solusi Access murni ke server SQL dan mengalami penundaan saat memuat beberapa formulir. Ini karena penggunaan DLookup dan DCount dalam kode VBA.

Kami kemudian menemukan solusi untuk menyelesaikan beberapa instance dengan cepat dengan beberapa fungsi. Kami dipandu oleh solusi lain yang disediakan oleh Allen Browne yang merancang Extended DLookup di tautan ini.

Solusi Allen meningkatkan kinerja DLookup dengan:

  • Termasuk pengurutan untuk memastikan Anda mendapatkan hasil yang Anda butuhkan.
  • Membersihkan sendiri.
  • Membedakan string Null dan string panjang nol dengan benar.
  • Peningkatan kinerja secara keseluruhan.

Kami sekarang telah mengambil satu langkah lebih jauh untuk bekerja secara khusus dengan tabel atau tampilan SQL, ini tidak akan berfungsi dengan tabel lokal Access karena kami secara khusus menggunakan koneksi ADO.

Saya menyertakan kode untuk kedua fungsi untuk menggantikan DLookup dan DCount

Public Function ESQLLookup(strField As String, strTable As String, Optional Criteria As Variant, _
    Optional OrderClause As Variant) As Variant
 
    Dim rs As ADODB.Recordset         'To retrieve the value to find.
    Dim rsMVF As ADODB.Recordset      'Child recordset to use for multi-value fields.
    Dim varResult As Variant        'Return value for function.
    Dim strSQL As String            'SQL statement.
    Dim strOut As String            'Output string to build up (multi-value field.)
    Dim lngLen As Long              'Length of string.
    Const strcSep = ","             'Separator between items in multi-value list.

    'Initialize to null.
    varResult = Null

    'Encapsulate Domain in brackets if none exist to allow special characters in the Domain string
    If Left$(strTable, 1) <> "[" Then
        strTable = "[" & strTable & "]"
    End If

    'Build the SQL string.
    strSQL = "SELECT TOP 1 " & strField & " FROM " & strTable
    If Not IsMissing(Criteria) Then
        strSQL = strSQL & " WHERE " & Criteria
    End If
    If Not IsMissing(OrderClause) Then
        strSQL = strSQL & " ORDER BY " & OrderClause
    End If
    strSQL = strSQL & ";"

    'Lookup the value.
    OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
    If rs.RecordCount > 0 Then
        'Will be an object if multi-value field.
        If VarType(rs(0)) = vbObject Then
            Set rsMVF = rs(0).Value
            Do While Not rsMVF.EOF
                If rs(0).Type = 101 Then        'dbAttachment
                    strOut = strOut & rsMVF!FileName & strcSep
                Else
                    strOut = strOut & rsMVF![Value].Value & strcSep
                End If
                rsMVF.MoveNext
            Loop
            'Remove trailing separator.
            lngLen = Len(strOut) - Len(strcSep)
            If lngLen > 0& Then
                varResult = Left(strOut, lngLen)
            End If
            Set rsMVF = Nothing
        Else
            'Not a multi-value field: just return the value.
            varResult = rs(0)
        End If
    End If
    rs.Close

    'Assign the return value.
    ESQLLookup = varResult
   
ErrEx.Catch 11 ' Division by Zero
    Debug.Print strSQL
    MsgBox "To troubleshoot this error, please evaluate the data that is being processed by:" _
            & vbCrLf & vbCrLf & strSQL, vbCritical, "Division by Zero Error"

ErrEx.CatchAll
    MsgBox "Error " & err.Number & ": " & err.Description, vbCritical, "Unexpected error"
    
ErrEx.Finally
    Set rs = Nothing

End Function


Public Function ESQLCount(strField As String, strTable As String, Optional Criteria As Variant) As Variant
    Dim rs As ADODB.Recordset         'To retrieve the value to find.
    Dim varResult As Variant        'Return value for function.
    Dim strSQL As String            'SQL statement.
    Dim lngLen As Long              'Length of string.

    'Initialize to null.
    varResult = Null

    'Encapsulate Domain in brackets if none exist to allow special characters in the Domain string
    If Left$(strTable, 1) <> "[" Then
        strTable = "[" & strTable & "]"
    End If

    'Build the SQL string.
    strSQL = "SELECT COUNT(" & strField & ") AS TotalCount FROM " & strTable
    If Not IsMissing(Criteria) Then
        strSQL = strSQL & " WHERE " & Criteria
    End If
    strSQL = strSQL & ";"

    'Lookup the value.
    OpenMyRecordset rs, strSQL, rrOpenForwardOnly, rrLockReadOnly, True
    
    varResult = Nz(rs.Fields("TotalCount"), 0)
    rs.Close

    'Assign the return value.
    ESQLCount = varResult
    
   
ErrEx.CatchAll
    MsgBox "Error " & err.Number & ": " & err.Description, vbCritical, "Unexpected error"
    Resume Next
    
ErrEx.Finally
    Set rs = Nothing

End Function

Jika Anda memiliki instance yang memerlukan penggunaan Dsum maka Anda dapat dengan mudah menyesuaikan fungsi DCount untuk memberikan hasil yang diperlukan.

Setelah menerapkan solusi ini, kami menemukan peningkatan dramatis dalam kinerja pemuatan formulir dan desain membantu kami menerapkan solusi ini ke banyak proyek. Saya harap solusi ini bermanfaat bagi Anda dan jika Anda memiliki masalah lain yang dapat kami bantu, silakan hubungi kami di accessexperts.com.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu Basis Data Sharding?

  2. Di mana Mengunduh Kit Runtime untuk Microsoft Access 2016

  3. Bagaimana Access berbicara dengan sumber data ODBC? Bagian 3

  4. Bergabunglah dengan kami untuk Microsoft Access dengan SQL Server Academy Bagian II

  5. Bagaimana Access berbicara dengan sumber data ODBC? Bagian 6