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

    [Resolvido]Word com Relacionamento 1-para-Vários

    Compartilhe

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Dom 30 Jul 2017, 03:03

    Boa noite a todos.

    Já havia feito há algum tempo em 2012 através da solução apresentada pelo colega Alexandre Neves no tópico:
    [Você precisa estar registrado e conectado para ver este link.]

    E estava agora precisando fazer algo semelhante, mas após várias tentativas não consegui o que queria, conforme segue abaixo:

    São 03 tabelas envolvidas na rotina, com seus campos abaixo:

    1) T01_Pacientes
    CodPaciente (Autonumeração)
    NomePaciente (Texto)
    e outros afins

    2) T011_Pac_Orientacoes
    CodPacOrienta (Autonumeração)
    IDPaciente (Número – inteiro longo)
    IDOrientacao (Número – inteiro longo)
    NomeOrientacao (Texto)

    3) T09_Orientacoes
    CodOrientacao (Autonumeração)
    TipoOrientacao (Texto)

    No Formulário "F01_Pacientes" (Fonte de registro: T01_Pacientes) tem um subformulário de nome “F011_Pac_Orientacoes” (Fonte de registro: T011_Pac_Orientacoes) que acrescenta vários registros com seus vários tipos de orientação através de Caixa de Combinação do campo ‘IDOrientacao’ que por sua vez tem como Origem da linha a Tabela: T09_Orientacoes. Nesse campo no evento ‘Após atualizar’ executa o comando abaixo:

    Private Sub IDOrientacao_AfterUpdate()
                Me!NomeOrientacao = IDOrientacao.Column(1)
    End Sub

    Significando que a cada registro inserido no subformulário é atualizado o campo ‘NomeOrientacao’ (T011_Pac_Orientacoes) correspondente ao campo ‘TipoOrientacao’ que está na coluna 1 da tabela ‘T09_Orientacoes’.

    Relacionamento: Formulário principal x subformulário
    Tabela “T01_Pacientes” está com Relacionamento [1 para vários] com o campo ‘CodPaciente’ e o campo “IDPaciente” da Tabela “T011_Pac_Orientacoes”, respectivamente (1 Paciente pode ter vários tipos de Orientações)

    O que preciso é:

    1) Após inserir no subformulário “F011_Pac_Orientacoes” os vários tipos de orientações para um Paciente e ao clicar no botão ‘btWord’ que já está funcional para os demais campos, gostaria de acrescentar as várias orientações que foram inseridas na tabela T011_Pac_Orientacoes através do subformulário citado, visto que serão vários registros e não apenas um.

    2) Baseado na rotina do tópico já resolvido e acima citado, tentei fazer da seguinte forma abaixo, entre outras tentativas, mas não funcionou:

            ... demais comandos da rotina acima (ok)

      Dim rst As DAO.Recordset, Orientacao As String
      Set rst = CurrentDb.OpenRecordset("SELECT NomeOrientacao FROM T011_Pac_Orientacoes LEFT JOIN T01_Pacientes ON T01_Pacientes.CodPaciente=T011_Pac_Orientacoes.IDPaciente WHERE CodPaciente=" & IDPaciente)
      Orientacao = ""
      Do While Not rst.EOF
      If Orientacao = "" Then Orientacao = rst(0) Else Orientacao = Orientacao & vbCr & rst(0)
         rst.MoveNext
      Loop
      Set rst = Nothing
      .ActiveDocument.Bookmarks("Campo21").Select
      .Selection.Text = Mid(Orientacao, 2)

    ... demais comandos da rotina abaixo (ok) ...

    PS: No documento matriz do Word acrescentei o campo 21 (indicador) para funcionar a rotina acima.

    3) Ao clicar no botão para gerar o documento Word, aparece a seguinte mensagem: “Erro em tempo de execução. Erro de sintaxe (Operador faltando) na expressão ‘CodPaciente=’
      ** Onde estaria o erro?

    4) Importante: No caso as várias orientações para um Paciente ficariam uma abaixo da outra, onde cada orientação é um registro da tabela ‘T011_Pac_Orientacoes’, conforme já descrito acima.

    Caso necessite postar a BD posso anexar depois.

    OBS: Uso o Access 2003
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Dom 30 Jul 2017, 10:19

    Bom dia
    - não percebi porque utiliza Mid(Orientacao, 2). Se no primeiro registo não acrescenta a quebra de linha, não precisará de remover nada na cadeia construida

    - sobre a sua dúvida, veja que valor assume o IDPaciente na criação do recordset


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Dom 30 Jul 2017, 16:14

    Bom dia,

    Realmente tens razão, é que acabei deixando o comando .Selection.Text = Mid(Orientacao, 2), pois havia copiado da outra sua rotina, mas já fiz o ajuste.

    O valor do IDPaciente é igual a vazio
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Dom 30 Jul 2017, 16:25

    Se é igual a vazio, o recorset não devolverá nada ou o parâmetro da consulta é vazio?


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Dom 30 Jul 2017, 23:32

    Apresenta vazio, mas não deveria ser assim, pois existe um CodPaciente, acredito que o erro possa estar nisso, mas não sei dizer como
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Seg 31 Jul 2017, 09:29

    Bom dia
    O que significa IDPaciente? Nome de campo ou nome de controlo? Se for de controlo, deveria ser TxtIDPaciente paraz destrinçar do nome de campo e daí não confundir a bd
    Podem ser estas pequenas diferenças que chamamos muitas vezes à atenção da normalização dos nomes


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Seg 31 Jul 2017, 13:22

    Bom dia

    IDPaciente é um campo tipo número (inteiro longo) da tabela T011_Pac_Orientacoes que tem um Relacionamento com o campo CodPaciente da Tabela T01_Pacientes

    Tabela 'T01_Pacientes' está com Relacionamento [1 para vários] do campo ‘CodPaciente’ com o campo “IDPaciente” da Tabela “T011_Pac_Orientacoes”, respectivamente
    (1 Paciente pode ter vários tipos de Orientações)

    T01_Pacientes
    CodPaciente (Autonumeração)
    NomePaciente (Texto)
    e outros afins

    T011_Pac_Orientacoes
    CodPacOrienta (Autonumeração)
    IDPaciente (Número – inteiro longo)
    IDOrientacao (Número – inteiro longo)
    NomeOrientacao (Texto)

    Não existe na rotina ou em outra tabela outro campo com esse nome IDPaciente
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Seg 31 Jul 2017, 18:48

    Boa tarde,
    Se o controlo tem conteúdo e chega ao filtro sem conteúdo
    Tem de executar passo-a-passo (F8) para detectar onde perde o valor do IDPaciente


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Ter 01 Ago 2017, 00:27

    Boa noite

    Fiz como conforme sua orientação e mostra o que segue na imagem
    * Veja nas 2 últimas linhas da imagem

    [Você precisa estar registrado e conectado para ver este link.]

    Apresenta assim o resultado:
    campo CodPaciente = 1 (correto)
    campo IDPaciente = vazio (incorreto)

    Se achar melhor posso enviar o arquivo para melhor compreensão e solução.
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Ter 01 Ago 2017, 22:15

    Boa noite,
    Se IDPaciente chega aí vazio terá de se ver o porquê
    Pode enviar, mas detalhe tudo o que se deve fazer para chegar a essa situação


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Qua 02 Ago 2017, 13:48

    Bom dia

    Vou preparar o arquivo e envio em seguida com os detalhes

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Sex 04 Ago 2017, 19:49

    Boa tarde,

    Desculpe a demora, é que estava tentando resolver o tópico, mas não consegui, então segue arquivo em anexo.

    Instruções:
    1) Criar pasta na unidade C:\DESPERTAR
    2) Descompactar arquivo nessa pasta criada
    3) Nessa pasta será copiada as subpastas:
       00.MatrizWord
       01.Relatórios

    Esses caminhos é para testar quando da geração do arquivo Word da rotina
    * PS: Na subpasta 00.MatrizWord tem o arquivo: MatrizPaciente.doc
      usado para criar capturar os dados do formulário
    Anexos
    DESPERTAR.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (192 Kb) Baixado 9 vez(es)
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Sex 04 Ago 2017, 21:34

    Boa noite,
    Não existe nenhum controlo com nome IDPaciente, existe com nome CodPaciente
    Substitua pelo nome correcto


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Sab 05 Ago 2017, 02:42

    Boa noite,

    Ficou perfeito, quem sabe, sabe. Ficou conforme abaixo: Bastou trocar apenas o 'IDPaciente' pelo 'CodPaciente' no final da linha de comando (em vermelho)

     'AUTOR: Alexandre Neves - Fórum MáximoAccess (31/07/2012) - Rotina original
      Dim rst As DAO.Recordset, Orientacao As String
      Set rst = CurrentDb.OpenRecordset("SELECT NomeOrientacao FROM T011_Pac_Orientacoes LEFT JOIN T01_Pacientes ON T01_Pacientes.CodPaciente=T011_Pac_Orientacoes.IDPaciente WHERE CodPaciente=" & CodPaciente)
      Orientacao = ""
      Do While Not rst.EOF
      If Orientacao = "" Then Orientacao = rst(0) Else Orientacao = Orientacao & vbCr & vbCr & rst(0) '04/08/2017: acrescentei mais um comando '& vbCr' para acrescentar mais um espaço entre os registros inseridos
         rst.MoveNext
      Loop
      Set rst = Nothing
      .ActiveDocument.Bookmarks("Campo21").Select
      .Selection.Text = Orientacao

    Para encerrar, gostaria de saber se teria como numerar automaticamente na ordem sequencial cada uma das linhas quando é lançado no documento Word para ficar conforme abaixo:

    Atualmente ficou assim:

    Adaptação de material didático-pedagógico e forma de avaliação, conforme peculiaridades do aluno.

    Uso de outras linguagens e recursos visuais para facilitar a compreensão das aulas expostas, utilizando figuras, esquemas, gráficos, fotos e ícones associando o texto escrito a imagens, visando ilustrar e evocar lembranças.

    Adotar e adaptar critérios diferenciados de correção coerente à realidade, valorando não só o que está explícito e considerar a avaliação de atividades práticas.

    Possibilitar elaboração de prova de forma individualizada, respeitando especificidades, e quando necessário maior tempo para aplicar a prova, ou dividir a avaliação em dois tempos.

    Gostaria que ficasse assim:

    1. Adaptação de material didático-pedagógico e forma de avaliação, conforme peculiaridades do aluno.

    2. Uso de outras linguagens e recursos visuais para facilitar a compreensão das aulas expostas, utilizando figuras, esquemas, gráficos, fotos e ícones associando o texto escrito a imagens, visando ilustrar e evocar lembranças.

    3. Adotar e adaptar critérios diferenciados de correção coerente à realidade, valorando não só o que está explícito e considerar a avaliação de atividades práticas.

    4. Possibilitar elaboração de prova de forma individualizada, respeitando especificidades, e quando necessário maior tempo para aplicar a prova, ou dividir a avaliação em dois tempos.
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 6505
    Registrado : 05/11/2009

    Re: [Resolvido]Word com Relacionamento 1-para-Vários

    Mensagem  Alexandre Neves em Sab 05 Ago 2017, 09:06

    Bom dia,
    Tem de começar a agilizar a mecânica

    Substitua no trecho correpondente
    Código:
      'AUTOR: Alexandre Neves - Fórum MáximoAccess (31/07/2012) - Rotina original
      Dim rst As DAO.Recordset, Orientacao As String
      Set rst = CurrentDb.OpenRecordset("SELECT (SELECT count('*') FROM T011_Pac_Orientacoes as A WHERE A.CodPacOrienta<=T011_Pac_Orientacoes.CodPacOrienta) as Num, NomeOrientacao FROM T011_Pac_Orientacoes LEFT JOIN T01_Pacientes ON T01_Pacientes.CodPaciente=T011_Pac_Orientacoes.IDPaciente WHERE CodPaciente=" & CodPaciente)
      Orientacao = ""
      Do While Not rst.EOF
      If Orientacao = "" Then Orientacao = rst(0) & ". " & rst(1) Else Orientacao = Orientacao & vbCr & rst(0) & ". " & rst(1)
          rst.MoveNext
      Loop
      Set rst = Nothing
      .ActiveDocument.Bookmarks("Campo21").Select
      .Selection.Text = Orientacao


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    vileman
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 461
    Registrado : 25/05/2011

    Word com Relacionamento 1-para-Vários

    Mensagem  vileman em Sab 05 Ago 2017, 14:36

    Bom dia, Alexandre Neves

    Ficou mais uma vez na perfeição, você é o cara.
    Nem sei como lhe agradecer, valeu por mais essa ajuda.

    Muitíssimo obrigado.

      Data/hora atual: Ter 21 Nov 2017, 21:05