Domanda

Sto creando 2 report in un foglio usando Excel Macro. I report si connettono a Oracle DB per estrarre i dati. Ho la stringa di connessione che tira i dati e funziona bene. Quello che sto cercando di fare è spostare la stringa di connessione in una funzione e passarla alla rispettiva report in base all'ingresso dell'utente. Ecco un flusso di alto livello: 1. L'utente fa clic su un pulsante di menu. Sullo sfondo cerca di connettersi al DB. 2. Se la connessione ha esito positivo, apre un modulo con 2 pulsanti (che segnala l'utente desidera eseguire). Pulsante A e pulsante B 3. Supponiamo che l'utente fa clic sul pulsante A il report deve essere eseguito e visualizzato.

Il problema che sto affrontando è al punto 2. Per qualche motivo non sono in grado di passare i parametri di connessione al pulsante una funzione.

Di seguito è riportato lo snippet del codice su come sto cercando di connettersi al DB. Hai bisogno di aiuto su come passare i parametri di connessione al pulsante una funzione.

Codice per il collegamento a 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
.

Nel modulo del generatore del report che passa i parametri della data nella funzione

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

Devo passare i parametri di connessione alla funzione CallReportGenerator.

Qualsiasi puntatori sarà utile.

È stato utile?

Soluzione

Ci sono molteplici è possibile fare questo:

Opzione 1: Utilizzare una variabile globale

Se dichiari una variabile come Global nella parte superiore di un modulo, I.e. Prima di qualsiasi sottosuolo / funzioni, è possibile accedervi da qualsiasi altro modulo:

Esempio - Modulo1:

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
.

Modulo:

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

Opzione 2: passare la variabile a una variabile di forma locale

Dichiarare una variabile ampia del modulo nel modulo del modulo (cioè dove si posiziona l'altro codice del modulo).Quindi fornire un piccolo Setter Sub che assegna il valore.

Esempio - Modulo1:

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
.

Modulo:

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
.

Altri suggerimenti

Dichiarare la connessione e il recordset nella parte superiore del modulo standard, al di fuori di eventuali procedure e impostare i loro accessori al pubblico.

Ricordati di ripulire le risorse dopo che hai finito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top