MS SQL सर्वर बैकएंड के साथ DCount और DLookup का वैकल्पिक समाधान
एक्सेस के साथ हमारे सामने आने वाली प्रमुख समस्याओं में से एक SQL सर्वर तालिकाओं का उपयोग करते समय DLookup और DCount का उपयोग है। हमने हाल ही में एक शुद्ध एक्सेस समाधान को SQL सर्वर पर माइग्रेट करने पर काम किया और कई रूपों के लोड होने में देरी का सामना करना पड़ा। यह VBA कोड में DLookup और DCount के उपयोग के कारण था।
फिर हम कुछ कार्यों के साथ कई उदाहरणों को जल्दी से हल करने के लिए एक समाधान के साथ आए। हम एलन ब्राउन द्वारा प्रदान किए गए एक अन्य समाधान द्वारा निर्देशित थे जिन्होंने इस लिंक में यहां विस्तारित डीलुकअप को डिज़ाइन किया था।
एलन का समाधान निम्न द्वारा DLookup के प्रदर्शन में सुधार करता है:
- सॉर्ट ऑर्डर सहित यह सुनिश्चित करने के लिए कि आपको वांछित परिणाम मिले।
- अपने आप सफाई करना।
- शून्य और शून्य-लंबाई वाले स्ट्रिंग में सही अंतर करता है।
- प्रदर्शन में समग्र सुधार।
हमने विशेष रूप से SQL टेबल या व्यू के साथ काम करने के लिए इसे एक कदम आगे बढ़ाया है, ये एक्सेस लोकल टेबल के साथ काम नहीं करेंगे क्योंकि हम विशेष रूप से ADO कनेक्शन का उपयोग कर रहे हैं।
मैं DLookup और 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
यदि आपके पास एक उदाहरण है जिसके लिए DSum के उपयोग की आवश्यकता है तो आप आवश्यक परिणाम देने के लिए DCount फ़ंक्शन को आसानी से अनुकूलित कर सकते हैं।
इस समाधान को लागू करने के बाद हमने फ़ॉर्म लोडिंग के प्रदर्शन में एक नाटकीय सुधार पाया और डिज़ाइन हमें इस समाधान को कई परियोजनाओं में लागू करने में मदद करता है। मुझे आशा है कि यह समाधान आपके लिए मददगार होगा और यदि आपके पास कोई अन्य समस्या है जिसमें हम आपकी सहायता कर सकते हैं तो कृपया accessexperts.com पर हमसे संपर्क करें।