Gabriel Cabral Postado Fevereiro 24, 2010 Denunciar Share Postado Fevereiro 24, 2010 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Fevereiro 24, 2010 Autor Denunciar Share Postado Fevereiro 24, 2010 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 24, 2010 Denunciar Share Postado Fevereiro 24, 2010 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Fevereiro 24, 2010 Autor Denunciar Share Postado Fevereiro 24, 2010 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çoMas 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 24, 2010 Denunciar Share Postado Fevereiro 24, 2010 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Fevereiro 24, 2010 Autor Denunciar Share Postado Fevereiro 24, 2010 (editado) 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 Fevereiro 24, 2010 por Gabriel Cabral Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 24, 2010 Denunciar Share Postado Fevereiro 24, 2010 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Gabriel Cabral
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
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.