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.
Cumprimentos.
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.