update no firedac
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' .
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
Curtidas 0
Melhor post
Luiz Vichiatto
23/10/2017
Julio
Há um erro no seu código
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
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
GOSTEI 1
Mais Respostas
Julio Cesar
21/10/2017
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?
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?
GOSTEI 0
Luiz Vichiatto
21/10/2017
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
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
GOSTEI 0
Rafael Bosco
21/10/2017
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);
GOSTEI 0
Julio Cesar
21/10/2017
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.
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.
GOSTEI 1
Felipe
21/10/2017
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.
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
GOSTEI 0
Vicente Santos
21/10/2017
gostaria de saber como posso fazer inserção com o updatesql do firedac.
GOSTEI 0