Fórum Atualizar todos os valores de uma base de dados #459675

28/10/2013

0

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

Responder

Posts

28/10/2013

Itamar Souza

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
Responder

Gostei + 0

28/10/2013

João Pedro

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á!
Responder

Gostei + 0

28/10/2013

Itamar Souza

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
Responder

Gostei + 0

28/10/2013

João Pedro

Desculpe pela ignorância, mas poderia me dar um exemplo?
Responder

Gostei + 0

28/10/2013

Marcos Saffran

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;
Responder

Gostei + 0

28/10/2013

João Pedro


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;
Responder

Gostei + 0

28/10/2013

Marcos Saffran

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).
Responder

Gostei + 0

28/10/2013

João Pedro

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!
Responder

Gostei + 0

28/10/2013

Marcos Saffran

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;
Responder

Gostei + 0

28/10/2013

João Pedro

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.
Responder

Gostei + 0

28/10/2013

Marcos Saffran

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?
Responder

Gostei + 0

28/10/2013

Itamar Souza

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;

.
Responder

Gostei + 0

29/10/2013

João Pedro

sINTO MUITO AMIGOS, MAS AINDA NAO DEU CERTO
Responder

Gostei + 0

29/10/2013

Marcos Saffran

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;
Responder

Gostei + 0

29/10/2013

João Pedro

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar