MaximoAccess

Caro Usuário, não tire as suas duvidas nas Salas de Repositório, abra sempre um novo tópico relacionado, nas salas destinadas para o efeito, como Sala de Tabelas, Consultas, Formulários, Relatórios, Macros, Módulos e VBA.

Obrigado

Administração do MaximoAccess

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

    [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Compartilhe

    José Faustino Filho
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 31
    Registrado : 31/12/2013

    [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  José Faustino Filho em Ter 31 Dez 2013, 17:33

    Olá pessoal, boa tarde.

    O meu problema é o seguinte, criei dois formulários (Inícios e Consultoras), o Form "Inícios" é o primeiro a ser preenchido e 70% dos campos dele são iguais aos do Form "Consultoras". Então pesquisando um pouco criei um botão no Form "Inícios" e coloquei o seguinte código:

    Private Sub Criar_cadastro_Click()
      Const cstrPrompt As String = _
          "Confirma esta ação?"
    If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbYes Then
         If Me.Dirty Then
            Me.Dirty = False 'Gerar cadastro
         End If
         DoCmd.RunCommand acCmdSaveRecord 'Salva e vai para o formulário consultoras
         DoCmd.OpenForm "Consultoras", , , , acFormAdd
    End If
    End Sub


    Funcionou direitinho, e lá no Form "Consultoras" no evento "Ao Abrir" coloquei o seguinte código:

    Private Sub Form_Open(Cancel As Integer)
     DoCmd.GoToRecord , , acNewRec
     Const cstrPrompt As String = _
          "Está transformando um início em CN?"
       If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbNo Then
       Exit Sub
       Else
          Me.CNCons = Forms!Inícios!Nome2Ini 'Só coloquei um por enquanto
       End If
    End Sub


    Funcionou direitinho também, mas a questão é que o Form. "Consultoras" não será alimentado sempre com os campos oriundos do Form "Inícios", por isto coloquei a MsgBox no código acima. Contudo se alguém acidentalmente clicar em "Sim" aparece uma mensagem de erro, pois o Form "Inícios" está fechado. Desse modo, eu quero colocar uma instrução no código acima que diga ao usuário através de uma MsgBox que a ação de clicar em "Sim" foi equivocada e que ele deve novamente tentar abrir o Form "Consultoras" e dessa vez clicar em "Não".

    Desde já agradeço pela ajuda e peço desculpa se cometi algum erro conceitual, é que sou novo no Fórum e entendo muito pouco de programação (na verdade sou Químico!), mas estou criando um banco de dados no Access para minha mãe e empaquei nisto!

    Um abraço a todos!

    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Qua 01 Jan 2014, 13:43

    Seja bem vindo ao fórum e feliz 2014 !

    Uma sugestão que funciona:

    Deduzo que chamas o formulário Consultoras em dois momentos:
    - A partir do formulário Inicios e,
    - A partir de outro formulário por um controle.

    Dadas as situações pode criar o seguinte:

    Crie um módulo e nele declare uma variável global do tipo String

    Pode chamá-la de formQueChama (forma usual de dizer: "Qual form está chamando a abertura do form Consultoras ?")

    Daí é só aplicar na abertura do form Consultoras a condicional:

    Private Sub Form_Open(Cancel As Integer)
    DoCmd.GoToRecord , , acNewRec
    Const cstrPrompt As String = _
      If formQueChama = "Inicios" Then
                Me.CNCons = Forms!Inícios!Nome2Ini 'Só coloquei um por enquanto
         Else
                Exit Sub
     End If
    End Sub



    Não esquecer de alimentar a variável global a partir do form Inicios assim:

    No mesmo código que chama o form Consultoras coloque:
    formQueChama = "Inicios"

    E quando fechar o form Consultoras esvazie a variável assim:
    formQueChama = ""

    Adapte.

    José Faustino Filho
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 31
    Registrado : 31/12/2013

    Obrigado amigão!

    Mensagem  José Faustino Filho em Qui 02 Jan 2014, 17:44

    Obrigado pela ajuda e recepção :placeholder, um Feliz 2014 para você também!

    Entendi a sua instrução, mas não entendi onde devo colocar o (formQueChama = ""), devo criar um evento em "Ao fechar" do formulário "Consultoras" e aí inserir este código?

    Só pra ter certeza, o código no formulário "Inícios" ficaria assim:

    Private Sub Criar_cadastro_Click()
      Const cstrPrompt As String = _
          "Confirma esta ação?"
    If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbYes Then
         If Me.Dirty Then
            Me.Dirty = False 'Gerar cadastro
         End If
         DoCmd.RunCommand acCmdSaveRecord 'Salva e vai para o formulário consultoras
         DoCmd.OpenForm "Consultoras", , , , acFormAdd
         formQueChama = "Inicios"
    End If
    End Sub

    Gostei muito da sua sugestão, mas devo dizer que quebrando bastante a cabeça e adaptando outros códigos que encontrei por aí, cheguei a uma opção que funcionou razoavelmente. Me diga o que acha deste:

    Private Sub Form_Open(Cancel As Integer)
     DoCmd.GoToRecord , , acNewRec
     Const cstrPrompt As String = _
          "Deseja tranformar um início em CN?"
       If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbNo Then
       Exit Sub
       ElseIf CurrentProject.AllForms("Inícios").IsLoaded Then
          Me.CNCons = Forms!Inícios!Nome2Ini 'Só coloquei um por enquanto    
       Else
       MsgBox "Opção inválida, clique em Identificação novamente e escolha ""Não"".", vbOKOnly + vbCritical, "Atenção!"
       DoCmd.Close acForm, "Consultoras"
       End If
    End Sub

    Muito obrigado pela atenção brother!

    PS: Como faço para colocar como Resolvido o problema aqui no fórum? hehehe... Valeu

    Att.


    Última edição por José Faustino Filho em Qui 02 Jan 2014, 17:47, editado 1 vez(es) (Razão : Incompleto)

    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Qui 02 Jan 2014, 19:25

    Olá, que bom.

    A forma que te passei é mais eficiente porque não necessita da ação do usuário para escolher opções que devem seguir sempre apenas uma delas.

    Está correto quando alimenta a variável ao chamar o form Consultoras, pois na condicional ao abrir, o form Consultoras estará sendo avisado que a chamada veio do form inicios e por isso deve receber os dados transportados.

    Exatamente. Coloque: formQueChama = "" no evento ao fechar do form Consultoras. Isto é necessário para que sempre se saiba de onde vem a chamada, pois se abrir o form Consultoras diretamente a variável estará como "" e cairá em Exit Sub e se esquecer de esvaziar a variável ? Vai acabar sempre dando o erro do form inicio por conta do mesmo estar fechado.

    Para colocar resolvido vá na sua ultima postagem em modo de edição e aperte um botão de nome Resolvido.

    José Faustino Filho
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 31
    Registrado : 31/12/2013

    Obrigado brother!

    Mensagem  José Faustino Filho em Sex 03 Jan 2014, 20:18

    Havia percebido isto mesmo brother, o seu jeito é mais eficaz. Contudo ainda não está funcionando, a linha (Const cstrPrompt As String = _) está sendo acusada como erro, mas como ela se referia à MsgBox experimentei tirar. O erro parou de aparecer, contudo quando o Form "Inícios" está aberto e eu chamo o Form "Consultoras" através do botão o campo "CNCons" não está sendo copiado para o "Nome2Ini", simplesmente o formulário abre e fica vazio. O que será? Dê uma olhada nos códigos (é muito simples, mas não está funcionando!):

    Form Inícios:

    Private Sub Form_Open(Cancel As Integer)
    DoCmd.GoToRecord , , acNewRec
      If formQueChama = "Inicios" Then
                Me.CNCons = Forms!Inícios!Nome2Ini 'Só coloquei um por enquanto
         Else
                Exit Sub
    End If
    End Sub

    Form Consultoras:

    Private Sud Form_Close()
       formQueChama = ""
    End Sub

    Valeu!


    Última edição por José Faustino Filho em Sex 03 Jan 2014, 20:21, editado 1 vez(es) (Razão : Incompleto)

    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Sex 03 Jan 2014, 20:33

    "o campo "CNCons" não está sendo copiado para o "Nome2Ini"

    Deveria ser ao contrário não ?

    Assim: O campo "Nome2Ini" não está sendo copiado para o "CNCons"

    Se sua pronúncia estiver certa, não vai copiar mesmo. Terá que inverter.

    Porque Me.CNCons = Forms!Inícios!Nome2Ini está dizendo que CNCons está no formulário Consultoras que receberá dado do campo Nome2Ini pertencente ao formulário Inicios.

    Veja e retorne.

    Editado:
    Verifique também como está escrito o form Inicios, com acento ou sem acento e revise o código.

    José Faustino Filho
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 31
    Registrado : 31/12/2013

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  José Faustino Filho em Sex 03 Jan 2014, 23:02

    É isto mesmo brother! Me atrapalhei na explicação e cometi alguns erros na apresentação do código, mas o problema ainda continua, o campo não é copiado para o outro formulário. Estes são os códigos corretos (me atrapalhei no post anterior):

    Formulário Inícios:

    Private Sub Criar_cadastro_Click()
      Const cstrPrompt As String = _
          "Confirma esta ação?"
         If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbYes Then
             If Me.Dirty Then
                Me.Dirty = False
             End If
         DoCmd.RunCommand acCmdSaveRecord
         DoCmd.OpenForm "Consultoras", , , , acFormAdd
         formQueChama = "Inícios"
         End If
    End Sub


    Formulário Consultoras:

    Private Sub Form_Close()
           formQueChama = ""
    End Sub


    --------------------------------------------------------------------------------------------------------------------------------------------------

    Private Sub Form_Open(Cancel As Integer)
     DoCmd.GoToRecord , , acNewRec
     If formQueChama = "Inícios" Then
               Me.CNCons = Forms!Inícios!Nome2Ini
        Else
               Exit Sub
    End If
    End Sub



    Testei assim como te expliquei e ainda continua sem funcionar. Além disso, criei um outro código para o evento "Ao Descarregar" do formulário "Consultoras". Veja o que fiz:

    Private Sub Form_Unload(Cancel As Integer)
    If CurrentProject.AllForms("Inícios").IsLoaded Then
          If IsNull(Me.CodConsCons) Then
             If MsgBox("""Cód. consultora"" está vazio, deseja realmente sair?", vbYesNo) = vbNo Then Cancel = True
          Else
    DoCmd.RunCommand acCmdSaveRecord
          MsgBox "Os seus dados foram salvos!", vbOKOnly, "Aviso"
          End If
    End If
    End Sub


    Este último código fez o que pedi, mas o problema principal ainda continua. O que será que está acontecendo?

    Muito obrigado pela ajuda brother e mais uma vez me desculpe por qualquer erro, esta não é minha área, mas me divirto muito fazendo isto!


    Última edição por José Faustino Filho em Sex 03 Jan 2014, 23:06, editado 1 vez(es) (Razão : Incompleto (mais uma vez!))

    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Sex 03 Jan 2014, 23:13

    Sem problemas brother.

    O ultimo recurso que posso oferecer é ver seu banco.

    Posta uma amostra somente com a parte desses dois formulários pra darmos uma olhada por favor.

    Editado:
    Olha isso aqui é desnecessário: DoCmd.GoToRecord , , acNewRec

    Pois já está colocando isso: DoCmd.OpenForm "Consultoras", , , , acFormAdd

    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Sex 03 Jan 2014, 23:47

    Amigão retire isso do form Consultoras: DoCmd.GoToRecord , , acNewRec

    E transporte os dados a partir do seu form Inicios:

    DoCmd.OpenForm "Consultoras", , , , acFormAdd
    Forms!Consultoras!CNCons = Me!Nome2Ini

    Retire também isso: formQueChama = "Inícios"

    Daí nem precisará usar variável global e nenhum código na abertura e fechamento do form Consultoras.

    José Faustino Filho
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 31
    Registrado : 31/12/2013

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  José Faustino Filho em Sab 04 Jan 2014, 00:38

    Ficaria assim então brother?

    Private Sub Criar_cadastro_Click()
    Const cstrPrompt As String = _
    "Confirma esta ação?"
    If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbYes Then DoCmd.RunCommand
    If Me.Dirty Then
    Me.Dirty = False
    End If
    DoCmd.OpenForm "Consultoras", , , , acFormAdd
    Me.CNCons = Forms!Inícios!Nome2Ini
    End If
    End Sub


    Se for isto... ainda não está funcionando e agora nem MsgBox está aparecendo! Tentei anexar aqui, mas o arquivo é muito grande. Abaixo está o link para o meu disco virtual. Anexei a minha versão inicial (a que está funcionando) e a versão que estou tentando alterar (sem a necessidade da MsgBox inicial):

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

    Um guia: Tente abrir primeiro o formulário "Consultoras" nos dois arquivos e veja o que acontece. Depois abra o formulário "Inícios", insira alguns dados e clique no botão "Criar cadastro". Veja o que acontece!

    PS: Demorei um pouco pra responder pq estava fazendo o upload da pasta!  Very Happy 

    Valeu brother!


    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Sab 04 Jan 2014, 00:46

    Ainda tô baixando, mas observe que colocou diferente:

    Me.CNCons = Forms!Inícios!Nome2Ini


    É pra colocar assim (veja no tópico anterior):

    Forms!Consultoras!CNCons = Me!Nome2Ini


    José Faustino Filho
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 31
    Registrado : 31/12/2013

    Agora sim!!!

    Mensagem  José Faustino Filho em Sab 04 Jan 2014, 01:19

    Verdade brother!!! Mil perdões! Agora funcionou perfeitamente, MUITO obrigado pela sua ajuda.

    Agora o código ficou massa!

    Um abraço brother, que Deus o abençoe!

    Dilson
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1602
    Registrado : 11/11/2009

    Re: [Resolvido]Copiar dados de um formulário para outro e avisar quando o formulário principal não está aberto

    Mensagem  Dilson em Sab 04 Jan 2014, 01:26

    Obrigado pelo retorno, pois já abortei a missão.

    Se não se entendiou com essa dinâmica então creio que se diverte mesmo com programação como falou na mensagem n° 7 e só por este fato terá futuro nessa área.

    Falou brother, bom trabalho!

      Data/hora atual: Sex 09 Dez 2016, 11:33