MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    Recordset Virtual

    Compartilhe

    Ednardo
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 24
    Registrado : 20/11/2015

    Recordset Virtual

    Mensagem  Ednardo em 3/12/2018, 15:29

    Bom Dia,

    Preciso saber se existe uma forma de incluir dentro de uma instrução SQL um RecordSet aberto na memória, pois tenho um sistema que utiliza múltiplos bancos de dados e no modo ACCDE não é possivel criar tabelas temporária de forma física, por exemplo, de acordo com o ambiente que o usuário está não posso ter tabelas vinculadas pois os dados virão do banco de dados do ambiente selecionado, cada filial tem o seu, a tabela Permissões vinculada ao servidor 192.168.0.2, quando mudar o ambiente ela estará vinculada ao servidor 192.168.10.3 não posso vincular uma nova tabela pois o modo ACCDE não permite, e não posso deixar várias tabelas vinculadas aos servidores tipo, Permissões_Serv1, Permissões_Serv2, Permissões_Serv3, porque se incluir um novo servidor tenho que vincular uma nova tabela e criar um novo ACCDE, e isso tem que ser feito automaticamente, resolveria meu problema se pudesse fazer a seguinte situação.
    Código:

    Dim DB1 as DAO.Database
    Dim DB2 as DAO.Database
    Dim RSvirtual1 as DAO.Recordset
    Dim RSvirtual2 as DAO.Recordset

    Set DB1 = DBEngine.Workspaces(0).OpenDatabase("Caminho Servidor 1", False, False, "MS Access;PWD=" & Me.Senha)
    Set RSvirtual1 = DB1.Openrecordset("SELECT * FROM Permissoes")

    Set DB2 = DBEngine.Workspaces(0).OpenDatabase("Caminho Servidor 2", False, False, "MS Access;PWD=" & Me.Senha)
    Set RSvirtual2 = DB2.Openrecordset("SELECT * FROM Permissoes")

    Até aí tudo bem, precisaria usar estas tabelas para criar um novo recordset, como se elas fossem tabelas físicas, tipo...

    Código:

    Dim RS as Recordset
    Set RS = Docmd.RunSQL("SELECT A.NomePermissao, B.NomePermissao FROM @RSvirtual1 AS A, @RSvirtual2 AS B")

    E assim eu teria um terceiro recordset com um Select de 2 recordsets já existentes, mais não fisicamente, virtualmente, depois que extraísse as informações necessárias daria um Close em todos os recordsets esvaziando assim a memória...
    avatar
    thiagomcosta
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 332
    Registrado : 23/01/2017

    Re: Recordset Virtual

    Mensagem  thiagomcosta em 3/12/2018, 17:36

    Semana passada usei algo parecido com o que você precisa. Eu carrego informações de um banco de dados em SQL Server e jogo uma cópia na memória para filtrar e exibir.
    Segue o código abaixo.

    Código:
       Set rsTempHomenagens = New ADODB.Recordset
        Set streamHomenagens = New ADODB.Stream
        SQLHomenagens = "SELECT * FROM Homenagem WHERE idTurma=" & IDWeb
        rsTempHomenagens.Open SQLHomenagens, cn, adOpenStatic 'cn aqui é a conexão com o banco de dados
        rsTempHomenagens.Save streamHomenagens
        rsTempHomenagens.Close
        Set rsTempHomenagens = Nothing
        Set rsHomenagens = New ADODB.Recordset
        rsHomenagens.Open streamHomenagens

    No restante do código eu trabalho somente com o Recordset rsHomenagens em memória.
    Usei isso para diminuir o tempo de consulta.

    Não esqueça de fechar tudo ao final:
    Código:
        rsHomenagens.Close
        Set rsHomenagens = Nothing
        streamHomenagens.Close
        Set streamHomenagens = Nothing

    Ednardo
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 24
    Registrado : 20/11/2015

    Re: Recordset Virtual

    Mensagem  Ednardo em 3/12/2018, 18:16

    Sim, perfeito, agora o que eu preciso fazer é o seguinte...
    Código:

    Dim RS as Recordset
    Set RS = Currentdb.Openrecordset("SELECT NomeAluno FROM tb_Matriculas WHERE idTurma IN (SELECT idTurma FROM rsHomenagens)")

    Preciso saber como usar essa tabela que está somente em momória dentro de uma instrução SQL, Seja em um SELECT, seja em uma cláusula WHERE, Seja em um INNER JOIN, ou um UNION, criando uma novo Recordset na memória, com acessar ela como se fosse uma tabela física, vi algo parecido uma vês, mas não consigo mais achar, a objeto recordset era referenciado com um @ antes, tipo @rsHomenagens, as conexões eram do SQLServer de fato que é o que preciso, mais não consigo mais achar o artigo!

      Data/hora atual: 16/12/2018, 11:24