Hola
Yo no trabajo con query sino con tfibdataset pero para el caso creo sera lo mismo.
Para lo primero i lo segundo tienes el evento onsettext de los field del query
Suponiendo que debe1,haber1,edit1 son los tdbedit donde enseñas el sumatorio del debe,haber y saldo
Código Delphi
[-]
procedure TForm1.queryDEbeSetText(Sender: TField;const Text: String);
var valor,valor1,old_debe : double;
begin
if (trim(text)<>'') and (queryhaber.asfloat<>0) then
raise Exception.Create( 'Haber no es 0 ' )
else begin
old_debe:= sender.asfloat;
sender.asfloat:=strtofloat(text);
valor:=strtofloat(edit1.text);
valor1:=strtofloat(debe1.text);
valor:=valor+sender.asfloat-old_debe;
valor1:=valor1+sender.asfloat-old_debe;
edit1.text:=formatflot('0.##',valor);
debe1.text:=formatflot('0.##',valor1);
end;
end;
procedure TForm1.queryghaberSetText(Sender: TField;const Text: String);
var valor,valor1,old_haber : double;
begin
if (trim(text)<>'') and (querydebe.asfloat<>0) then
raise Exception.Create( 'El Debe no es 0 ' )
else begin
old_haber:=sender.asfloat;
sender.asfloat:=strtofloat(text);
valor:=strtofloat(edit1.text);
valor1:=strtofloat(haber1.text);
valor:=valor-sender.asfloat+old_haber;
valor1:=valor1+sender.asfloat-old_haber;
edit1.text:=formatflot('0.##',valor);
haber1.text:=formatflot('0.##',valor1);
end;
end;
o bien otra manera de hacer seria esta
Código Delphi
[-]
procedure TForm1.queryDEbeSetText(Sender: TField;const Text: String);
var valor,valor1,valor2,old_debe : double;
begin
if (trim(text)<>'') then begin
old_debe:=sender.asfloat;
sender.asfloat:=strtofloat(text);
valor:=strtofloat(edit1.text);
valor1:=strtofloat(debe1.text);
valor:=valor+sender.asfloat-old_debe;
valor1:=valor1+sender.asfloat-old_debe;
debe1.text:=formatflot('0.##',valor1);
if (queryhaber.asfloat<>0) then begin
valor2:=strtofloat(haber1.text);
valor:=valor+queryhaber.asfloat;
valor2:=valor2-queryhaber.asfloat;
queryhaber.asfloat:=0;
haber1.text:=formatflot('0.##',valor2);
end;
edit1.text:=formatflot('0.##',valor);
end;
end;
procedure TForm1.queryHaberSetText(Sender: TField;const Text: String);
var valor,valor1,valor2,old_haber : double;
begin
if (trim(text)<>'') then begin
old_haber:= sender.asfloat;
sender.asfloat:=strtofloat(text);
valor:=strtofloat(edit1.text);
valor1:=strtofloat(haber1.text);
valor:=valor-sender.asfloat+old_haber;
valor1:=valor1+sender.asfloat-old_haber;
haber1.text:=formatflot('0.##',valor1);
if (querydebe.asfloat<>0) then begin
valor2:=strtofloat(debe1.text);
valor:=valor-querydebe.asfloat;
valor2:=valor2-querydebe.asfloat;
querydebe.asfloat:=0;
debe1.text:=formatflot('0.##',valor2);
end;
edit1.text:=formatflot('0.##',valor);
end;
end;
Creo que deberia funcionar pero no lo he probado, supongo abra errores de sintaxis y algun signo erroneo ya que lo he escrito sobre la marcha.
Sino tambien tienes el evento on change de los fields o el oncalcfields del query
Saludos