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]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!
    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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)
    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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)
    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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!))
    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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
    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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!

    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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!
    avatar
    Dilson
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1695
    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: Ter 22 Ago 2017, 23:28