locked
Acessar um RecordSet (tipo Consulta) RRS feed

  • Pergunta

  • Segue abaixo meu codigo,  que está dando certo somente se o recordset form uma tabela, mas os dados que preciso vem de uma consulta, ai da o erro 91 indicando que a tabela não existe.

    Abraços

     

    Dim BancoDB As Database
    Dim Tabela As Recordset
    Dim Texto As Variant
    Dim AsNull As String

    ---------------------------------------------------------------
    Private Sub Comando0_Click()
     AsNull = SetarTabelas():
     Tabela.MoveFirst
     Do Until Tabela.EOF
        Texto = Texto & "/" & Tabela!Contrato
    Loop
    Comando0.Caption = Texto
    End Sub

    ---------------------------------------------------------------

    Private Function SetarTabelas()
    On Error GoTo Err:
      Dim AsTab As String
      AsTab = "Tributos"   (aqui quero indicar que o tributo e uma consulta e nao uma tabela )
      Set BancoDB = DBEngine.Workspaces(0).Databases(0)
      Set Tabela = BancoDB.OpenRecordset(AsTab)
    Err:
      If Err = 3021 Then
         AsNull = MsgBox("Banco de dados para a tabela " & AsTab & " não localizado", vbOKOnly, "Aviso do Sistema")
         Exit Function
      End If
      MsgBox Err & " - " & Err.Description
    End Function

    segunda-feira, 18 de dezembro de 2006 13:04

Respostas

  • Tente utilizar a expressão: "Select * From Tributos". Se não estou enganado, somente tabelas podem ser acessadas diretamente sem uma instrução SQL.

     

    segunda-feira, 18 de dezembro de 2006 15:35
  • Com base na dica do Mauricio Pontalti Neri pesquisei no help do proprio access. e resolvi da sequinte forma:

    Seque abaixo o codigo caso alguem precise, esta toda a rotina na integra inclusive o comando sql inteiro da consulta

    basicamente tudo se resume no metodo setartabelas

     

    Option Compare Database
    Option Explicit

    Dim Texto As Variant
    Dim AsNull As String
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim Banco As ADODB.Recordset

    Private Sub CabeçalhoDoGrupo2_Print(Cancel As Integer, PrintCount As Integer)
    Dim i As Integer
    i = 0
    On Error GoTo Err:
      AsNull = SetarTabelas():
      rs.MoveFirst
      Do Until rs.EOF
        If i = 0 Then
          Texto = rs!Contrato
        Else
          Texto = Texto & " - " & rs!Contrato
        End If
        i = i + 1
        rs.MoveNext
      Loop
      txtContrato = Texto
      cnn.Close
      Exit Sub
    Err:
       MsgBox Err & " - " & Err.Description
    End Sub

    Private Function SetarTabelas()
      On Error GoTo Err:
         Dim Str As String
         Str = Servidor()
         Set cnn = New ADODB.Connection
         cnn.ConnectionString = "Provider = Microsoft.jet.OLEDB.4.0; Data Source = " & Str
         cnn.Open
         Set rs = New ADODB.Recordset
         rs.CursorLocation = adUseClient
         Str = "SELECT * FROM CLIENTE"
         Str = Str & " HAVING [Registro de aquisiçao].[codigo regaq]= " + Me.[codigo]
         rs.Open Str, cnn, adOpenDynamic
         Exit Function
       Err:
          MsgBox Err & " - " & Err.Description
    End Function

     

    terça-feira, 19 de dezembro de 2006 10:47
  • Oi Ailton,

     

    você não precisa converter para ADO se não quiser.

    Com DAO, você deve ter dois cuidados:

    1) (o mais importante) Coloque o prefixo:

    Dim db As DAO.Database

    Dim rst As DAO.Recordset

     

    2) Coloque o tipo de objeto que quer abrir:

    Set rst = db.OpenRecordset ("SELECT * FROM TuaTabela", dbOpenDynaset)

    ou

    Set rst = db.OpenRecordset ("TuaTabela", dbOpenTable)

    quinta-feira, 21 de dezembro de 2006 22:34
    Moderador

Todas as Respostas

  • Tente utilizar a expressão: "Select * From Tributos". Se não estou enganado, somente tabelas podem ser acessadas diretamente sem uma instrução SQL.

     

    segunda-feira, 18 de dezembro de 2006 15:35
  • Com base na dica do Mauricio Pontalti Neri pesquisei no help do proprio access. e resolvi da sequinte forma:

    Seque abaixo o codigo caso alguem precise, esta toda a rotina na integra inclusive o comando sql inteiro da consulta

    basicamente tudo se resume no metodo setartabelas

     

    Option Compare Database
    Option Explicit

    Dim Texto As Variant
    Dim AsNull As String
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim Banco As ADODB.Recordset

    Private Sub CabeçalhoDoGrupo2_Print(Cancel As Integer, PrintCount As Integer)
    Dim i As Integer
    i = 0
    On Error GoTo Err:
      AsNull = SetarTabelas():
      rs.MoveFirst
      Do Until rs.EOF
        If i = 0 Then
          Texto = rs!Contrato
        Else
          Texto = Texto & " - " & rs!Contrato
        End If
        i = i + 1
        rs.MoveNext
      Loop
      txtContrato = Texto
      cnn.Close
      Exit Sub
    Err:
       MsgBox Err & " - " & Err.Description
    End Sub

    Private Function SetarTabelas()
      On Error GoTo Err:
         Dim Str As String
         Str = Servidor()
         Set cnn = New ADODB.Connection
         cnn.ConnectionString = "Provider = Microsoft.jet.OLEDB.4.0; Data Source = " & Str
         cnn.Open
         Set rs = New ADODB.Recordset
         rs.CursorLocation = adUseClient
         Str = "SELECT * FROM CLIENTE"
         Str = Str & " HAVING [Registro de aquisiçao].[codigo regaq]= " + Me.[codigo]
         rs.Open Str, cnn, adOpenDynamic
         Exit Function
       Err:
          MsgBox Err & " - " & Err.Description
    End Function

     

    terça-feira, 19 de dezembro de 2006 10:47
  • Oi Ailton,

     

    você não precisa converter para ADO se não quiser.

    Com DAO, você deve ter dois cuidados:

    1) (o mais importante) Coloque o prefixo:

    Dim db As DAO.Database

    Dim rst As DAO.Recordset

     

    2) Coloque o tipo de objeto que quer abrir:

    Set rst = db.OpenRecordset ("SELECT * FROM TuaTabela", dbOpenDynaset)

    ou

    Set rst = db.OpenRecordset ("TuaTabela", dbOpenTable)

    quinta-feira, 21 de dezembro de 2006 22:34
    Moderador