Ir para conteúdo
Fórum Script Brasil
  • 0

Manipular registros resultantes de busca


Gabriel Cabral

Pergunta

Oi gente... parece uma coisa simples, mas eu estou apanhando aqui..

Em uma tabela, faço uma busca para retornar os registros que tem no campo 'CMPNOT' um valor passado por parâmetro.

Supondo que foram encontrados 3 registros...

A partir daí, preciso percorrer somente esses registros para alterar o valor de alguns outros campos.

Preciso fazer isso diretamente na tabela....

Estava tentando com Locate, While, mas nada dava certo...

O máximo que consegui foi alterar somente o primeiro desses 3 registros, mas algo estava errado porque deu um loop infinito aqui.

Como eu poderia fazer? alguém me sugere algo...

OBS.: Preciso fazer com Locate, pra alterar diretamente na tabela.

Obrigado

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Consegui fazer aqui de uma forma...

Se houver uma maneira de fazer e alguém puder sugerir..

if txtCadCompras_Mode.Text = 'MODO ALTERAÇÃO' then
  begin
    if (txtCadCompras_NumNota  .Text <> txtCadCompras_AuxNumNota  .Text) OR
       (txtCadCompras_Data     .Text <> txtCadCompras_AuxData     .Text) OR
       (txtCadCompras_Frete    .Text <> txtCadCompras_AuxFrete    .Text) OR
       (txtCadCompras_IPI      .Text <> txtCadCompras_AuxIPI      .Text) OR
       (txtCadCompras_ValorNota.Text <> txtCadCompras_AuxValorNota.Text) OR
       (txtCadCompras_Acrescimo.Text <> txtCadCompras_AuxAcrescimo.Text) OR
       (txtCadCompras_Desconto .Text <> txtCadCompras_AuxDesconto .Text) then
    begin

      txtCadCompras_AuxValorNota.Text := txtCadCompras_ValorNota.Text;
      auxNumNota := txtCadCompras_AuxNumNota.Text;

      With QueryCadCompras Do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT * FROM ESTACMP.dbf');
        SQL.Add('WHERE CMPNOT = :pNot');

        ParamByName('pNot').AsString := auxNumNota;

        Open;

        QueryCadCompras.First;
        while QueryCadCompras.Eof = False do
        begin
          nota := QueryCadCompras.FieldByName('CMPNOT').Value;
          prod := QueryCadCompras.FieldByName('CMPPRO').Value;

          if dm.ESTACMP.Locate('CMPNOT;CMPPRO', VarArrayOf([nota,prod]), []) then
          begin

            dm.ESTACMP.Open;
            dm.ESTACMP.Edit;

            dm.ESTACMPCMPNOT.Value := txtCadCompras_AuxNumNota.Text;
            dm.ESTACMPCMPDAT.Value := StrToDateTimeDef(txtCadCompras_Data.Text,0);
            dm.ESTACMPCMPFRE.Value := StrToFloatDef(txtCadCompras_Frete.Text,0);
            dm.ESTACMPCMPIPI.Value := StrToFloatDef(txtCadCompras_IPI.Text,0);
            dm.ESTACMPCMPACR.Value := StrToFloatDef(txtCadCompras_Acrescimo.Text,0);
            dm.ESTACMPCMPDSC.Value := StrToFloatDef(txtCadCompras_Desconto.Text,0);

            dm.ESTACMP.Post;
          end;

          QueryCadCompras.Next;
        end;
      end;
    end;
  end;

Muito obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
Em uma tabela, faço uma busca para retornar os registros que tem no campo 'CMPNOT' um valor passado por parâmetro.

Supondo que foram encontrados 3 registros...

A partir daí, preciso percorrer somente esses registros para alterar o valor de alguns outros campos.

Preciso fazer isso diretamente na tabela....

Estava tentando com Locate, While, mas nada dava certo...

O máximo que consegui foi alterar somente o primeiro desses 3 registros, mas algo estava errado porque deu um loop infinito aqui.

Como eu poderia fazer? alguém me sugere algo...

OBS.: Preciso fazer com Locate, pra alterar diretamente na tabela.

tente esta mudança:

QueryCadCompras.First;
        while not QueryCadCompras.Eof do
        begin
          nota := QueryCadCompras.FieldByName('CMPNOT').Value;
          prod := QueryCadCompras.FieldByName('CMPPRO').Value;

          dm.ESTACMP.First;          

          if dm.ESTACMP.Locate('CMPNOT;CMPPRO', VarArrayOf([nota,prod]), []) then
          begin

            dm.ESTACMP.Open;
            dm.ESTACMP.Edit;

            dm.ESTACMPCMPNOT.Value := txtCadCompras_AuxNumNota.Text;
            dm.ESTACMPCMPDAT.Value := StrToDateTimeDef(txtCadCompras_Data.Text,0);
            dm.ESTACMPCMPFRE.Value := StrToFloatDef(txtCadCompras_Frete.Text,0);
            dm.ESTACMPCMPIPI.Value := StrToFloatDef(txtCadCompras_IPI.Text,0);
            dm.ESTACMPCMPACR.Value := StrToFloatDef(txtCadCompras_Acrescimo.Text,0);
            dm.ESTACMPCMPDSC.Value := StrToFloatDef(txtCadCompras_Desconto.Text,0);

            dm.ESTACMP.Post;
          end;

          QueryCadCompras.Next;
        end;

OBS: Não é uma maneira muito correta, pois se o seu dm.ESTACMP contiver muitos registros, a performance cai muito com a utilização do locate ... entretanto de voce usar um Select com parametros [nota,prod], tambem para dm.ESTACMP, isso agilizaria muito o processo.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

OBS: Não é uma maneira muito correta, pois se o seu dm.ESTACMP contiver muitos registros, a performance cai muito com a utilização do locate ... entretanto de voce usar um Select com parametros [nota,prod], tambem para dm.ESTACMP, isso agilizaria muito o processo.

abraço

Mas se eu utilizar um Select com parametros [nota,prod], não vou conseguir atualizar os valores dos registros da tabela, pois vou estar manipulando os resultados da query, certo? ou não?

Se pudesse me ajudar a utilizar algo que não desse problema na performance..

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
Mas se eu utilizar um Select com parametros [nota,prod], não vou conseguir atualizar os valores dos registros da tabela, pois vou estar manipulando os resultados da query, certo? ou não?

voce consegue alterar registros usando table ou query.

Voce tera um select para QueryCadCompras e tera um select para dm.ESTACMP passando os parametros de QueryCadCompras para dm.ESTACMP , dentro de um while como já esta fazendo.

a unica diferença é que não vai precisar usar o locate, pois a cada passagem do while, somente um unico registro de dm.ESTACMP com os parametros selecionados é que será trazido por vez e que voce podera executar as modificações no registro dessa query ( dm.ESTACMP )

fica muito mais rapida a execução e menos trafego de registros no caso de ser em rede

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Nossa.... acho que estou meio confuso...

Se eu buscar registros com uma TQuery e altera-los, eu estarei alterando o resultado da query, e não os registros na tabela...

Por isso utilizo o Locate depois, mesmo sabendo da performance não muito boa.

Não sei se o que eu entedo e faço é certo.

Agora me perdi :(

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0
Se eu buscar registros com uma TQuery e altera-los, eu estarei alterando o resultado da query, e não os registros na tabela...
Uma query nada mais é do que uma copia de sua tabela ( que voce pode trabalhar com todos os registros ou somente alguns... quando voce usa parametros, voce esta aplicando um filtro na sua tabela e somente os registros selecionados da sua tabela é que farão parte da query ) ....

quando voce modifica os registros de uma query e depois da o comando Post e ApplayUpdates , voce atualiza a sua tabela com esses registros.

Não sei se o que eu entedo e faço é certo.

isso só indica que voce não conhece tão bem o delphi e que precisa melhorar o aprendizado com mais leitura sobre o assunto.

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...