update no firedac

21/10/2017

0

Boa tarde, a todos preciso de uma ajuda estou tentando implemaentar um update numa tabela no postgres com FIREDAC e so me retorna erro e nao sei como resolver, estou usando o Delphi 10 Seatle , segue ai parte do codigo que coloquei num button para o update.

FDQuery.Active := False;
FDQuery.Close;
FDQuery.SQL.Clear;
FDQuery.SQL.Add('update produtos_ou set qtde = :qtde where (codigo_interno = :codigo_interno)');
FDQuery.SQL.Add('value (:qtde)');
FDQuery.Prepare;

FDQuery.ParamByName('qtd').AsString := edtQuantAtual.Text;
//FDQuery.ParamByName('qtde').Value:= edtQuantAtual.Text;

FDQuery.ExecSQL;

essa tabela tem 3 campos distintos que sao "qtde_min, qtde, codigo_interno" no caso preciso alterar o dado campo 'qtde' .
Julio Cesar

Julio Cesar

Responder

Post mais votado

23/10/2017

Julio

Há um erro no seu código
FDQuery.Active := False;
FDQuery.Close;
FDQuery.SQL.Clear;
FDQuery.SQL.Add('update produtos_ou set qtde = :qtde where (codigo_interno = :codigo_interno)');
//FDQuery.SQL.Add('value (:qtde)'); // esta linha não é necessária
//FDQuery.Prepare; ///este é antes do execsql
FDQuery.ParamByName('qtd').AsString := edtQuantAtual.Text;
//FDQuery.ParamByName('qtde').Value:= edtQuantAtual.Text;
FDQuery.ParamByName('codigo_interno').AsString := codigo_interno; // e falta esta linha
FDQuery.Prepare;
FDQuery.ExecSQL;


Quando você adiciona o ":VARIVEl", o componente já entende que é necessário a entrada de dados.
A condição "value(...)" é necessária quando está persistindo uma nova linha na tabela.

att

Luiz Vichiatto

Luiz Vichiatto
Responder

Mais Posts

23/10/2017

Julio Cesar

Ola boa noite ainda não deu certo, esqueci de mencionar que o campo questão e do tipo 'double precision'
conforme verifiquei agora.
segue novamente a sintaxe.

if FDQuery.Active then
FDQuery.Close;
FDQuery.SQL.Clear;
FDQuery.SQL.Add('update produtos_ou set qtde = :qtd where (codigo_interno = :codigo)');

FDQuery.ParamByName('qtd').Value := StrToFloat(edtQuantAtual.Text);
// FDQuery.ParamByName('qtd').AsString := StrToFloat(edtQuantAtual.Text);
FDQuery.ParamByName('codigo').AsString := edtCodInterno.Text;

FDQuery.Prepare;
FDQuery.ExecSQL;

mesmo fazendo uma conversão, não sei se o correto da um erro de ' " is not a valid floating point value.'
como corrigir isso?
Responder

24/10/2017

Luiz Vichiatto

Julio, não costumo utilizar o double precision por ter problemas com cálculos, tem dois links falando sobre este assunto, segue!

https://www.devmedia.com.br/forum/duvida-sobre-campo-do-tipo-double-precision/49330

http://www.activedelphi.com.br/forum/viewtopic.php?t=55592&sid=55575e1c296e3500c89cb688043dfa6b
Responder

24/10/2017

Rafael Bosco

Utilize o tipo de variavél CURRENCY, o .VALUE é um VARIANT, ou seja, qualquer valor que ser recebido por ele, ele fará a tratativa nativa do Delphi, e valores correntes (Double, Float, Extended, etc...) são remodelados e alterados causando divergência no seu arredondamento e cálculos, por isso deve se usar o CURRENCY.
  FDQuery.ParamByName('qtd').AsCurrency := StrToCurr(edtQuantAtual.Text);
Responder

26/10/2017

Julio Cesar

Bom dia, resolvi usando um FDTable fazendo update no banco com campos StrToFloat(edit.text).
segue o codigo.

procedure TfrmMainEstoque.btnAlterarClick(Sender: TObject);
begin
//
FDTableProd_ib.Active := False;
FDTableProd_ib.Close;
FDTableProd_ib.SQL.Clear;
FDTableProd_ib.SQL.Add('update produtos_ib set preco_compra = :custo, preco_venda = :venda '+
'where codigo_interno = '+ edtCodInterno.Text);

FDTableProd_ib.ParamByName('custo').value := StrToFloat(edtCusto.Text);
FDTableProd_ib.ParamByName('venda').value := StrToFloat(edtVenda.Text);

FDTableProd_ib.Prepare;
FDTableProd_ib.ExecSQL;

end;

para quem tiver duvidas, obrigado a todos.
Responder

06/10/2019

Felipe

Bom dia, resolvi usando um FDTable fazendo update no banco com campos StrToFloat(edit.text).
segue o codigo.

procedure TfrmMainEstoque.btnAlterarClick(Sender: TObject);
begin
//
FDTableProd_ib.Active := False;
FDTableProd_ib.Close;
FDTableProd_ib.SQL.Clear;
FDTableProd_ib.SQL.Add('update produtos_ib set preco_compra = :custo, preco_venda = :venda '+
'where codigo_interno = '+ edtCodInterno.Text);

FDTableProd_ib.ParamByName('custo').value := StrToFloat(edtCusto.Text);
FDTableProd_ib.ParamByName('venda').value := StrToFloat(edtVenda.Text);

FDTableProd_ib.Prepare;
FDTableProd_ib.ExecSQL;

end;

para quem tiver duvidas, obrigado a todos.


Velho, resolveu aqui pra mim, valeu
Responder

11/12/2019

Vicente Santos

gostaria de saber como posso fazer inserção com o updatesql do firedac.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar