MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    avatar
    massalin
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 08/09/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  massalin em 4/6/2020, 05:21

    Olá Pessoal

    Situação:
    - Tenho um formulário onde filtro os registros diretamente sobre os campos (com botão direito do mouse sobre os caampos do form).
    - Uma vez filtrados os registros, desejo marcá-los para uso posterior. Para isso, no cabeçalho, tenho um controle que aciona uma procedure que permite atualizar todos os registros já filtrados.
    - Para isso uso a propriedade "RecordsetClone", pois ela "enxerga" os registros filtrados, não importanto quantos e quais filtros eu já tenha aplicado. Para isso, no código da Procedure, uso os comandos "for" e "next", que vão atualizando os registros do "recordsetclone". Até ai ok. funciona.

    Código:

       Dim formRecords As DAO.Recordset
       Dim i As Long
       
       Set formRecords = Me.RecordsetClone
       
       If Me.SelLoteEmExib = True Then 'se seleção ativa
       
           ' Vai para o primeiro reg do recordset.
           formRecords.MoveFirst
           
           For i = 1 To QtdeRegs
               formRecords.Edit
               formRecords.Fields("LançMarc") = True
               formRecords.Update
               formRecords.MoveNext
           Next i
           
       Else
           ' Vai para o primeiro reg do recordset.
           formRecords.MoveFirst
           
           For i = 1 To QtdeRegs
               formRecords.Edit
               formRecords.Fields("LançMarc") = False
               formRecords.Update
               formRecords.MoveNext
           Next i
           
       End If


    Problema:
    - Porém noto que a rotina demora muito.
    - Resolvi antão tentar alterar esses registros usando SQL no código VBA.

    Dúvida:
    - Gostaria de saber se alguém já conseguiu atualizar registros (já filtrados no form) usando instruções SQL ("DoCmd.RunSQL") que consigam "enxergar" a condição de filtro atual do formulário no instante que rodamos o SQL.
    - Tentei compor a instrução SQL no VBA dicamicamente "colando" a cláusula WHERE do SQL com a propriedade "filter" do formulário, mas não funcionou, pois essa propriedade (filter) tras os filtros referenciando o nome dos controles do formulário, e não os nomes de campos da tabela do form (e o SQL parece só aceitar WHERE com nomes dos campos da tabela)

    - Alguém sabe como atuar com SQL somente sobre os registros já filtrados?  Acho que usando SQL terei mais rapidez.

    Grato

    Ambiente:
    - Office Access 2013
    - Windows 10
    Celso Roberto
    Celso Roberto
    VIP
    VIP

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1060
    Registrado : 01/03/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  Celso Roberto em 5/6/2020, 00:18

    Olá..

    O teu código esta demorando porque ele esta percorrendo 2 vezes os registros, isto porque ele corre os registros com o For do IF e depois o for do Else.

    faça uma cópia do seu banco para segurança e faça teste com este código abaixo:

    Código:
    Dim formRecords As DAO.Recordset
        Dim i As Integer
      
        Set formRecords = Me.RecordsetClone
      
        'Vai para o primeiro reg do recordset.
        formRecords.MoveFirst
          
        For i = 1 To QtdeRegs
            formRecords.Edit
            If Me.SelLoteEmExib = True Then 'se seleção ativa
                formRecords.Fields("LançMarc") = True
            Else
                formRecords.Fields("LançMarc") = False
            End If
                formRecords.Update
                formRecords.MoveNext
        Next i



    Aguardamos retorno

    Abraços e sucesso


    .................................................................................


    Você fica satisfeito ao ter sua dúvida solucionada?.
    Quem te ajuda também fica quando você da o tópico por "Resolvido".
    Veja como neste Link: https://www.maximoaccess.com/t860-resolucao-de-topicos



    A Única coisa que sei é que ainda nada sei, Mas em breve Saberei.....
    avatar
    massalin
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 08/09/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  massalin em 5/6/2020, 06:53

    Olá Celso
    Muito grato por sua atenção.
    Na verdade eu já percorro os registros apenas uma vez, dependendo do status de "Me.SelLoteEmExib".
    Note que eu entro em cada ciclo de For/Next após perguntar apenas uma vez por esse campo.

    .
    .
    .

    If Me.SelLoteEmExib = True Then 'se seleção ativa

    ' Vai para o primeiro reg do recordset.
    formRecords.MoveFirst

    For i = 1 To QtdeRegs
    formRecords.Edit
    formRecords.Fields("LançMarc") = True
    formRecords.Update
    formRecords.MoveNext
    Next i
    .
    .
    .

    Objetivo é "marcar" ou "desmarcar" o campo "LançMarc" de cada registro com True ou False, conforme o conteúdo de "Me.SelLoteEmExib", e não "alternar" o status desse campo.

    Na prática, eu preciso apenas marcar - para processo posterior - os registros filtrados no formulário. A "desgraça" é que a tabela nem é tão grande, mas o processo rodado em cima do "recordsetclone" parece mesmo estar demorando. Penso que se conseguisse fazer poe SQL processaria mais rápido.

    Abrigado mesmo assim.
    A propriedade "RecordsetClone" de fato é prática
    Celso Roberto
    Celso Roberto
    VIP
    VIP

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1060
    Registrado : 01/03/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  Celso Roberto em 6/6/2020, 00:18

    Olá..

    Você fez teste com o código?

    Ele esta alternando o "Me.SelLoteEmExib" ou você deduziu?

    Mas de qualquer forma faça teste com este outro abaixo e nos retorne.

    Caso não consiga, Anexe um exemplo com dados significativos para teste
    e detalhe o o que precisa fazer

    Segue:

    Código:
    Dim Rs As DAO.Recordset
       On Error Resume Next
      
       Set Rs = Me.RecordsetClone
      
       Rs.MoveFirst
       Do While Not Rs.EOF
            With Rs
            .Edit
            If Me.SelLoteEmExib = True Then 'se seleção ativa
                Rs.Fields("LançMarc") = True
            Else
                Rs.Fields("LançMarc") = False
            .Update
           End If
            .MoveNext
            End With
            Loop
                Me.Form.Refresh
                
       Rs.Close
       Set Rs = Nothing

    Oque este ira fazer:
    Se o Me.SelLoteEmExib = true, irá por o  LançMarc = true
    Se o Me.SelLoteEmExib = False, irá por o  LançMarc = False

    è isto que deseja?


    Aguardamos


    .................................................................................


    Você fica satisfeito ao ter sua dúvida solucionada?.
    Quem te ajuda também fica quando você da o tópico por "Resolvido".
    Veja como neste Link: https://www.maximoaccess.com/t860-resolucao-de-topicos



    A Única coisa que sei é que ainda nada sei, Mas em breve Saberei.....
    avatar
    massalin
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 08/09/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  massalin em 6/6/2020, 05:02

    Olá Celso
    Rodei sua sugestão de código e cronometrei.
    Infelizmente não houve melhoras.

    Celso: você por acaso conhece algum código que permita gravar ( sem depender de loop no RecordSet) uma tabela temporária a partir de um RecordSetClone?
    Tentei achar algo nos fóruns mas não encontrei.
    Acredito que se eu conseguisse gravar uma tabela temporária com os dados do RecordSetClone seria moleza atualizar tudo via RunSQL. Bastaria unir a tabela temporária com a tabela (RecordSource) do meu form e manda bala num SQL. SQL costuma ser bem rápido.

    Mesmo assim agradeço muito a atenção. É minha primeira experiência aqui no Máximo estou apreciando.

    Estou enviando o meu banco. O comando que aciona a rotina em questão é uma Caixa de Seleção no cabeçalho do formulário "frmListLançsSemContáb"
    Abraços e fico no aguardo de seus comentários.
    Anexos
    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário AttachmentContrFin_Des_V040100 - Maximo.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (159 Kb) Baixado 2 vez(es)
    Celso Roberto
    Celso Roberto
    VIP
    VIP

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1060
    Registrado : 01/03/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  Celso Roberto em 8/6/2020, 01:24

    Olá..

    Por não entender a mecânica do seu sistema, deixo um exemplo de como aplicar filtro em formulario e criar tabela temporária e atualizar a tabela de origem por SQL.

    Passos:

    - Criei uma consulta "qryLanctos" para criar um campo comum para filtro no formulário.

    - No formulário criei uma combobox "CboContas" para filtrar por tipo de conta e criar a tabela temporária "tblLançsTemp", veja o código no evento após atualizr a combobox.

    - No evento aós atualizar da"SelLoteEmExib", existe o código para atualizar o campo "LançMarc " da tabela temporária de acordo com o selecionado no "SelLoteEmExib" e após atualiza a tabela "tblLançs" de acordo com tabela temporaria.

    Tente aplicar o método no seu banco original.

    Qualquer dificuldade, retorne com passo a passo de como utilizar o seu exemplo para que possamos te ajudar.


    Aguardamos retorno

    Abraços e sucesso
    Anexos
    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário AttachmentContrFin_Des_V040100 - Maximo.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (982 Kb) Baixado 6 vez(es)


    .................................................................................


    Você fica satisfeito ao ter sua dúvida solucionada?.
    Quem te ajuda também fica quando você da o tópico por "Resolvido".
    Veja como neste Link: https://www.maximoaccess.com/t860-resolucao-de-topicos



    A Única coisa que sei é que ainda nada sei, Mas em breve Saberei.....
    avatar
    massalin
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 08/09/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  massalin em 8/6/2020, 05:10

    Olá Celso

    A criação da query para ter campos comuns ao formulário matou o problema.

    Eu sempre utilizei instruções SQL como propriedade RecordSource de meus forms. Assim não precisava ficar criando consultas e mais consultas.

    O fato é que e nunca percebi que quando se usa esse método, os campos que o filtro enxerga tem nomes diferentes dos das tabelas-base do formulário. Sendo assim não conseguiqa referenciar eles no SQL.

    Usando uma query para alimentar o formulário o filtro passou a enxergar os nomes de campos da query, e assim o SQL passou a vê-los.

    Veja como meus filtros eram antes (com o RecordSource do form baseado num SELECT e não numa query):

    (((([frmListLançsSemContáb].[DatLçto]>=#6/1/2017#) AND
    ([Lookup_cboIdFornec].[NomFornec] Like "* Itaú")
    ... o filtro usa "[frmListLançsSemContáb]" ao invés do nome do campo original.

    E agora com sua idéia de criar uma query para alimentar o formulário:

    ((([qry_Base_frmLançsSemContab].[DatLçto]>=#1/6/2017#) AND
    ([Lookup_cboIdFornec].[NomFornec] Like "* Itaú*")
    ... o filtro passou a se referir ao campo da query ([qry_Base_frmLançsSemContab]). Show ...

    Note, ai no segundo argumento do filtro..

    [Lookup_cboIdFornec].[NomFornec] Like "* Itaú*"

    ... que quando se quer filtrar por um fragmento do conteúdo de um ComboBox o filtro volta a enxergar o campo do form, e não o campo da query, mas é só se disciplinar a não filtrar desse jeito que o SQL não vai estranhar o parâmetro.

    Eu uso (e abuso) dos filtros de contesto (aqueles que a gente vai filtrando com o botão direito do mouse sobre os campos dos formulários) . Assim eu vou "refinando" os registros que desejo marcar. Eu tinha tentado já executar um SQL copiando o conteúdo dos filtros do formulário (usando a propriedade Me.Filter) .. para a cláusula "WHERE" do SQL, porém essa propriedade (me.Filter) não se refere aos campos das tabelas do formulário, e sim a campos do próprio formulário, ou seja, o SQL não reconhecia esses parâmetros.. e busquei achar uma solução que pegasse esse set de registros e gravasse a tabela temporária quando eu obtivesse a filtragem ideal .. o RecordSetClone enxerga isso, mas não achei como gravar uma tabela temporária a partir dele.

    A sua rotina baseada em uma query resolveu meu problema.

    Obrigado !!




    Celso Roberto
    Celso Roberto
    VIP
    VIP

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1060
    Registrado : 01/03/2014

    [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário Empty Re: [Resolvido]Utilizar SQL para Tratar Registros Filtrados Via Formulário

    Mensagem  Celso Roberto em 8/6/2020, 23:20

    Olá..

    Ficamos felizes por ter ajudado cheers cheers

    Agradecemos o seu retorno.

    Abraços e sucesso


    .................................................................................


    Você fica satisfeito ao ter sua dúvida solucionada?.
    Quem te ajuda também fica quando você da o tópico por "Resolvido".
    Veja como neste Link: https://www.maximoaccess.com/t860-resolucao-de-topicos



    A Única coisa que sei é que ainda nada sei, Mas em breve Saberei.....

      Data/hora atual: 8/7/2020, 07:49