PDA

Ver la Versión Completa : sumar columnas en un dbgrid


Choclito
04-06-2006, 04:43:52
hola amigos del foro comentarles q queria editar datos (que esten en un dbgrid) de un query eso lo hice con un query y update hasta ahi todo bien
el problema es q ahi tengo dos columnas una del debe y haber y cuando el usuario registre solo una de ellas tiene q ser mayor a cero y la otra cero

Como controlo para q solo una de ellas sea mayor a cero cuando se registre?

Otra consulta es que quiera q mientras vaya registrando las cantidades tanto en el debe y haber en el dbgrid me muestre una sumatoria en edit q esten abajo del dbgrid tanto del debe y haber
Muchas gracias por la ayuda que me brinden

marcoszorrilla
04-06-2006, 11:52:17
Respondiendo a la primera. En el evento AfterPost, de ambos campos compruebas no que son mayor a 0, que también hay números negativos,

If MiCampo <> 0 then
MiOtroCampo = 0

Un Saludo.

celades1
04-06-2006, 11:55:39
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


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




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