मैंने एक्सेस डेटाबेस के साथ बातचीत करने के लिए एक एक्सेल इंटरफ़ेस बनाया है। लक्ष्य यह है कि एकाधिक लोग एक्सेल इंटरफ़ेस को केवल पढ़ने के लिए मोड में खोल सकते हैं लेकिन फिर भी ActiveX नियंत्रणों का उपयोग करके एक ही समय में डीबी पर कार्य कर सकते हैं।

मेरे पास 3 उपयोगकर्ताफॉर्म दिखाने वाले 3 बटन हैं: एक "प्रविष्टि डालें" के लिए, एक "प्रविष्टि हटाएं" के लिए और एक "प्रविष्टि संशोधित करें" के लिए। उन उपयोगकर्ता रूपों में, हम क्रमशः एक नई प्रविष्टि के लिए मान दर्ज कर सकते हैं जिसे वीबीए कोड द्वारा वैधता के लिए जांचा जाता है, एक पंक्ति को हटाने की पुष्टि करें या तालिका के डिस्प्ले पर उपयोगकर्ता द्वारा चयनित प्रविष्टि के मूल्यों को संशोधित करें। डेटा इनपुट + पुष्टिकरण के बाद, एक्सेस डीबी के साथ एक एडीओ कनेक्शन खोला जाता है और एक एसक्यूएल क्वेरी निष्पादित की जाती है।

उदाहरण के तौर पर, "हटाएं" उपयोगकर्ताफॉर्म के लिए कोड यहां दिया गया है, अन्य उसी मॉडल पर बनाए गए हैं।

Private Sub CommandButton1_Click()

    Dim lineArr() As Variant
    
    lineArr = returnSelectedLine
    
    Call doSqlInsert(CStr(lineArr(1)))
    Unload Me
        
End Sub

Private Sub CommandButton2_Click()
    Unload Me
End Sub


Private Sub UserForm_Terminate()
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End Sub


Private Sub UserForm_Activate()
    Dim lineArr() As Variant
    
    lineArr = returnSelectedLine
    
    Me.Label8.Caption = "Are you sure you want to delete the article number " & lineArr(1) & " ? This action is irreversible."

End Sub


Sub doSqlInsert(art As String)

    Dim cn As Object
    Dim strFile As String
    Dim strCon As String
    Dim quer As String

    
    
    strFile = ThisWorkbook.Path + "\etwDb.accdb"
        
    strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile
        
    Set cn = CreateObject("ADODB.Connection")
    cn.Open strCon
    
    quer = "DELETE FROM Dvpt WHERE [Article] = " & art & ";"
    
    cn.Execute quer

    cn.Close
    
    Set cn = Nothing
    
End Sub

Function returnSelectedLine()

    Dim rw As Integer
    Dim res(0 To 7) As Variant
    Dim i As Integer
    
    
    
    rw = ActiveCell.Row
    
    With ThisWorkbook.Worksheets("Liste dvpt")
        For i = 0 To 7
            res(i) = .Cells(rw, i + 2)
        Next i
    End With
    
    returnSelectedLine = res
End Function

यह अच्छी तरह से काम करता है और डेटाबेस पर डेटा को सही ढंग से प्रभावित करता है। हालांकि, यह डेटाबेस एक क्वेरीटेबल ऑब्जेक्ट (कनेक्शन रीड मोड में है) का उपयोग करके एक्सेल फ़ाइल पर भी प्रदर्शित होता है, जिसे मैं प्रत्येक उपयोगकर्ताफॉर्म की समाप्ति पर रीफ्रेश करने का प्रयास करता हूं (देखें Private Sub UserForm_Terminate), लेकिन यह लगातार काम नहीं करता है . कभी-कभी, परिवर्तन प्रदर्शित करने के लिए मुझे एक या दो और क्रियाएं (या एक या दो बार ताज़ा करें) करने की आवश्यकता होती है, और कभी-कभी यह तुरंत दिखाई देती है।

संकेत: शीट को प्रोग्राम किया गया है ताकि केवल एक अद्वितीय सेल का चयन किया जा सके, और केवल क्वेरीटेबल क्षेत्र में। चयन तालिका में वापस चला जाता है यदि उपयोगकर्ता इसके बाहर कुछ चुनने का प्रयास करता है, तो मैं अस्पष्टता के बिना Selection.ListObject.QueryTable.Refresh का उपयोग कर सकता हूं।

क्या एडीओ कनेक्शन निष्पादन का समय है? क्या मैं अपनी क्वेरीटेबल को गलत तरीके से रीफ्रेश करता हूं? इस देरी का क्या कारण है?

आपकी सहायता के लिए धन्यवाद

0
MirageHF 13 अगस्त 2021, 10:04

2 जवाब

सबसे बढ़िया उत्तर

कुछ परीक्षण चलाए जाने के बाद, ऐसा लगता है कि विलंबता OLE कनेक्शन से आती है, या मेरी कंपनी के नेटवर्क प्रदर्शन से आती है। पहले मामले में, शायद इसे बैक एंड और/या फ्रंट एंड टेक्नोलॉजी (एक्सेस/एक्सेल से ओरेकल डीबी में हार्डकोडेड सी # फ्रंट एंड के साथ स्विचिंग) को बदलकर हल किया जा सकता है, और दूसरे मामले में कुछ भी नहीं किया जा सकता है।

नाथन_साव को मदद के लिए धन्यवाद!

0
MirageHF 2 सितंबर 2021, 09:24

उत्तर नहीं, बल्कि एक विचार, टिप्पणी के लिए बहुत बड़ा है। आप कनेक्शन की घटनाओं का उपयोग कर सकते हैं, इसलिए एक वर्ग बनाएं clsCustomConnection. इस तरह

 Private WithEvents cn As ADODB.Connection

Public Sub Initialise(strConnectionString As String)
    Set cn = New ADODB.Connection
    cn.ConnectionString = strConnectionString
    cn.Open
End Sub

Public Sub Execute(strSQL As String)
    cn.Execute strSQL
End Sub

Private Sub cn_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, _
    adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
    '   Refresh any query tables of interest, based on the Error/Status
End Sub

फिर मॉड्यूल में ऐसा कुछ होता है:

Sub Testing()

Dim cnCustom As clsCustomConnection
Dim strConnectionString As String
Dim strSQL As String

Set cnCustom = New clsCustomConnection

cnCustom.Initialise strConnectionString
cnCustom.Execute strSQL

End Sub

यह कनेक्शन की घटनाओं का उपयोग करके, इसकी सफलता/असफलता के बाकी कोड को बताने के लिए कनेक्शन का उपयोग करेगा।

0
Nathan_Sav 13 अगस्त 2021, 08:18