MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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


    Importar registros de 3 tabelas relacionadas com seus respectivos registros relacionados

    avatar
    Convidado
    Convidado


    Importar registros de 3 tabelas relacionadas com seus respectivos registros relacionados Empty Importar registros de 3 tabelas relacionadas com seus respectivos registros relacionados

    Mensagem  Convidado 20/2/2013, 23:23

    Imagine a situação:

    3 Tabelas Relacionadas entre si, em uma relação um para muitos:
    Tabela_1 >>>> Tabela2 >>>>> Tabela3
    Para que possam entender Nomearei as tabelas de acordo co um pedido de Vendas:
    tblClientes >>>> tblPedidoClientes >>>> tblDetalhesPedido

    Imagine que deseja importar os registros de alguns clientes apenas e seus respectivos relacionados, este codigo importa os dados da tabela1 e vai sequencialmente importando os dados das tabelas relacionadas com apenas os registros relacionados com os dados da tabela1.


    Option Explicit

    Function ImportaTabelas()
    Dim RsDet As DAO.Recordset, RsRem As DAO.Recordset, RsRemDet As DAO.Recordset, RsImport As DAO.Recordset
    Dim ws As DAO.Workspace, db As DAO.Database
    Dim StrDet As String, StrRem As String, StrRemDet As String, StrWhere As String
    Dim NumCampos As Integer, Z As Integer
    Dim VarUnidade As String, VarReg As String
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    10 On Error GoTo TrataErro
    Dim NomeProcedimento As String
    20 NomeProcedimento = "ImportaTabelas"
    'Adiciona o nome do procedimento à função
    30 PegaProcedimento (NomeProcedimento)
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    40 Parametros_de_Inicializacao "SysApac.par" (Este comando deve ser descartato ele serve a uma função de desvinculo em meu sistema onde carrega os filtros e caminho do bd em um arquivo texto, a parte em azul é referente ao mesmo)

    50 VarUnidade = UnidadeOrigem
    60 VarReg = RegimeAtual


    70 Set ws = DBEngine.Workspaces(0)
    80 Set db = ws.OpenDatabase(DirBancoDados & "\SysApac_Be.db", False, False, "MS Access;PWD=senha")
    90 Set RsDet = db.OpenRecordset("SELECT * FROM Detentos WHERE UnidadeRequisitante='" & VarUnidade & "' and RegimeAtual='" & VarReg & "'")

    'Variável que receberá a SQL para as tabela detentosTMP
    100 StrDet = "SELECT * FROM DetentosTMP;"
    'Carrego o Recordset com a tabela local
    110 Set RsImport = CurrentDb.OpenRecordset(StrDet)

    '================================================================================================================================================
    'Procediment de importação da tabela Detentos
    '================================================================================================================================================
    120 RsDet.MoveFirst
    130 Do While Not RsDet.EOF

    '-----------------------------------------------------------------
    'Insere na tabela temporaria os dados da tabela no banco de dados
    '-----------------------------------------------------------------

    'Insiro na variável o número de campos da tabela detentos
    140 NumCampos = RsDet.Fields.Count
    'Abro o recordeset para inserir o novo registro
    150 RsImport.AddNew
    'Inicio o loop pelos campos
    160 For Z = 0 To (NumCampos - 1)
    170 RsImport.Fields(Z) = RsDet.Fields(Z)
    180 Next Z
    190 RsImport.Update
    'Carrego na variável o camo ID da tabela detentos para ser utilizada como filtro no recordset RsRem
    200 StrWhere = StrWhere & "," & RsDet(0)
    'Movo o RsImport para o proximo registro
    210 RsDet.MoveNext
    220 Loop
    'Limpo a variável
    230 StrWhere = Mid(StrWhere, 2)
    'Limpo o Recordset para utilizá-lo na importação da próxima tabela
    240 RsImport.Close
    250 Set RsImport = Nothing

    '================================================================================================================================================
    'Procedimento de importação da tabela tblRemissao
    '================================================================================================================================================
    'Carrego o recordset filtrado pelos registro constantes da tabela detentos no procedimento acima

    260 Set RsRem = db.OpenRecordset("SELECT * From tblRemissao WHERE ID_Detento In (" & StrWhere & ");")
    'Limpo a variável para receber novos valores, para utilizar como filtro na importação da terceira tabela (tblRemissaoDet)
    270 StrWhere = ""
    280 NumCampos = Empty
    'Variável que receberá a SQL para a tabela tblRemissao
    290 StrRem = "SELECT * FROM tblRemissaoTMP;"
    'Carrego o recordset com a tabela local
    300 Set RsImport = CurrentDb.OpenRecordset(StrRem)
    310 RsRem.MoveFirst
    320 Do While Not RsRem.EOF
    '-----------------------------------------------------------------
    'Insere na tabela temporaria os dados da tabela no banco de dados
    '-----------------------------------------------------------------

    'Insiro na variável o número de campos da tabela detentos
    330 NumCampos = RsRem.Fields.Count
    'Abro o recordeset para inserir o novo registro
    340 RsImport.AddNew
    'Inicio o loop pelos campos
    350 For Z = 0 To (NumCampos - 1)
    360 RsImport.Fields(Z) = RsRem.Fields(Z)
    370 Next Z
    380 RsImport.Update
    'Carrego na variável o camo ID da tabela detentos para ser utilizada como filtro no recordset RsRem
    390 StrWhere = StrWhere & "," & RsRem(0)
    'Movo o RsImport para o proximo registro

    400 RsRem.MoveNext
    410 Loop
    'Limpo a variável
    420 StrWhere = Mid(StrWhere, 2)
    'Limpo o Recordset para utilizá-lo na importação da próxima tabela
    430 RsImport.Close
    440 Set RsImport = Nothing

    '================================================================================================================================================
    'Procedimento de importação da tabela tblRemissao

    '================================================================================================================================================
    'Carrego o recordset filtrado pelos registro constantes da tabela detentos no procedimento acima

    450 Set RsRemDet = db.OpenRecordset("SELECT * From tblRemissaoDet WHERE Remissao_ID In (" & StrWhere & ");")
    460 StrWhere = ""
    470 NumCampos = Empty
    'Variável que receberá a SQL para a tabela tblRemissao
    480 StrRemDet = "SELECT * FROM tblRemissaoDetTMP;"
    'Carrego o recordset com a tabela local
    490 Set RsImport = CurrentDb.OpenRecordset(StrRemDet)
    500 RsRemDet.MoveFirst
    510 Do While Not RsRemDet.EOF
    '-----------------------------------------------------------------
    'Insere na tabela temporaria os dados da tabela no banco de dados
    '-----------------------------------------------------------------
    'Insiro na variável o número de campos da tabela detentos

    520 NumCampos = RsRemDet.Fields.Count
    'Abro o recordeset para inserir o novo registro
    530 RsImport.AddNew
    'Inicio o loop pelos campos
    540 For Z = 0 To (NumCampos - 1)
    550 RsImport.Fields(Z) = RsRemDet.Fields(Z)
    560 Next Z
    570 RsImport.Update
    'Movo o RsImport para o proximo registro
    580 RsRemDet.MoveNext
    590 Loop
    600 RsImport.Close
    610 Set RsImport = Nothing
    620 Exit Function
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    'Tratamento de Erros
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Exit_TrataErro:
    630 DoCmd.Hourglass False
    640 DoCmd.Echo True
    650 Exit Function
    TrataErro:
    660 Select Case err.Number
    Case 3022
    670 Resume Next
    680 Case 3021
    690 Resume Next
    700 Case Else
    710 DoCmd.Hourglass False
    720 DoCmd.Echo True
    'Chama a função global de tratamento de erros
    730 GlobalErrHandler ("ImportaTabelas")
    740 End Select
    End Function



    Cumprimentos.

      Data/hora atual: 29/4/2024, 14:48