Pergunta

Estou criando 2 relatórios em uma planilha usando macro do Excel.Os relatórios se conectam ao banco de dados Oracle para extrair os dados.Eu tenho a string de conexão que extrai os dados e funciona bem.O que estou tentando fazer é mover a string de conexão para uma função e passá-la para o respectivo relatório com base na entrada do usuário.Aqui está um fluxo de alto nível:1.O usuário clica em um botão de menu.Em segundo plano, ele tenta se conectar ao banco de dados.2.Se a conexão for bem-sucedida ele abre um formulário com 2 botões (que reporta o usuário deseja executar).Botão A e Botão B 3.Suponha que o usuário clique no botão A, o relatório deve ser executado e exibido.

O problema que estou enfrentando está na etapa 2.Por algum motivo não consigo passar os parâmetros de conexão para a função do Botão A.

Abaixo está o trecho do código de como estou tentando me conectar ao dB.preciso de ajuda sobre como passar parâmetros de conexão para a função do botão A.

Código para conectar ao banco de dados

       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

No formulário gerador de relatórios passando os parâmetros de data para a função

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

Preciso passar os parâmetros de conexão para a função CallReportGenerator.

Qualquer indicação será útil.

Foi útil?

Solução

Existem vários onde você pode fazer isso:

Opção 1:Use uma variável global

Se você declarar uma variável como Global no topo de um módulo, ou seja,antes de qualquer subs/função, você pode acessá-las de qualquer outro módulo:

Exemplo - Módulo1:

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

Forma:

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

Opção 2:Passe a variável para uma variável de formulário local

Declare uma variável que abrange todo o módulo no módulo do Form (ou seja,onde você coloca o outro código do formulário).Em seguida, forneça um pequeno sub setter que atribua o valor.

Exemplo - Módulo1:

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

Forma:

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

Outras dicas

Declare a conexão e o conjunto de registros na parte superior do módulo padrão, fora de qualquer procedimento e defina seus acessadores como públicos.

Lembre-se de limpar os recursos depois de terminar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top