Como Subtrair Valores

Delphi

04/03/2013

Bom dia pessoal to com pequeno problema, tenho 3 dbedits.

Dbedit1 = a Valor documento
Dbedit2 = a Valor pago
Dbedit3 = a Restante

preciso que quando eu colocar o valor no Dbedit1 e no Dbedit2 ele diminua e mostre no Dbedit3 o restante.
Ex: Dbedit1 = 10,00 - Dbedit2 = 5,00 ai Dbedit3 vai ser igual a 5,00.
neste exemplo o valor do documento é 10,00 e o valor pago foi 5,00 então o restante é 5,00.


Bom eu uso Delphi 2010, banco de dados Firebird, sqlconection, TSQLQuery, ClienteDataset.


Desde já Obrigado!
Francielio Medeiros

Francielio Medeiros

Curtidas 0

Respostas

Wilton Júnior

Wilton Júnior

04/03/2013

Acho que é isso que vc precisa:

DBEdit3.text := IntToStr(StrToInt(DbEdit1.text) - StrToInt(DBEdit2.text));
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Acho que é isso que vc precisa:

DBEdit3.text := IntToStr(StrToInt(DbEdit1.text) - StrToInt(DBEdit2.text));


Ok, só mais uma duvida como sou iniciante, onde eu colocaria esse codigo???
GOSTEI 0
Wilton Júnior

Wilton Júnior

04/03/2013

pode coloca dentro no evento onclick de um botão qualquer, ou no evento onexit do dbedit3 e também pode colocar no evento onchange do DBEdit3.
GOSTEI 0
José

José

04/03/2013

Se for utilizar um botão para realizar isso poe dentro do onclick do botão.
que dai ao clicar no botão o DBEdit3.text receberá o resultado do DBEdit1,text - DBEdit2,text
GOSTEI 0
Luiz Menin

Luiz Menin

04/03/2013

Acho que é isso que vc precisa:

DBEdit3.text := IntToStr(StrToInt(DbEdit1.text) - StrToInt(DBEdit2.text));


Só uma correção: como será tratado valores com vírgula, o correto seria:

DBEdit3.text := FloatToStr(StrToFloat(DbEdit1.text) - StrToFloat(DBEdit2.text));


Outra coisa: o evento que você poderia utilizar é no OnExit dos DBEdit1 e DBEdit2.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Acho que é isso que vc precisa:

DBEdit3.text := IntToStr(StrToInt(DbEdit1.text) - StrToInt(DBEdit2.text));


Ok, só mais uma duvida como sou iniciante, onde eu colocaria esse codigo???


Apresentou o seguinte Erro:
First chance exception at $7608969b. Exception class EConvertError with message ""is not a Valid integer value'. Process MSCeramica.exe (4980)
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Acho que é isso que vc precisa:

DBEdit3.text := IntToStr(StrToInt(DbEdit1.text) - StrToInt(DBEdit2.text));


Só uma correção: como será tratado valores com vírgula, o correto seria:

DBEdit3.text := FloatToStr(StrToFloat(DbEdit1.text) - StrToFloat(DBEdit2.text));


Outra coisa: o evento que você poderia utilizar é no OnExit dos DBEdit1 e DBEdit2.


deu esse erro is not valid floating
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Pessoal Lembrando que coloquei no banco os campos como Numeric 14,2....
GOSTEI 0
Luiz Menin

Luiz Menin

04/03/2013

Você está colocando algum valor padrão nos Edit's?
Deixe por padrão os valores 0,00.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Você está colocando algum valor padrão nos Edit's?
Deixe por padrão os valores 0,00.


EU ESTOU USANDO DBEDIT

E COLOCO COMO CURRENCY
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Mudei no banco de dados para DOUBLE PRECISION...
e ainda continua com o seguinte erro:

"R$ 12,00'is not a valid floating point value'.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Mudei no banco de dados para DOUBLE PRECISION...
e ainda continua com o seguinte erro:

"R$ 12,00'is not a valid floating point value'.



Meu Codigo pessoal


unit U_ContasPG;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, DB, Mask, DBCtrls, FMTBcd, SqlExpr;

type
TF_ContasPG = class(TForm)
Panel2: TPanel;
btn_editar: TBitBtn;
btn_cancelar: TBitBtn;
btn_excluir: TBitBtn;
btn_gravar: TBitBtn;
btn_pesquisar: TBitBtn;
btn_sair: TBitBtn;
btn_novo: TBitBtn;
Panel1: TPanel;
GroupBox1: TGroupBox;
Label1: TLabel;
DBEdit1: TDBEdit;
DataSource1: TDataSource;
Label2: TLabel;
DBEdit2: TDBEdit;
Label3: TLabel;
DBEdit3: TDBEdit;
Label4: TLabel;
DBEdit4: TDBEdit;
Label5: TLabel;
DBEdit5: TDBEdit;
Label6: TLabel;
DBEdit6: TDBEdit;
GroupBox2: TGroupBox;
Label7: TLabel;
DBEdit7: TDBEdit;
Label8: TLabel;
DBEdit8: TDBEdit;
Label9: TLabel;
DBEdit9: TDBEdit;
Label10: TLabel;
DBEdit10: TDBEdit;
DBRadioGroup1: TDBRadioGroup;
SP_GEN_CONTASPG: TSQLStoredProc;
procedure btn_sairClick(Sender: TObject);
procedure Desativabtn;
procedure ativabtn;
Procedure ativadbedit;
Procedure desativadbedit;
procedure btn_novoClick(Sender: TObject);
procedure btn_gravarClick(Sender: TObject);
procedure btn_editarClick(Sender: TObject);
procedure btn_cancelarClick(Sender: TObject);
procedure btn_excluirClick(Sender: TObject);
procedure btn_pesquisarClick(Sender: TObject);
procedure DBEdit7KeyPress(Sender: TObject; var Key: Char);
procedure DBEdit10KeyPress(Sender: TObject; var Key: Char);
procedure DBEdit9Exit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
F_ContasPG: TF_ContasPG;

implementation

uses U_Principal, U_DM, U_PesqCliente, U_PesqContasPG;

{$R *.dfm}

procedure TF_ContasPG.ativabtn;
begin
btn_novo.enabled := True;
btn_editar.enabled := True;
btn_cancelar.enabled := False;
btn_gravar.enabled := False;
btn_excluir.enabled := True;
btn_sair.enabled := True;
btn_pesquisar.enabled := True;
end;

procedure TF_ContasPG.DBEdit10KeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 Then
Begin
SelectNext(Sender as tWinControl, True, True );
Key := #0;
btn_gravar.SetFocus;
end;
end;

procedure TF_ContasPG.DBEdit7KeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 Then
Begin
SelectNext(Sender as tWinControl, True, True );
Key := #0;
end;
end;

procedure TF_ContasPG.DBEdit9Exit(Sender: TObject);
begin
DBEdit10.text := FloatToStr(StrToFloat(DbEdit8.text) - StrToFloat(DBEdit9.text));
end;

procedure TF_ContasPG.Desativabtn;
begin
btn_novo.enabled := False;
btn_editar.enabled := False;
btn_cancelar.enabled := True;
btn_gravar.enabled := True;
btn_excluir.enabled := False;
btn_sair.enabled := False;
btn_pesquisar.enabled := False;
end;
procedure TF_ContasPG.ativadbedit;
begin
DBEdit2.enabled := True;
DBEdit3.enabled := True;
DBEdit4.enabled := True;
DBEdit5.enabled := True;
DBEdit6.enabled := True;
DBEdit7.enabled := True;
DBEdit8.enabled := True;
DBEdit9.enabled := True;
DBEdit10.enabled := True;
DBRadioGroup1.Enabled := True;
end;

procedure TF_ContasPG.desativadbedit;
begin
DBEdit2.enabled := False;
DBEdit3.enabled := False;
DBEdit4.enabled := False;
DBEdit5.enabled := False;
DBEdit6.enabled := False;
DBEdit7.enabled := False;
DBEdit8.enabled := False;
DBEdit9.enabled := False;
DBEdit10.enabled := False;
DBRadioGroup1.Enabled := False;

end;

procedure TF_ContasPG.btn_cancelarClick(Sender: TObject);
begin
//BOTÃO CANCELAR//

if DataSource1.DataSet.State in [dsBrowse, dsEdit, dsInsert] then

begin
DM.CDS_CONTASPG.Cancel;
DM.CDS_CONTASPG.ApplyUpdates(-1);
DM.CDS_CONTASPG.Open;
DM.CDS_CONTASPG.close;
ativabtn;
end
else
ShowMessage('Atenção: Favor Executar uma Operação.');
end;

procedure TF_ContasPG.btn_editarClick(Sender: TObject);
begin
DM.CDS_CONTASPG.Edit;
Desativabtn;
ativadbedit;
end;

procedure TF_ContasPG.btn_excluirClick(Sender: TObject);
begin
//Botão Excluir//

if DataSource1.DataSet.State in [dsBrowse, dsEdit] then
begin
DM.CDS_CONTASPG.Delete;
DM.CDS_CONTASPG.ApplyUpdates(0);
DM.CDS_CONTASPG.close;
end;
end;


procedure TF_ContasPG.btn_gravarClick(Sender: TObject);
begin
//Botão Gravar//

if DM.CDS_CONTASPG.State in [dsBrowse, dsEdit, dsInsert] then

begin
DM.CDS_CONTASPG.Post;
DM.CDS_CONTASPG.ApplyUpdates(0);
DM.CDS_CONTASPG.close;
ATIVABTN;
end;
end;

procedure TF_ContasPG.btn_novoClick(Sender: TObject);
//Botão Novo//
var
vID: integer;
begin
with SP_GEN_CONTASPG do
begin
Prepared := True;
ExecProc;
Prepared := False;
vID := ParamByName('ID').Value;
close;
end;
DM.CDS_CONTASPG.Open;
DM.CDS_CONTASPG.Append;
DM.CDS_CONTASPG.FieldByName('ID').AsInteger := vID;
Desativabtn;
ativadbedit;
DBEdit2.SetFocus;
end;

procedure TF_ContasPG.btn_pesquisarClick(Sender: TObject);
begin
// Chamar Pesquisa de Contas a Pagar //

F_PesqContasPG:= TF_PesqContasPG.create(Self);
F_PesqContasPG.ShowModal;
F_PesqContasPG.Release;
F_PesqContasPG.free;

end;

procedure TF_ContasPG.btn_sairClick(Sender: TObject);
begin
F_ContasPG.Close;
end;

end.
GOSTEI 0
Luiz Menin

Luiz Menin

04/03/2013

Certo, porém, no momento do cálculo algum valor está incorreto.

Tente desta forma:
DBEdit3.Text := CurrToStr(StrToCurr(DBEdit1.text) - StrToCurr(DBEdit2.text));

GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Certo, porém, no momento do cálculo algum valor está incorreto.

Tente desta forma:
DBEdit3.Text := CurrToStr(StrToCurr(DBEdit1.text) - StrToCurr(DBEdit2.text));


Persiste o Mesmo Erro!
GOSTEI 0
Luiz Menin

Luiz Menin

04/03/2013

Muito estranho isso!
Uma coisa tão simples...
Eu realizei testes aqui utilizando 3 Edit's e funcionou.
Tente fazer de alguma forma diferente: retire a propriedade Currency, mude seus DBEdit's para Edit's, etc. Não insista muito no mesmo erro.

GOSTEI 0
William

William

04/03/2013

Colegas já passei por problema parecido, minha solução foi alterar a propriedade Currency para false, executar as operações matematicas e atribuir o valor, posteriormente retornar a propriedade para true.

Na época funcional bem, pelo menos o cliente não reclamou até hoje.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Colegas já passei por problema parecido, minha solução foi alterar a propriedade Currency para false, executar as operações matematicas e atribuir o valor, posteriormente retornar a propriedade para true.

Na época funcional bem, pelo menos o cliente não reclamou até hoje.


Eu coloquei o valor currency dos Dbedits para False, deu certinho agora como faço para que apareça em Formato moeda e vá para o banco de dados também do mesmo modo como se fosse com o valor Currency ativo...
GOSTEI 0
William

William

04/03/2013

Use a função FormatFloat(),

DBEdit.text := FormatFloat('R$ ##.###,00', valor);
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

04/03/2013

Use a função FormatFloat(),

DBEdit.text := FormatFloat('R$ ##.###,00', valor);


Como eu posso colocar essa função no meu codigo acima descrito ??
GOSTEI 0
Luiz Menin

Luiz Menin

04/03/2013

No momento de converter:

DBEdit3.text := FormatFloat('R$ ##.###,00', (StrToFloat(DbEdit1.text) - StrToFloat(DBEdit2.text)));
GOSTEI 0
William

William

04/03/2013

Você usar assim:

procedure TF_ContasPG.DBEdit9Exit(Sender: TObject);
var
  valor: real;
begin
valor := (StrToCurr(DBEdit1.text) - StrToCurr(DBEdit2.text));
DBEdit10.text := FormatFloat('R$ ##.###,00', valor);
end;


Testa senão funcionar posta novamente...
GOSTEI 0
Bruno Leandro

Bruno Leandro

04/03/2013

Tenta desta forma

DBEdit10.text := FormatFloat('0.00',(StrToFloatDef(DBEdit1.text,0) - StrToFloatDef(DBEdit2.text,0)));
GOSTEI 0
Edson Melo

Edson Melo

04/03/2013

o problema todo e o R$ no calculo, quando se tira tudo funciona, tenho uma funcao chamada StringToFloat que faz exatamente isto retira o R$ doas edits, procure ela na internet que ira resolver, use ela para retirar o R4 do edit na hora do calculo e pelo que entendo o R$ nao vai para o banco de dados.


function StringToFloat(s : string) : Extended;
{ Filtra uma string qualquer, convertendo as suas partes
numéricas para sua representação decimal, por exemplo:
'R$ 1.200,00' para 1200,00 '1AB34TZ' para 134}
var
i :Integer;
t : string;
SeenDecimal,SeenSgn : Boolean;
begin
t := '';
SeenDecimal := False;
SeenSgn := False;
{Percorre os caracteres da string:}
for i := length(s) downto 0 do
{Filtra a string, aceitando somente números e separador decimal:}
if (s[i] in ['0'..'9', '-','+',DecimalSeparator]) then
begin
if (s[i] = DecimalSeparator) and (not SeenDecimal) then
begin
t := s[i] + t;
SeenDecimal := True;
end
else if (s[i] in ['+','-']) and (not SeenSgn) and (i = 1) then
begin
t := s[i] + t;
SeenSgn := True;
end
else if s[i] in ['0'..'9'] then
begin
t := s[i] + t;
end;
end;
Result := StrToFloat(t);
end;
GOSTEI 0
POSTAR