Frage

Ich erstelle zwei Berichte in einem Blatt mit einem Excel-Makro.Die Berichte stellen eine Verbindung zu Oracle DB her, um die Daten abzurufen.Ich habe die Verbindungszeichenfolge, die die Daten abruft, und sie funktioniert einwandfrei.Ich versuche, die Verbindungszeichenfolge in eine Funktion zu verschieben und sie basierend auf Benutzereingaben an den entsprechenden Bericht zu übergeben.Hier ist ein High-Level-Flow:1.Der Benutzer klickt auf eine Menüschaltfläche.Im Hintergrund wird versucht, eine Verbindung zur DB herzustellen.2.Wenn die Verbindung erfolgreich ist, wird ein Formular mit zwei Schaltflächen geöffnet (welche Berichte der Benutzer ausführen möchte).Taste A und Taste B 3.Angenommen, der Benutzer klickt auf die Schaltfläche A, dann soll der Bericht ausgeführt und angezeigt werden.

Das Problem, mit dem ich konfrontiert bin, ist in Schritt 2.Aus irgendeinem Grund kann ich die Verbindungsparameter nicht an die Funktion „Button A“ übergeben.

Unten ist der Ausschnitt des Codes, der zeigt, wie ich versuche, eine Verbindung zum dB herzustellen.Ich benötige Hilfe bei der Übergabe von Verbindungsparametern an die Funktion „Button A“.

Code für die Verbindung zur DB

       Dim dbConnect As ADODB.Connection
       Dim GetData As ADODB.Recordset

       'Declare a set of variables to hold the username and password for the database
       Dim strUserName As String
       Dim strPassword As String
       Dim strDatabase As String
       Set GetData = New ADODB.Recordset
      '***

   On Error Resume Next


      Set dbConnect = New ADODB.Connection

      dbConnect.Open ( _
    "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")

      'If the username or password is incorrect throw an error message
      If (dbConnect.State <> 1) Or (Err <> 0) Then
       intResult = MsgBox("Could not connect to the database.  Check your user name and password." & vbCrLf & Error(Err), 16, " ")
    Else
      '.ConnectionString = dbConnect
      ReportGenerator.Show ' this opens up another form where 
                           '  user can input the dates.
                           'This is turn calls the actual code...
      End If

      End Sub

Im Berichtsgeneratorformular werden die Datumsparameter an die Funktion übergeben

Private Sub Login_Click()
    Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub

Ich muss die Verbindungsparameter an die CallReportGenerator-Funktion übergeben.

Alle Hinweise werden hilfreich sein.

War es hilfreich?

Lösung

Es gibt mehrere Möglichkeiten, wie Sie dies tun können:

Option 1:Verwenden Sie eine globale Variable

Wenn Sie eine Variable als deklarieren Global auf der Oberseite eines Moduls, d.h.vor allen Unter-/Funktionen können Sie von jedem anderen Modul aus darauf zugreifen:

Beispiel – Modul1:

Option Explicit

Global gStrConnection As String 'g for Global scope

Sub Connect()
    gStrConnection = "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")    
   dbConnect.Open gStrConnection
   ...
End Sub

Bilden:

Private Sub CreateReport()
    dbConnect.Open gStrConnection
    ...
End Sub

Option 2:Übergeben Sie die Variable an eine lokale Formularvariable

Deklarieren Sie eine modulweite Variable im Modul des Formulars (d. h.wo Sie den anderen Code des Formulars platzieren).Stellen Sie dann einen kleinen Setter-Sub bereit, der den Wert zuweist.

Beispiel – Modul1:

Option Explicit

Sub Connect()
    Dim strConnection as String
    strConnection = "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")    
   dbConnect.Open strConnection
   ...
    ReportGenerator.StoreConnectionString strConnection
    ReportGenerator.Show
    ...
End Sub

Bilden:

Private mStrConnection as String 'm for module-wide scope

Public Sub StoreConnectionString(strConnection as String)
    mStrConnection = strconnection
End Sub

Private Sub CreateReport()
    dbConnect.Open mStrConnection
    ...
    ...
End Sub

Andere Tipps

Deklarieren Sie die Verbindung und das Recordset an der Oberseite des Standardmoduls außerhalb aller Prozeduren und stellen Sie ihre Accessors in die Öffentlichkeit ein.

Denken Sie daran, Ressourcen zu bereinigen, nachdem Sie fertig sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top