Atualizar todos os valores de uma base de dados

Delphi

28/10/2013

Boa tarde!
Estou desenvolvendo um sistema para lanchonete e preciso que, quando o cliente digitar um valor que quer que aumente, todos os itens daquela categoria sejam atualizados.
Ex: Saladas:
Salada de Queijo --R$5,00
Salada de Tomate --R$7,00

Aumento: R$2,00

Salada de Queijo -- R$7,00
Salada de Tomate --R$9,00

Já tentei alguns códigos, porém não consigo atualizar corretamente, ou mudam todos os valores para o mesmo, ou deixa os campos em branco.

Trabalho com Delphi 7 e base de dados Firebird 2.5.

Desde já, agradeço!
João Pedro

João Pedro

Curtidas 0

Respostas

Itamar Souza

Itamar Souza

28/10/2013

Boa tarde!
Estou desenvolvendo um sistema para lanchonete e preciso que, quando o cliente digitar um valor que quer que aumente, todos os itens daquela categoria sejam atualizados.
Ex: Saladas:
Salada de Queijo --R$5,00
Salada de Tomate --R$7,00

Aumento: R$2,00

Salada de Queijo -- R$7,00
Salada de Tomate --R$9,00

Já tentei alguns códigos, porém não consigo atualizar corretamente, ou mudam todos os valores para o mesmo, ou deixa os campos em branco.

Trabalho com Delphi 7 e base de dados Firebird 2.5.

Desde já, agradeço!



Amigo
Como sabe, se você der um update na tabela pegando o valor atual e acrescentando o novo valor filtrando pela categoria do produto, então não teria erro. Mais veja, você teria que percorrer cada item da categoria, pegar o valor atual + o valor a acrescentar e depois da o update naquele registro e faria isso até finalizar todos os itens da categoria.
Ex:
1 – seleciona todos os itens da categoria
2 – em um while você vai passar por cada um pegando o seu valor atual somando com o valor a acrescentar encontrando assim o novo valor>
3 – você vai fazer o update neste registro e vai seguir para o próximo fazendo a mesma sequencia de passos.
Espero ter ajudado
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Então, eu já tentei fazer dessa maneira, porém não consigo trazer o valor contido na tabela. Vem como se fossem todos em branco.
Segue o código que tentei:

DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.Open;
DB002.ibTablanche.Last;
edtConte.Text:=IntToStr(DB002.ibTablanche.RecordCount);
CONTE:=StrToInt(edtConte.Text);
for I :=0 to CONTE do

begin
edtRecebedabase.Text:=CurrToStr(DB002.ibTablanche.FieldByName('valorunit').AsCurrency+10);
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Update TABLANCHE Set');
DB002.ibTablanche.SQL.Add('valorunit=:vvalorunit');
DB002.ibTablanche.ParamByname('vvalorunit').AsCurrency:=StrToCurr(edtRecebedabase.Text);
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.ExecSQL;
//ShowMessage(IntToStr(I));

Não estou conseguindo encontrar o erro. Já tentei com for, com while e com repeat until.
De repente é qualquer coisa boba, mas como estou imerso no problema não consigo enxergar.
Obrigado desde já!
GOSTEI 0
Itamar Souza

Itamar Souza

28/10/2013

Então, eu já tentei fazer dessa maneira, porém não consigo trazer o valor contido na tabela. Vem como se fossem todos em branco.
Segue o código que tentei:

DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.Open;
DB002.ibTablanche.Last;
edtConte.Text:=IntToStr(DB002.ibTablanche.RecordCount);
CONTE:=StrToInt(edtConte.Text);
for I :=0 to CONTE do

begin
edtRecebedabase.Text:=CurrToStr(DB002.ibTablanche.FieldByName('valorunit').AsCurrency+10);
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Update TABLANCHE Set');
DB002.ibTablanche.SQL.Add('valorunit=:vvalorunit');
DB002.ibTablanche.ParamByname('vvalorunit').AsCurrency:=StrToCurr(edtRecebedabase.Text);
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.ExecSQL;
//ShowMessage(IntToStr(I));

Não estou conseguindo encontrar o erro. Já tentei com for, com while e com repeat until.
De repente é qualquer coisa boba, mas como estou imerso no problema não consigo enxergar.
Obrigado desde já!



Amigo
Veja, você esta fazendo um select e abrindo a tabela e filtrando pela categoria, então nesta tabela conterá todos os registros na categoria. Você pega a quantidade de registros, pega o valor unitário, vai precisar pegar o ID do registro, mais o problema esta sendo você usar a mesma tabela para fazer o Update, você limpa a tabela , faz o update de 1 registro e os demais como fica? Então após o 1º update a tabela vai esta vazia, pois você fechou ela no inicio do primeiro update.
Veja se ajuda
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Desculpe pela ignorância, mas poderia me dar um exemplo?
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

João Pedro,

fiz algumas alterações, mas usei apenas o editor de texto, portanto me desculpe por possíveis erros.

DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.Open;
DB002.ibTablanche.First;  //alterado
while not DB002.ibtablanche.Eof do
begin
idchave := DB002.ibTabLanche.FieldByName('id da tabela'); //não sei qual é o seu campo

edtRecebedabase.Text:=CurrToStr(DB002.ibTablanche.FieldByName('valorunit').AsCurrency+10);
ShowMessage(edtRecebedabase.text); // para você verificar se o valor está correto
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Update TABLANCHE Set');
DB002.ibTablanche.SQL.Add('valorunit=:vvalorunit');
DB002.ibTablanche.ParamByname('vvalorunit').AsCurrency:=StrToCurr(edtRecebedabase.Text);
DB002.ibTablanche.SQL.Add('Where iddatabela=:viddatabela');
DB002.ibTablanche.ParamByName('viddatabela').AsString:=IntToStr(idchave);  //não sei o tipo do seu campo
DB002.ibTablanche.ExecSQL;
DB002.ibtablancha.Next;
end;
GOSTEI 0
João Pedro

João Pedro

28/10/2013


Amigo, fiz assim, mas altera os campos selecionados com o mesmo valor. Vc pode me ajudar?

procedure TfrmProdutos.btnCalularClick(Sender: TObject);
var
CONTE,I:Integer;
begin
dbedtChave.DataSource:=DB001.dsTblanche;
dbedtChave.DataField:='chave';
DB001.ibTablanche.SQL.Clear;
DB001.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB001.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB001.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB001.ibTablanche.Open;
DB001.ibTablanche.Last;
edtConte.Text:=IntToStr(DB001.ibTablanche.RecordCount);
CONTE:=StrToInt(edtConte.Text);
for I :=0 to CONTE do

begin
dbedtChave.DataSource:=DB001.dsTblanche;
dbedtChave.DataField:='categoria';
DB001.ibTablanche.SQL.Clear;
DB001.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB001.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB001.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaAltera.Text;
DB001.ibTablanche.Open;
if dbedtChave.Text=edtCategoriaaltera.Text then
begin

edtRecebedabase.Text:=CurrToStr(DB002.ibTablanche.FieldByName('valorunit').AsCurrency+10);
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Update TABLANCHE Set');
DB002.ibTablanche.SQL.Add('valorunit=:vvalorunit');
DB002.ibTablanche.ParamByname('vvalorunit').AsCurrency:=StrToCurr(edtRecebedabase.Text);
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaAltera.Text;
DB002.ibTablanche.ExecSQL;
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB002.ibTablanche.Open;
//ShowMessage(IntToStr(I));

end;
end;
//Leia mais em: Estrutura de Repetição - Delphi https://www.devmedia.com.br/estrutura-de-repeticao-delphi/16966#ixzz2ixoJXaSp

end;
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

Olá.
no seu update, na cláusula where você está usando a categoria e não o código do produto, da forma que está salvará o mesmo valor para todos os produtos da categoria, por isso, no código que enviei, o programa alterará por código de produto (não precisa preocupar mais com a categoria pois no select já foi selecionada a categoria desejada).
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Mas, se eu fizer pelo código não vou ter que alterar manualmente um a um? Ou estou entendendo errado?
O exemplo não veio. Se não for incomodar, eu realmente gostaria de ver, pois aí eu poderia visualizar melhor.
Desde já, obrigado!
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.Open;
DB002.ibTablanche.First;                                                                                       //alterado
while not DB002.ibtablanche.Eof do
begin
codproduto := DB002.ibTabLanche.FieldByName('código do produto').AsString; //não sei qual é o seu campo, nem o tipo dele (acrescente codproduto nas variáveis).
 
edtRecebedabase.Text:=CurrToStr(DB002.ibTablanche.FieldByName('valorunit').AsCurrency+10);
ShowMessage(edtRecebedabase.text);                                                               // para você verificar se o valor está correto
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Update TABLANCHE Set');
DB002.ibTablanche.SQL.Add('valorunit=:vvalorunit');
DB002.ibTablanche.ParamByname('vvalorunit').AsCurrency:=StrToCurr(edtRecebedabase.Text);
DB002.ibTablanche.SQL.Add('Where iddatabela=:viddatabela');                          //aqui pode usar o código do produto(não sei qual é)
DB002.ibTablanche.ParamByName('viddatabela').AsString:=IntToStr(idchave);  //não sei o tipo do seu campo
DB002.ibTablanche.ExecSQL;
DB002.ibtablancha.Next;
end;
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Oi, amigo! Ajustei o código pra minha necessidade e ficou assim:

var
idchave:Integer;
begin
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
DB002.ibTablanche.ParamByName('vcategoria').AsString:=dbedtChave.Text;
DB002.ibTablanche.Open;
DB002.ibTablanche.First;
//alterado
while not DB002.ibtablanche.Eof do
begin

idchave := DB002.ibTabLanche.FieldByName('chave').AsInteger;
//não sei qual é o seu campo
// para você verificar se o valor está correto
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add('Update TABLANCHE Set');
DB002.ibTablanche.SQL.Add('valorunit=:vvalorunit');
DB002.ibTablanche.ParamByname('vvalorunit').AsCurrency:=StrToCurr(edtRecebedabase.Text);
DB002.ibTablanche.SQL.Add('Where chave=:vchave');
DB002.ibTablanche.ParamByName('vchave').AsString:=IntToStr(idchave);
//não sei o tipo do seu campo
DB002.ibTablanche.ExecSQL;
B002.ibTablanche.Next;
end;
end;


Porém está dando esse erro:
"Cannot perform this operation in a closed database"

Não altera nenhum registro. Tentei colocar uma repesquisa tanto no final quanto no começo, e aí fica fazendo apenas um registro.
Desculpa pela insistência, mas é que preciso realmente muito.
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

Olá João,

em qual linha dá o erro?
Verifiquei suas alterações e tenho uma dúvida, a última linha está assim:
B002.ibTablanche.Next;
não seria
DB002.ibTablanche.Next?
GOSTEI 0
Itamar Souza

Itamar Souza

28/10/2013

Boa noite

Veja se isso lhe ajuda.
att.



procedure TfrmPrincipal.AtualizaPreco;
var
ControleLanche :Integer;
ValorUnitario,ValorAtualizado :Double;
begin

//seleciona os dados que serão atualizados
dmGenerico.cdsGenerico2.Close;
dmGenerico.cdsGenerico2.CommandText := 'select * from tablanche where categoria = ' + QuotedStr(Edit.Text);
dmGenerico.cdsGenerico2.Open;
dmGenerico.cdsGenerico2.First;


while not dmGenerico.cdsGenerico2.Eof do
begin
//pega o controle do lanche
ControleLanche := dmGenerico.cdsGenerico2.FieldByName('controlelanche').AsInteger;
//pega o valor atual do lanche
ValorUnitario := dmGenerico.cdsGenerico2.FieldByName('ValorUnitario').AsFloat;
//calcula o novo valor do lanche
ValorAtualizado:= ValorUnitario;

Try
//atualiza o lanche para o 1º registro encontrado
dmGenerico.cdsGenerico.Close;
dmGenerico.cdsGenerico.CommandText :=

' UPDATE tablanche ' +
' SET '+
' valorunitario = ' + FloatToStr(ValorAtualizado);
' WHERE controlelanche = ' + IntToStr(ControleLanche);

dmGenerico.cdsGenerico.Execute;
Except
On E:Exception Do Begin
MessageDlg('Houve um erro na atualização de preço: '+E.Message,mtInformation,[mbOK],0);
End;
End;

//vai para o próximo registro
dmGenerico.cdsGenerico2.Next;
End;


end;

.
GOSTEI 0
João Pedro

João Pedro

28/10/2013

sINTO MUITO AMIGOS, MAS AINDA NAO DEU CERTO
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

Bom dia João,

o que está dando errado?
Na linha de cálculo do novo valor ela não está calculando nada, apenas buscando o valor antigo
//calcula o novo valor do lanche
ValorAtualizado:= ValorUnitario;
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Bom dia, obrigado pela compreensão e ajuda.
Eu já tentei o código disposto acima, modificando o campo de valor para que somasse, mas ainda nao obtive resultado positivo.
Os campos nao somam nada...
Ainda estou tentando uma solução.
Dese já, grsto.
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

Olá João,

quando usamos o 'commandtext' o data set provider deve ter a opção (options) poAllowCommandText configurada para true, senão o 'commandtext' será ignorado.
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Bom dia!
Eu adpatei para utilizar com o IBQuery.
É necessário utilizar com o CommandText mesmo? Desculpa a ignorância, mas em que paleta ele pode ser encontrado?
Estou utlizando o Delphi 7.
Desde já, obrigado!
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

Com interbase não vou poder te ajudar muito não, mas o seu ibquery está sendo usado em conjunto com um ibupdatesql?
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Sim, amigo. Porém continua não funcionando...
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

Recomendo que use o Firebird ISQLTool e execute o comando de atualização e verifique se funcionou.

Se não funcionar teremos que rever o comando sql, se funcionar teremos que verificar no programa.
GOSTEI 0
João Pedro

João Pedro

28/10/2013

ISQL, me desculpe, masde qe linguagem se trata. Pode me exemplificar?
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

é o editor de comandos sql do firebird, com ele você pode executar comandos sql e verificar os resultados,

quando aberto execute o comando:
CONNECT Nome_do_Banco_de_Dados;

com ele conectado use o comando:
UPDATE tablanche SET valorunitario = valordesejado WHERE controlelanche = código_do_controle
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Boa tarde, será que não encontro algum amigo que possa me ajudar.
GOSTEI 0
Marcos Saffran

Marcos Saffran

28/10/2013

João,

eu tentei te ajudar, mas se você quer trabalhar com banco de dados e não conhece a linguagem dele, nesse caso o SQL, fica difícil.
GOSTEI 0
Itamar Souza

Itamar Souza

28/10/2013

Boa tarde, será que não encontro algum amigo que possa me ajudar.



Amigo
A sua resposta esta no código que postei, um modelo para você seguir como base mais que iria funcionar com certeza, acho que esta faltando um pouco de atenção, veja que você pergunta que no ValorAtualiza := valorUnitario; você diz que não esta atualizando simplesmente porque tem um comentário logo a cima onde diz para naquele ponto você fazer o seu calculo, a resposta esta simples, mais já que você fez baseado no modelo então posta ai seu código.
att
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Eis o meu código. Peço que analise, pois realmente, já tentei todas as soluções que vocês sugeriram e até agora não consegui:

procedure TfrmProdutos.Button2Click(Sender: TObject);
var

  i: integer;
  categoria:Double;
  valoruni:string;

 begin
                DB002.ibTablanche.SQL.Clear;
                DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
                DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
                DB002.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaaltera.Text;
                DB002.ibTablanche.Open;
                DB002.ibTablanche.Last;
                DB002.ibTablanche.RecordCount;

   for i := 0 to DB001.ibTablanche.RecordCount do
  begin
                DB001.ibTablanche.SQL.Clear;
                DB001.ibTablanche.SQL.Add('Select* From TABLANCHE');
                DB001.ibTablanche.SQL.Add('Where categoria=:vcategoria');
                DB001.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaaltera.Text;
                DB001.ibTablanche.Open;
                ////////////////////////////////////////////////////////////
                {OBS A linha abaixo  armazenaro valor que está na tabela}
                //////////////////////////////////////////////////////////
                valoruni:=DB002.ibTablanche.FieldByname('valorunit').AsCurrency;
                DB001.ibTablanche.SQL.Clear;
                DB001.ibTablanche.SQL.Add('Update TABLANCHE Set');
                DB001.ibTablanche.SQL.Add('valorunit=:vvalorunit');
                ////////////////////////////////////////////////////////////
                {OBS A linha abaixo  recebe o valor  da  variável  valoruni + 10 }
                //////////////////////////////////////////////////////////
                DB001.ibTablanche.ParamByname('vvalorunit').AsCurrency:=categoria+valoruni+10;
                ////////////////////////////////////////////////////////////
                {OBS Na linha baixo  é feita uma pesquisa pelo campo categoria, }
                { Na qual, segundo o laço, deveria alterar o campo valorunit linha a linha até o final}
                { Do RecordCount, o que até acontece, mas altera todos os valores como se fossem um só.}
                {Exemplo: se a primeira linha tem o valor 10,  recebe + 10, ficaria  20}
                {Só que as demais linhas ficam com o mesmo valor, ou seja 20, mesmo que seu valor anterior fosse 30}
                {Que daria o resultado de 40 e não 20. Sei que está faltando algum argumento, estou quebrando a cabeça}
                {Para acha uma solução mas ainda não encontrei}
                //////////////////////////////////////////////////////////

                DB001.ibTablanche.SQL.Add('Where categoria=:vcategoria');
                DB001.ibTablanche.ParamByName('vcodigol').AsString:=dbedtChave.Text;
                DB001.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaaltera.Text;
                DB001.ibTablanche.ExecSQL;
                 {.... corpo principal do looping ...}
                Application.ProcessMessages;
               { tecla ESC para o looping }
   if            GetKeyState(VK_Escape) and DB001.ibTablanche.RecordCount=i then
     break;
  end;
 end;
              {Sei que para alguns programadores isto pode parecer muito fácil, mas para mim ainda está dificil.}
              {Peço aos amigos que estão lendo que me ajudem, pois meu projeto está parado por conta deste detalhe}
GOSTEI 0
Itamar Souza

Itamar Souza

28/10/2013

Eis o meu código. Peço que analise, pois realmente, já tentei todas as soluções que vocês sugeriram e até agora não consegui:

procedure TfrmProdutos.Button2Click(Sender: TObject);
var

  i: integer;
  categoria:Double;
  valoruni:string;

 begin
                DB002.ibTablanche.SQL.Clear;
                DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
                DB002.ibTablanche.SQL.Add('Where categoria=:vcategoria');
                DB002.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaaltera.Text;
                DB002.ibTablanche.Open;
                DB002.ibTablanche.Last;
                DB002.ibTablanche.RecordCount;

   for i := 0 to DB001.ibTablanche.RecordCount do
  begin
                DB001.ibTablanche.SQL.Clear;
                DB001.ibTablanche.SQL.Add('Select* From TABLANCHE');
                DB001.ibTablanche.SQL.Add('Where categoria=:vcategoria');
                DB001.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaaltera.Text;
                DB001.ibTablanche.Open;
                ////////////////////////////////////////////////////////////
                {OBS A linha abaixo  armazenaro valor que está na tabela}
                //////////////////////////////////////////////////////////
                valoruni:=DB002.ibTablanche.FieldByname('valorunit').AsCurrency;
                DB001.ibTablanche.SQL.Clear;
                DB001.ibTablanche.SQL.Add('Update TABLANCHE Set');
                DB001.ibTablanche.SQL.Add('valorunit=:vvalorunit');
                ////////////////////////////////////////////////////////////
                {OBS A linha abaixo  recebe o valor  da  variável  valoruni + 10 }
                //////////////////////////////////////////////////////////
                DB001.ibTablanche.ParamByname('vvalorunit').AsCurrency:=categoria+valoruni+10;
                ////////////////////////////////////////////////////////////
                {OBS Na linha baixo  é feita uma pesquisa pelo campo categoria, }
                { Na qual, segundo o laço, deveria alterar o campo valorunit linha a linha até o final}
                { Do RecordCount, o que até acontece, mas altera todos os valores como se fossem um só.}
                {Exemplo: se a primeira linha tem o valor 10,  recebe + 10, ficaria  20}
                {Só que as demais linhas ficam com o mesmo valor, ou seja 20, mesmo que seu valor anterior fosse 30}
                {Que daria o resultado de 40 e não 20. Sei que está faltando algum argumento, estou quebrando a cabeça}
                {Para acha uma solução mas ainda não encontrei}
                //////////////////////////////////////////////////////////

                DB001.ibTablanche.SQL.Add('Where categoria=:vcategoria');
                DB001.ibTablanche.ParamByName('vcodigol').AsString:=dbedtChave.Text;
                DB001.ibTablanche.ParamByName('vcategoria').AsString:=edtCategoriaaltera.Text;
                DB001.ibTablanche.ExecSQL;
                 {.... corpo principal do looping ...}
                Application.ProcessMessages;
               { tecla ESC para o looping }
   if            GetKeyState(VK_Escape) and DB001.ibTablanche.RecordCount=i then
     break;
  end;
 end;
              {Sei que para alguns programadores isto pode parecer muito fácil, mas para mim ainda está dificil.}
              {Peço aos amigos que estão lendo que me ajudem, pois meu projeto está parado por conta deste detalhe}
Bom dia

Segue um exemplo usando o que você passou.

espero que lhe ajude!!





procedure TForm1.Button1Click(Sender: TObject);
var
  ControleLanche :Integer;
  ValorUnitario,ValorAtualizado  :Double;
 begin
                DB002.ibTablanche.Close;
                DB002.ibTablanche.SQL.Clear;
                DB002.ibTablanche.SQL.Add(''Select* From TABLANCHE'');
                DB002.ibTablanche.SQL.Add(''Where categoria= '' + QuotedStr(edtCategoriaaltera.Text));
                DB002.ibTablanche.Open;
                //posiciona no 1º registro
                DB002.ibTablanche.First;


                 while not DB002.ibTablanche.Eof do
                 begin

                     //pega o controle do lanche
                     ControleLanche := DB002.ibTablanche.FieldByName(''controlelanche'').AsInteger;
                     //pega o valor atual do lanche
                     ValorUnitario  := DB002.ibTablanche.FieldByName(''valorunitario'').AsFloat;
                     //calcula o novo valor do lanche (é para fazer o calculo aqui !!)
                     ValorAtualizado:= ValorUnitario;

                      Try
                        //atualiza o lanche
                        DB002.ibTablanche2.Close;
                        DB002.ibTablanche2.SQL.Clear;
                        DB002.ibTablanche2.SQL.Add(''UPDATE From TABLANCHE '');
                        DB002.ibTablanche2.SQL.Add('' SET '');
                        DB002.ibTablanche2.SQL.Add('' valorunitario  = '' + FloatToStr(ValorAtualizado));
                        DB002.ibTablanche2.SQL.Add('' WHERE controlelanche  = '' + IntToStr(ControleLanche));
                        DB002.ibTablanche2.ExecSQL;
                       Except
                        On E:Exception Do Begin
                          MessageDlg(''Houve um erro na atualização de preço: ''+E.Message,mtInformation,[mbOK],0);
                        End;
                       End;

                       //vai para o próximo registro
                     DB002.ibTablanche.Next;
                 End;

end;


Segue um exemplo;
att

procedure TForm1.Button1Click(Sender: TObject);
var
  ControleLanche :Integer;
  ValorUnitario,ValorAtualizado  :Double;
 begin
                DB002.ibTablanche.Close;
                DB002.ibTablanche.SQL.Clear;
                DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
                DB002.ibTablanche.SQL.Add('Where categoria= ' + QuotedStr(edtCategoriaaltera.Text));
                DB002.ibTablanche.Open;
                //posiciona no 1º registro
                DB002.ibTablanche.First;


                 while not DB002.ibTablanche.Eof do
                 begin

                     //pega o controle do lanche
                     ControleLanche := DB002.ibTablanche.FieldByName('controlelanche').AsInteger;
                     //pega o valor atual do lanche
                     ValorUnitario  := DB002.ibTablanche.FieldByName('valorunitario').AsFloat;
                     //calcula o novo valor do lanche (é para fazer o calculo aqui !!)
                     ValorAtualizado:= ValorUnitario;

                      Try
                        //atualiza o lanche
                        DB002.ibTablanche2.Close;
                        DB002.ibTablanche2.SQL.Clear;
                        DB002.ibTablanche2.SQL.Add('UPDATE From TABLANCHE ');
                        DB002.ibTablanche2.SQL.Add(' SET ');
                        DB002.ibTablanche2.SQL.Add(' valorunitario  = ' + FloatToStr(ValorAtualizado));
                        DB002.ibTablanche2.SQL.Add(' WHERE controlelanche  = ' + IntToStr(ControleLanche));
                        DB002.ibTablanche2.ExecSQL;
                       Except
                        On E:Exception Do Begin
                          MessageDlg('Houve um erro na atualização de preço: '+E.Message,mtInformation,[mbOK],0);
                        End;
                       End;

                       //vai para o próximo registro
                     DB002.ibTablanche.Next;
                 End;

end;


GOSTEI 0
João Pedro

João Pedro

28/10/2013

Boa tarde, ITAMAR P SOUZA
Teste o exeplo que você me mandou. Ele entra em loop e não funciona.
Agradeço seu esforço em querer ajudar, mas ainda não obtemos resultado esperado.
GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

28/10/2013

Boa noite, fazendo desse jeito aqui deveria servir.

PRECO := 10;

S := 'UPDATE TABLANCHE SET valorunit = valorunit ' + IntToStr(PRECO) + ' WHERE CATEGORIA LIKE ' + QuotedStr(dbedtChave.Text + '%');

DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add(S);
DB002.ibTablanche.ExecSql;


Só para ressaltar, tu não precisa fazer looping nenhum porque o update já vai atualizar todos registros da tabela que forem da categoria que for passada.

Outra coisa eu faria de outra maneira, pois não uso a mesma paleta que tu ta usando, eu executaria no proprio SqlConnection da aba dbExpress, enfim, espero que tenha te ajudado...




Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Itamar Souza

Itamar Souza

28/10/2013

Boa tarde, ITAMAR P SOUZA
Teste o exeplo que você me mandou. Ele entra em loop e não funciona.
Agradeço seu esforço em querer ajudar, mas ainda não obtemos resultado esperado.



[code]
João, vou tentar ser mais claro no exemplo que lhe mandei.
Veja :

procedure TForm1.Button1Click(Sender: TObject);
var
ControleLanche :Integer;
ValorUnitario,ValorAtualizado :Double;
Begin

1 - Você tem uma tabela com vários produtos e cada produto tem um preço.

DB002.ibTablanche.Close;
DB002.ibTablanche.SQL.Clear;
DB002.ibTablanche.SQL.Add(''Select* From TABLANCHE'');
DB002.ibTablanche.SQL.Add(''Where categoria= '' + QuotedStr(edtCategoriaaltera.Text));
DB002.ibTablanche.Open;

2- nesta consulta você esta selecionando todos os produtos que precisa que o preço seja atualizado e posicionando no primeiro registro encontrado.


//posiciona no 1º registro
DB002.ibTablanche.First;

3- Você falou que entra em loop, como isso é possível? Visto que no exemplo esta percorrendo a tabela que foi usada logo à cima para filtra os dados, ela não é infinita portanto não tem como entra em loop.


while not DB002.ibTablanche.Eof do
begin

//4 – neste ponto você esta pegando o ID do produto, ele será utilizado no comando update.
ControleLanche := DB002.ibTablanche.FieldByName(''controlelanche'').AsInteger;
//5- aqui você esta pegando o valor atual do produto
ValorUnitario := DB002.ibTablanche.FieldByName(''valorunitario'').AsFloat;
//6 – aqui você vai fazer o calculo do preço final do produto
ValorAtualizado:= ValorUnitario;

Try
//7 – neste ponto você esta usando uma query nova para passar um comando update andando atualiza 1 produto cada vez que for encontrado
DB002.ibTablanche2.Close;
DB002.ibTablanche2.SQL.Clear;
DB002.ibTablanche2.SQL.Add(''UPDATE From TABLANCHE '');
DB002.ibTablanche2.SQL.Add('' SET '');
DB002.ibTablanche2.SQL.Add('' valorunitario = '' + FloatToStr(ValorAtualizado));
DB002.ibTablanche2.SQL.Add('' WHERE controlelanche = '' + IntToStr(ControleLanche));
DB002.ibTablanche2.ExecSQL;
Except
On E:Exception Do Begin
MessageDlg(''Houve um erro na atualização de preço: ''+E.Message,mtInformation,[mbOK],0);
End;
End;

//8 aqui você esta indo para o próximo registro da tabela que você abriu no inicio do processo
DB002.ibTablanche.Next;
End;

end;

Agora, talvez os nomes dos campos, ou tabela não estejam exatamente igual, mais este exemplo vai funcionar desde que você tenha condições de seguir este modelo. Você tem ai à resposta pronta, só falta ajustar ao que precisa, se você fez este modelo então posta seu código e me mostra como é possível este código entra em loop
att

[code]
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Bom dia! Amigo Itamar, muito obrigado pela força! O código que me mandou deu certo! Ufa!
Espero poder ajudar em outras dificuldade que aparecerem no futuro.
Segue abaixo o código adaptado e funcionando.

procedure TfrmProdutos.btnUpdateClick(Sender: TObject);
   var
               ControleLanche:Integer;
               ValorUnitario,ValorAtualizado:Double;

 begin
                DB002.ibTablanche.Close;
                DB002.ibTablanche.SQL.Clear;
                DB002.ibTablanche.SQL.Add('Select* From TABLANCHE');
                DB002.ibTablanche.SQL.Add('Where  categoria='+QuotedStr(edtCategoriaaltera.Text));
                DB002.ibTablanche.Open;
                ///////////////////////
                DB002.ibTablanche.First;
                ///////////////////////
  while not     DB002.ibTablanche. Eof do
  begin
                ControleLanche:=DB002.ibTablanche.FieldByname('numero').AsInteger;
                ValorUnitario:=DB002.ibTablanche.FieldByname('valorunit').AsCurrency;
                ValorAtualizado:=ValorUnitario+10;
                //////////////////////////////
   try

                DB001.ibTablanche.Close;
                DB001.ibTablanche.SQL.Clear;
                DB001.ibTablanche.SQL.Add('Update  TABLANCHE');
                DB001.ibTablanche.SQL.Add('Set');
                DB001.ibTablanche.SQL.Add('valorunit='+FloatTostr(ValorAtualizado));
                DB001.ibTablanche.SQL.Add('Where numero='+IntTostr(ControleLanche));
                DB001.ibTablanche.ExecSQL;
                except
                //////
   oN           E:Exception   do
    begin
                MessageDlg('Houve um erro na atualização de peço:'+E.Message,mtInformation,[mbOK],0);
    end;
   end;

                DB002.ibTablanche.Next;
  end;
 end;
end. 
GOSTEI 0
João Pedro

João Pedro

28/10/2013

Amigo Marcos, muito obrigado pela disposição em ajudar!
Certamente sem os seus conselhos, não teríamos chegado à versão final do código.
Um bom dia aos dois.
GOSTEI 0
POSTAR