Bom dia,
Já havia feito há algum tempo em 2012 através da solução apresentada ambas pelo colega Alexandre Neves nos tópicos: https://www.maximoaccess.com/t8831-resolvidoword-com-dados-de-consulta-x-um-para-muitos e um outro em 2017: https://www.maximoaccess.com/t30872-resolvidoword-com-relacionamento-1-para-varios
Agora estou precisando acrescentar algo que na época não acontecia nas rotinas citadas, mas após várias tentativas não consegui o que queria, conforme segue abaixo:
São 10 tabelas envolvidas na rotina, mas como irão seguir a mesma lógica para todas, vou incluir apenas uma no exemplo a seguir:
1) T30_LDBPessoas
CodPessoa (Autonumeração)
NomePessoa (Texto)
e outros campos
2) T301_PessoasXVinculos
CodVinculoPF (Autonumeração)
IDPessoa (Número – inteiro longo)
TipoVinculo (Texto)
NomeVinculo (Texto)
CPFVinculo (Texto)
No Formulário "F30_LDBPessoas" (Fonte de registro: T30_LDBPessoas) tem o subformulário: “F301_LDBPessoasXVinculos” (Fonte de registro: T301_PessoasXVinculos) que acrescenta vários registros com vários tipos de vinculos através de Caixa de Combinação do campo ‘TipoVinculo’ (Exemplo: Pai, Mãe, Filho, etc).
Relacionamento: Formulário principal x subformulário
Tabela “T30_LDBPessoas” está com Relacionamento [1 para vários] com o campo ‘CodPessoa’ e o campo “IDPessoa” da Tabela “T301_PessoasXVinculos”, respectivamente (1 Pessoa pode ter vários tipos de Vinculos)
Até esse ponto está tudo perfeito. O que preciso implementar é quando for gerado o documento word (rotina já em funcionamento) e for trazido os dados inseridos nos vínculos está funcionando parcialmente através da rotina:
'AUTORIA: Alexandre Neves em 2012 – Adaptada por mim para outra BD em 2019
'FONTE: https://www.maximoaccess.com/t8831-resolvidoword-com-dados-de-consulta-x-um-para-muitos
'Tabelas envolvidas: Tabela: T30_LDBPessoas (PAI) + T301_PessoasXVinculos (FILHO)
Dim rst1 As DAO.Recordset, PFVinculo As String
Set rst1 = CurrentDb.OpenRecordset("SELECT TipoVinculo, CPFVinculo, NomeVinculo FROM T301_PessoasXVinculos LEFT JOIN T30_LDBPessoas ON T30_LDBPessoas.CodPessoa=T301_PessoasXVinculos.IDPessoa WHERE CodPessoa=" & CodPessoa)
PFVinculo = ""
Do While Not rst1.EOF
If PFVinculo = "" Then PFVinculo = rst1(0) & " - " & rst1(1) & " - " & rst1(2) Else PFVinculo = PFVinculo & vbCr & rst1(0) & " - " & rst1(1) & " - " & rst1(2)
rst1.MoveNext
Loop
Set rst1 = Nothing
.ActiveDocument.Bookmarks("Campo29").Select
.Selection.Text = PFVinculo
O problema é quando na tabela secundária: ”T301_PessoasXVinculos” não tem dados a serem transportados para o documento word, pois preciso apresentar o texto: “SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS”, ou seja, mostrar esse texto no local do indicador que está no documento matriz do Word, mostrando que a tabela está vazia para determinada pessoa.
Provisoriamente fiz o seguinte: Acrescentei no documento matriz do Word acima do campo com indicador “Campo29” o Texto: “SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS”, então ocorre 2 situações:
1. quando gera o documento word no formulário principal e tem dados aparece o texto acima indicado e os dados logo abaixo do mesmo, o que fica incoerente, então pedi para que cada usuário apagasse essa linha quando houvesse dados abaixo da mesma;
2. quando gera o documento word no formulário principal e não tem dados aparece o texto acima indicado e o campo do indicador abaixo fica vazio.
Então, é mesmo algo que deveria ser provisório, e arcaico, falando em termos de sistema.
Fiz vários testes para tentar solucionar o problema, conforme adiante:
'TESTE 1: 26/11/2019 ... Funcionou ? NÃO (Salva direto no arquivo matriz e não gera o novo documento)
' If DCount("*", " T301_PessoasXVinculos ") = 0 Then
' .ActiveDocument.Bookmarks("Campo29").Select
' .Selection.Text = "SEM LANÇAMENTO DE DADOS."
' Else
' Exit Sub
' End If
'============================================================================
'TESTE 2: 26/11/2019 ... Funcionou ? NÃO (Gera novo documento com nome da Pessoa Física)
'.ActiveDocument.Bookmarks("Campo29").Select
' If DCount("*", " T301_PessoasXVinculos ") = 0 Then
' .Selection.Text = "SEM LANÇAMENTO DE DADOS."
' End If
'=============================================================================
'TESTE 3: 26/11/2019 ... Funcionou ? NÃO (Gera novo documento com nome da Pessoa Física)
'Dim Vazio As String
'Vazio = "SEM LANÇAMENTO DE DADOS."
'.ActiveDocument.Bookmarks("Campo29").Select
' If DCount("*", " T301_PessoasXVinculos ") = 0 Then
' .Selection.Text = Me!Vazio
' Else
' End If
'================================================================================
'TESTE 4: 27/11/2019 ... Funcionou ? Parcialmente (COM Dados: Funciona. SEM Dados: Não funciona)
Dim rst1 As DAO.Recordset, PFVinculo As String
Set rst1 = CurrentDb.OpenRecordset("SELECT TipoVinculo, CPFVinculo, NomeVinculo FROM T301_PessoasXVinculos LEFT JOIN T30_LDBPessoas ON T30_LDBPessoas.CodPessoa=T301_PessoasXVinculos.IDPessoa WHERE CodPessoa=" & CodPessoa)
PFVinculo = ""
Do While Not rst1.EOF
If PFVinculo = "" Then PFVinculo = rst1(0) & " - " & rst1(1) & " - " & rst1(2) Else PFVinculo = PFVinculo & vbCr & rst1(0) & " - " & rst1(1) & " - " & rst1(2)
rst1.MoveNext
Loop
Set rst1 = Nothing
'.ActiveDocument.Bookmarks("Campo29").Select
'.Selection.Text = (CStr(IIf(DCount("*", "T301_PessoasXVinculos ") = 0, "- SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS. -", " ")))
'============================================================================================
'TESTE 5: 27/11/2019 ... Funcionou ? Parcialmente (COM Dados: Funciona. SEM Dados: Não funciona. OU VICE-VERSA)
'criar 2 IF para campo29: Com dados e Sem dados
' .ActiveDocument.Bookmarks("Campo29").Select
' Dim rst1 As DAO.Recordset, T301_PessoasXVinculos As String
‘ Set rst1 = CurrentDb.OpenRecordset("SELECT TipoVinculo, CPFVinculo, NomeVinculo FROM T301_PessoasXVinculos")
' If DCount("*", "T301_PessoasXVinculos") > 0 Then
' .Selection.Text = " "
' ElseIf IsNull("T301_PessoasXVinculos ") Then
' .Selection.Text = "- SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS. -"
' End If
'============================================================================================
'TESTE 6: 27/11/2019 ... Funcionou ? Parcialmente (COM Dados: Funciona. SEM Dados: Não funciona. OU VICE-VERSA)
'.ActiveDocument.Bookmarks("Campo29").Select
' If IsNull(PFVinculo) Then
' .Selection.Text = "- SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS. -"
'Else
' .Selection.Text = "com dados" 'equivalente a vazio, coloquei o texto apenas para testes
'End If
'============================================================================================
No entanto, ou não funciona ou funciona parcialmente com dados, o problema é justamente quando não tem dados na tabela e preciso informar isso para o documento word no local do indicador do “Campo29”
Agradeço se alguém puder ajudar.
Já havia feito há algum tempo em 2012 através da solução apresentada ambas pelo colega Alexandre Neves nos tópicos: https://www.maximoaccess.com/t8831-resolvidoword-com-dados-de-consulta-x-um-para-muitos e um outro em 2017: https://www.maximoaccess.com/t30872-resolvidoword-com-relacionamento-1-para-varios
Agora estou precisando acrescentar algo que na época não acontecia nas rotinas citadas, mas após várias tentativas não consegui o que queria, conforme segue abaixo:
São 10 tabelas envolvidas na rotina, mas como irão seguir a mesma lógica para todas, vou incluir apenas uma no exemplo a seguir:
1) T30_LDBPessoas
CodPessoa (Autonumeração)
NomePessoa (Texto)
e outros campos
2) T301_PessoasXVinculos
CodVinculoPF (Autonumeração)
IDPessoa (Número – inteiro longo)
TipoVinculo (Texto)
NomeVinculo (Texto)
CPFVinculo (Texto)
No Formulário "F30_LDBPessoas" (Fonte de registro: T30_LDBPessoas) tem o subformulário: “F301_LDBPessoasXVinculos” (Fonte de registro: T301_PessoasXVinculos) que acrescenta vários registros com vários tipos de vinculos através de Caixa de Combinação do campo ‘TipoVinculo’ (Exemplo: Pai, Mãe, Filho, etc).
Relacionamento: Formulário principal x subformulário
Tabela “T30_LDBPessoas” está com Relacionamento [1 para vários] com o campo ‘CodPessoa’ e o campo “IDPessoa” da Tabela “T301_PessoasXVinculos”, respectivamente (1 Pessoa pode ter vários tipos de Vinculos)
Até esse ponto está tudo perfeito. O que preciso implementar é quando for gerado o documento word (rotina já em funcionamento) e for trazido os dados inseridos nos vínculos está funcionando parcialmente através da rotina:
'AUTORIA: Alexandre Neves em 2012 – Adaptada por mim para outra BD em 2019
'FONTE: https://www.maximoaccess.com/t8831-resolvidoword-com-dados-de-consulta-x-um-para-muitos
'Tabelas envolvidas: Tabela: T30_LDBPessoas (PAI) + T301_PessoasXVinculos (FILHO)
Dim rst1 As DAO.Recordset, PFVinculo As String
Set rst1 = CurrentDb.OpenRecordset("SELECT TipoVinculo, CPFVinculo, NomeVinculo FROM T301_PessoasXVinculos LEFT JOIN T30_LDBPessoas ON T30_LDBPessoas.CodPessoa=T301_PessoasXVinculos.IDPessoa WHERE CodPessoa=" & CodPessoa)
PFVinculo = ""
Do While Not rst1.EOF
If PFVinculo = "" Then PFVinculo = rst1(0) & " - " & rst1(1) & " - " & rst1(2) Else PFVinculo = PFVinculo & vbCr & rst1(0) & " - " & rst1(1) & " - " & rst1(2)
rst1.MoveNext
Loop
Set rst1 = Nothing
.ActiveDocument.Bookmarks("Campo29").Select
.Selection.Text = PFVinculo
O problema é quando na tabela secundária: ”T301_PessoasXVinculos” não tem dados a serem transportados para o documento word, pois preciso apresentar o texto: “SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS”, ou seja, mostrar esse texto no local do indicador que está no documento matriz do Word, mostrando que a tabela está vazia para determinada pessoa.
Provisoriamente fiz o seguinte: Acrescentei no documento matriz do Word acima do campo com indicador “Campo29” o Texto: “SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS”, então ocorre 2 situações:
1. quando gera o documento word no formulário principal e tem dados aparece o texto acima indicado e os dados logo abaixo do mesmo, o que fica incoerente, então pedi para que cada usuário apagasse essa linha quando houvesse dados abaixo da mesma;
2. quando gera o documento word no formulário principal e não tem dados aparece o texto acima indicado e o campo do indicador abaixo fica vazio.
Então, é mesmo algo que deveria ser provisório, e arcaico, falando em termos de sistema.
Fiz vários testes para tentar solucionar o problema, conforme adiante:
'TESTE 1: 26/11/2019 ... Funcionou ? NÃO (Salva direto no arquivo matriz e não gera o novo documento)
' If DCount("*", " T301_PessoasXVinculos ") = 0 Then
' .ActiveDocument.Bookmarks("Campo29").Select
' .Selection.Text = "SEM LANÇAMENTO DE DADOS."
' Else
' Exit Sub
' End If
'============================================================================
'TESTE 2: 26/11/2019 ... Funcionou ? NÃO (Gera novo documento com nome da Pessoa Física)
'.ActiveDocument.Bookmarks("Campo29").Select
' If DCount("*", " T301_PessoasXVinculos ") = 0 Then
' .Selection.Text = "SEM LANÇAMENTO DE DADOS."
' End If
'=============================================================================
'TESTE 3: 26/11/2019 ... Funcionou ? NÃO (Gera novo documento com nome da Pessoa Física)
'Dim Vazio As String
'Vazio = "SEM LANÇAMENTO DE DADOS."
'.ActiveDocument.Bookmarks("Campo29").Select
' If DCount("*", " T301_PessoasXVinculos ") = 0 Then
' .Selection.Text = Me!Vazio
' Else
' End If
'================================================================================
'TESTE 4: 27/11/2019 ... Funcionou ? Parcialmente (COM Dados: Funciona. SEM Dados: Não funciona)
Dim rst1 As DAO.Recordset, PFVinculo As String
Set rst1 = CurrentDb.OpenRecordset("SELECT TipoVinculo, CPFVinculo, NomeVinculo FROM T301_PessoasXVinculos LEFT JOIN T30_LDBPessoas ON T30_LDBPessoas.CodPessoa=T301_PessoasXVinculos.IDPessoa WHERE CodPessoa=" & CodPessoa)
PFVinculo = ""
Do While Not rst1.EOF
If PFVinculo = "" Then PFVinculo = rst1(0) & " - " & rst1(1) & " - " & rst1(2) Else PFVinculo = PFVinculo & vbCr & rst1(0) & " - " & rst1(1) & " - " & rst1(2)
rst1.MoveNext
Loop
Set rst1 = Nothing
'.ActiveDocument.Bookmarks("Campo29").Select
'.Selection.Text = (CStr(IIf(DCount("*", "T301_PessoasXVinculos ") = 0, "- SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS. -", " ")))
'============================================================================================
'TESTE 5: 27/11/2019 ... Funcionou ? Parcialmente (COM Dados: Funciona. SEM Dados: Não funciona. OU VICE-VERSA)
'criar 2 IF para campo29: Com dados e Sem dados
' .ActiveDocument.Bookmarks("Campo29").Select
' Dim rst1 As DAO.Recordset, T301_PessoasXVinculos As String
‘ Set rst1 = CurrentDb.OpenRecordset("SELECT TipoVinculo, CPFVinculo, NomeVinculo FROM T301_PessoasXVinculos")
' If DCount("*", "T301_PessoasXVinculos") > 0 Then
' .Selection.Text = " "
' ElseIf IsNull("T301_PessoasXVinculos ") Then
' .Selection.Text = "- SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS. -"
' End If
'============================================================================================
'TESTE 6: 27/11/2019 ... Funcionou ? Parcialmente (COM Dados: Funciona. SEM Dados: Não funciona. OU VICE-VERSA)
'.ActiveDocument.Bookmarks("Campo29").Select
' If IsNull(PFVinculo) Then
' .Selection.Text = "- SEM LANÇAMENTO E/OU INFORMAÇÕES DE DADOS. -"
'Else
' .Selection.Text = "com dados" 'equivalente a vazio, coloquei o texto apenas para testes
'End If
'============================================================================================
No entanto, ou não funciona ou funciona parcialmente com dados, o problema é justamente quando não tem dados na tabela e preciso informar isso para o documento word no local do indicador do “Campo29”
Agradeço se alguém puder ajudar.