Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

SOMBRIO-SC

[Resolvido] DBEdit subtração

Recommended Posts

Olá, tenho 3 dbedit vou colocar numeros nas duas primeiras e o resultado na terceira.

fiz assim, mas tá dando erro

//is not a valid floating point value//

 

o que está errado aqui :

 

private
   { Private declarations }
   FCampo1,
   FCampo2: Double;
 public
   { Public declarations }
 end;

var
 FormControle: TFormControle;
 total: real;
 Fcampo1: real;
 FCampo2: real;
implementation

uses UnitPesquisaTransp;

procedure TFormControle.DBEditValorFreteExit(Sender: TObject);
begin
FCampo1 := StrToFloat (DBEditValorFrete.Text);
end;

procedure TFormControle.DBEditAdiantExit(Sender: TObject);
begin
FCampo2 := StrToFloat (DBEditAdiant.Text);
end;

procedure TFormControle.DBEditValorFreteKeyPress(Sender: TObject;
 var Key: Char);
begin
FCampo1 :=StrToFloat(DBEditValorFrete.Text);
DBEditAdiant.SetFocus;
end;

procedure TFormControle.DBEditAdiantKeyPress(Sender: TObject;
 var Key: Char);
begin
FCampo2:=StrToFloat(DBEditAdiant.Text);
total:= FCampo1 - FCampo2;
DBEditSaldo.Text:=FloatToStr(Total);
end;

end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq você nào tenta criar uma select:

 

 

With Query Do
Begin
Close;
SQL.Clear;
SQL.Add('SELECT (' + DBEditValorFrete.Text + ' - ' + DBEditAdiant.Text + ') AS CALCULO');
Open;
End;

If Query.RecordCount > 0 Then
DBEditSaldo.Text:=FormatFloat('#,##0.00', Query.FieldByName().Value)
Else
DBEditSaldo.Text:='0,00';
Query.Close;

 

Daí você vê onde atribui o evento, ao sair dos campos digitados, ao entrar no campo que deseja ver o resultado, ao salvar, enfim.

 

 

Agora, se você quiser tb pode optar em criar um campo virtual no seu TTable e no evento OnCalcFields fazer:

 

CampoVirtual := ValorFrete.Value - ValorAdiantamento.Value;

 

Mas, particularmente, hoje, prefiro utilizo mais TTables e sim TQuery. Crio minhas Units para cada tabela do banco, onde faço selects, inserts, updates e deletes e nos forms utilizo TEdit, TMaskEdit, TDBLookupCombobox para executar esses procedimentos e a parte dos cálculos deixo implementados nas próprias consultas. Isso tem me trazido uma melhora bastante significativa em minhas atividades, fora q se precisar alterar algum cálculo basta ir na Unit referente àquela tabela e pronto, toda minha aplicação foi modificada. Mas claro, existem casos e casos, mas até agora este modelo de trabalho tem me rendido ótimos resultados e menos dor de cabeça de quando trabalhava com TTables, pois tudo era feito via aplicação, assim ficavam alguns lixos que depois eu nem sabia mais pra q serviam rrrssss.

 

De qualquer forma, isso depende de cada pessoa. Assim, espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq você nào tenta criar uma select:

 

With Query Do
Begin
Close;
SQL.Clear;
SQL.Add('SELECT (' + DBEditValorFrete.Text + ' - ' + DBEditAdiant.Text + ') AS CALCULO');
Open;
End;

If Query.RecordCount > 0 Then
DBEditSaldo.Text:=FormatFloat('#,##0.00', Query.FieldByName().Value)
Else
DBEditSaldo.Text:='0,00';
Query.Close;

 

Daí você vê onde atribui o evento, ao sair dos campos digitados, ao entrar no campo que deseja ver o resultado, ao salvar, enfim.

 

 

Agora, se você quiser tb pode optar em criar um campo virtual no seu TTable e no evento OnCalcFields fazer:

 

CampoVirtual := ValorFrete.Value - ValorAdiantamento.Value;

 

Mas, particularmente, hoje, prefiro utilizo mais TTables e sim TQuery. Crio minhas Units para cada tabela do banco, onde faço selects, inserts, updates e deletes e nos forms utilizo TEdit, TMaskEdit, TDBLookupCombobox para executar esses procedimentos e a parte dos cálculos deixo implementados nas próprias consultas. Isso tem me trazido uma melhora bastante significativa em minhas atividades, fora q se precisar alterar algum cálculo basta ir na Unit referente àquela tabela e pronto, toda minha aplicação foi modificada. Mas claro, existem casos e casos, mas até agora este modelo de trabalho tem me rendido ótimos resultados e menos dor de cabeça de quando trabalhava com TTables, pois tudo era feito via aplicação, assim ficavam alguns lixos que depois eu nem sabia mais pra q serviam rrrssss.

 

De qualquer forma, isso depende de cada pessoa. Assim, espero ter ajudado.

 

 

Ilano Obrigado !!

Realmente notei que a maioria utiliza TQuery. O problema é que sou iniciante e é só eu e a Net, voces é que são meus

professores, então agora vou estudar sua explicação e tentar resolver meu programinha.

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, como já passei por isso e ainda sei o sofrimento de apanhar um bocado para alcançar o objetivo esperado, vou postar aqui um modelo bem prático de como você utilizar querys. No exemplo vou utilizar Zeos pois trabalho com MySQL. Este exemplo vai ser usado para Cidades e irá servir para fazer Selects, Inserts, Updates e Deletes em qualquer formulário.

 

Primeiro, crie uma Unit:

 

unit _Cidades;

interface

Uses
 SysUtils, Classes, ZConnection, ZSqlProcessor, DB, ZAbstractRODataset,
 ZAbstractDataset, ZDataset, UDados, _Diversos;

function ConsultaCidades(pQuery : TZQuery; pParametro : String; pOrdem : String) : String;
function IncluirCidades(pQuery : TZQuery; pNome : String; pEstado : String; pDDD : Integer) : String;
function AlterarCidades(pQuery : TZQuery; pCodigo : Integer; pNome : String; pEstado : String; pDDD : Integer) : String;
function ExcluirCidades(pQuery : TZQuery; pCodigo : Integer) : String;
function DuplicadeDeCidades(pQuery : TZQuery; pParametro : String) : String;

implementation

function ConsultaCidades(pQuery : TZQuery; pParametro : String; pOrdem : String) : String;
begin
 With pQuery Do
 Begin
   Close;
   SQL.Clear;
   SQL.Add(' SELECT Cid_Codigo, Cid_Nome, Cid_Estado, Cid_DDD, ');
   SQL.Add(' LPAD(Cid_DDD,3,0) DDD '); //Aqui irá mostrar o DDD com zeros à esquerda.
   SQL.Add(' FROM a_cidades A ');
   If pParametro <> '' Then SQL.Add(' WHERE ' + pParametro + ' ');
   If pOrdem <> '' Then SQL.Add(' ORDER BY ' + pOrdem + '; ') Else SQL.Add(' ORDER BY Cid_Estado, Cid_Nome; ');
   SQL.SaveToFile(DMDados.DiretorioAtual + 'CUBOS/CONSULTA_CIDADES.sql');
   Open;
 End;

end;

function IncluirCidades(pQuery : TZQuery; pNome : String; pEstado : String; pDDD : Integer) : String;
begin
 With pQuery Do
 Begin
   Close;
   SQL.Clear;
   SQL.Add(' INSERT INTO a_cidades ');
   SQL.Add(' (Cid_Nome, Cid_Estado, Cid_DDD) VALUES (');

   SQL.Add(Quoted(Trim(pNome)) + ', ');
   SQL.Add(Quoted(Trim(pEstado)) + ', ');
   SQL.Add(IntToStr(pDDD));

   SQL.Add(');');
   SQL.SaveToFile(DMDados.DiretorioAtual + 'CONSULTAS/INCLUIR_CIDADES.sql');
   ExecSQL;
 End;

end;

function AlterarCidades(pQuery : TZQuery; pCodigo : Integer; pNome : String; pEstado : String; pDDD : Integer) : String;
begin
 With pQuery Do
 Begin
   Close;
   SQL.Clear;
   SQL.Add(' UPDATE a_cidades SET ');

   SQL.Add(' Cid_Nome = ' + Quoted(Trim(pNome)) + ', ');
   SQL.Add(' Cid_Estado = ' + Quoted(Trim(pEstado)) + ', ');
   SQL.Add(' Cid_DDD = ' + IntToStr(pDDD));
   SQL.Add(' WHERE Cid_Codigo = ' + IntToStr(pCodigo) + ';');

   SQL.SaveToFile(DMDados.DiretorioAtual + 'CONSULTAS/ALTERAR_CIDADES.sql');
   ExecSQL;
 End;

end;

function ExcluirCidades(pQuery : TZQuery; pCodigo : Integer) : String;
begin
 With pQuery Do
 Begin
   Close;
   SQL.Clear;
   SQL.Add(' DELETE FROM a_cidades ');
   SQL.Add(' WHERE Cid_Codigo = ' + IntToStr(pCodigo) + '; ');
   SQL.SaveToFile(DMDados.DiretorioAtual + 'CONSULTAS/EXCLUIR_CIDADES.sql');
   ExecSQL;
 End;

end;

function DuplicadeDeCidades(pQuery : TZQuery; pParametro : String) : String;
begin
 With pQuery Do
 Begin
   Close;
   SQL.Clear;
   SQL.Add(' SELECT Cid_Codigo, Cid_Nome, Cid_Estado, Cid_DDD ');
   SQL.Add(' FROM a_cidades ');
   SQL.Add(' WHERE ' + pParametro + '; ');
   SQL.SaveToFile(DMDados.DiretorioAtual + 'CONSULTAS/DUPLICIDADE_DE_CIDADES.sql');
   Open;
 End;

end;

end.

 

Agora, vamos chamar a Unit no form FrmCadCidades:

 

 

...
implementation
 Uses UDados, _Cidades;

 

Agora vamos fazer a procedure que chamará o insert

 

procedure TFrmCadCidades.Incluir;
begin
 Try
[color="#708090"]//Vamos verificar se existe duplicidade de registros.[/color]
   DuplicadeDeCidades(DMDados.SERVICOS, 'Cid_Nome = ' + QuotedStr(Trim(TxtNome.Text)) +
                      ' AND Cid_Estado = ' + QuotedStr(Trim(ComboEstados.Text)));
   If DMDados.SERVICOS.RecordCount = 0 Then
[color="#708090"]//DMDados.SERVICOS é uma Query que incluí no DataModule (DMDados)[/color]
   Begin
     IncluirCidades(DMDados.SERVICOS, TxtNome.Text, ComboEstados.Text, SpinDDD.Value);
     DesativaEdicao; [color="#708090"]//Função para limpar e desativar os campos e popular/atualizar o DBGrid[/color]
     ShowMessage('REGISTRO CADASTRADO COM SUCESSO.');
   End
   Else
     If DMDados.SERVICOS.RecordCount > 0 Then
     Begin
       ShowMessage('ESTE REGISTRO JÁ FOI CADASTRADO.');
     End;

 Except
   ShowMessage('OCORREU UM ERRO AO TENTAR INCLUIR ESTE REGISTRO.');
   DesativaEdicao;
 End;

end;

 

 

Agora a procedure que chamará o Update:

 

procedure TFrmCadCidades.Alterar;
begin
 Try
[color="#708090"]//Vamos verificar se existe duplicidade de registros, desta vez analizaremos tb o código (Cid_Codigo)[/color]
   DuplicadeDeCidades(DMDados.SERVICOS, ' Cid_Codigo <> ' + IntToStr(seCodigo.Value) +
                       ' AND Cid_Nome = ' + QuotedStr(Trim(TxtNome.Text)) +
                       ' AND Cid_Estado = ' + QuotedStr(Trim(ComboEstados.Text)));
[color="#708090"]//O seCodigo é um TSpinEdit que fica oculto no form e que será preenchido ao mandar editar um registro, já que o campo Cid_Codigo é autoincremento (ainda mesmo q não fosse e assim você teria que trabalha-lo via código para incrementar.)[/color]

   If DMDados.SERVICOS.RecordCount = 0 Then
     AlterarCidades(DMDados.SERVICOS, seCodigo.Value, TxtNome.Text, ComboEstados.Text, spinDDD.Value);
     DesativaEdicao;

     ShowMessage('REGISTRO ALTERADO COM SUCESSO.');
   End
   Else
     If DMDados.SERVICOS.RecordCount > 0 Then
     Begin
       ShowMessage('ESTE REGISTRO JÁ FOI CADASTRADO.');
     End;

 Except
   ShowMessage('OCORREU UM ERRO AO TENTAR ALTERAR ESTE REGISTRO.');
   DesativaEdicao;
 End;

 

Agora vamos fazer a chamada das procedures, ao clicar no botão Salvar:

 

procedure TFrmCadCidades.BtnSalvarClick(Sender: TObject);
begin
 TxtNome.SetFocus;
 VerificaCampos; //Chamo outra procedure para verificar se os campos obrigatórios estão preenchidos

end;

procedure TFrmCadCidades.VerificaCampos;
Var
 I : Integer;
begin
 I:=0;
 TxtNome.Text:=Trim(TxtNome.Text);
 TxtDDD.Text:=Trim(TxtDDD.Text);
 If TxtDDD.Text = '' Then TxtDDD.Text:='000';

 If TxtNome.Text = '' Then
 Begin
   I:=I + 1;
   TxtNome.Color:=$00B3FFFF;
 End
 Else
   If TxtNome.Text <> '' Then
   Begin
     TxtNome.Color:=clWindow;
   End;

 If ComboEstados.Text = '' Then
 Begin
   I:=I + 1;
   ComboEstados.Color:=$00B3FFFF;
 End
 Else
   If ComboEstados.Text <> '' Then
   Begin
     ComboEstados.Color:=clWindow;
   End;

 If StrToInt(TxtDDD.Text) = 0 Then
 Begin
   I:=I + 1;
   TxtDDD.Color:=$00B3FFFF;
 End
 Else
   If StrToInt(TxtDDD.Text) > 0 Then
   Begin
     TxtDDD.Color:=clWindow;
   End;

 If I = 0 Then
 Begin
   If seCodigo.Value = 0 Then Incluir Else Alterar;
 End
 Else
   If I > 0 Then
   Begin
     ShowMessage('POR FAVOR, PREENCHA O(S) CAMPO(S) EM DESTAQUE.');
   End;

end;

 

Pronto! você tem agora uma forma bem prática para utilizar suas Querys e fazer uma aplicaçãozinha bem legal e ter todas suas funções de cálculo nas próprias consultas, assim, só precisará mudar nas consultas suas funções.

 

Espero ter gostado e que possa ajudar você e outras pessoas que assim como nós estão aprendendo. Em outro post irei colacar algumas funções bem úteis q podem agilizar o nosso trabalho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela atenção.

Pesquisei a achei isto.

 

Funfou

procedure TFormControle.DBEdit2Exit(Sender: TObject);
begin
TbControle.FieldByName('Saldoareceber').Value:=TbControle.FieldByName('Valordofrete').Value - TbControle.FieldByName('Adiantamento').Value;
//faz a soma dos dbedit frete menos adiantamento
DBEDIT2.TEXT:= FORMATFLOAT('R$ ###,##0.00', STRTOFLOAT(DBEDIT2.TEXT));
DBEDIT5.TEXT:= FORMATFLOAT('R$ ###,##0.00', STRTOFLOAT(DBEDIT5.TEXT));
// etilo moeda
end;
procedure TFormControle.DBEdit1Exit(Sender: TObject);
begin
DBEDIT1.TEXT:= FORMATFLOAT('R$ ###,##0.00', STRTOFLOAT(DBEDIT1.TEXT));
//estilo moeda

 

Faz a subtração,se estiver os dois dbedit preenchido porém se o valor do dbedit 2 estiver vazio (em branco) da erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.