Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Calcular un valor antes de guardar en una tabla (https://www.clubdelphi.com/foros/showthread.php?t=50525)

FGarcia 20-11-2007 23:46:10

Calcular un valor antes de guardar en una tabla
 
Hola!

Tengo este procedimiento aun en fase de prueba, cuando hago click en un boton se envia a traves del puerto serie (Com) la cadena:

Código Delphi [-]
procedure TMain.Button1Click(sender: TObject);
begin
   ComPort.WriteStr('1,   4356' + #13#10);
end;

Cuando se recibe esta cadena se ejecuta este procedimiento:

Código Delphi [-]
procedure TDMSerie.ProcesaCadena(Sender: TObject; const Str: String)
begin
  with TblCaptura do
    begin
      Append;
        FieldByName('hfCaptura').Value := Now;
        FieldbyName('ID').Value := MidStr(Str,1,1);
        FieldByName('Valor').Value := MidStr(Str,3,7);
        FieldByName('Suma').Value :=
                      StrToFloat(MidStr(Str,3,7)) + FieldByName('Suma').Value;
      Post;
    end;
  DataCnx.ConsultaTotales;
end;

El Campo Suma esta declarado como Float, con valor por defecto 0 y no debe ser Null.

El problema es que no efectua la suma y me envia el mensaje de error "el campo Suma no puede ser NULL"
Supongo es una tontera pero ¡¡ya se me trabaron las ultimas neuronas que sobreviven sin alcohol!!
Mi logica es:
Total vale inicialmente 0, cuando se recibe un dato de valor entonces se suma:
Suma = Valor + 0; 4356 = 4356 + 0;
La siguiente vez :
Suma = Valor + Suma; 8712 = 4356 + 4356;
y asi sucesivamente es decir estoy totalizando todos los valores.

Agradesco su ayuda!!

cHackAll 21-11-2007 00:01:52

Cita:

Empezado por FGarcia
FieldByName('Suma').Value := StrToFloat(MidStr(Str,3,7)) + FieldByName('Suma').Value;

Probablemente toma a "0" como nulo... entonces cuando haces suma = xxx + suma, intentas sumarle a suma el valor nulo...

prueba separarlo para ver con puntos de quiebra dónde te da el error... algo como

Código Delphi [-]
 OldValue := FieldByName('Suma').Value;
 FieldByName('Suma').Value := StrToFloat(MidStr(Str,3,7)) + OldValue;

Suerte.

jhonny 21-11-2007 00:03:18

A ver, ¿Osea que tu lo que quieres es ir incrementando el valor del campo suma?

eduarcol 21-11-2007 00:03:54

alli hay un error de logica, el campo suma siempre va a ser cero si lo que quieres es la suma tendrias que declarar una variable global y ahi ir acumulando, cada vez que se reciba una cadena se graba el valor de la variable no del campo y te explico porq: luego de un append todos los registros quedan en blanco y estas sumando igual un valor nulo siempre

jhonny 21-11-2007 00:08:45

Cita:

Empezado por eduarcol (Mensaje 247342)
alli hay un error de logica, el campo suma siempre va a ser cero si lo que quieres es la suma tendrias que declarar una variable global y ahi ir acumulando, cada vez que se reciba una cadena se graba el valor de la variable no del campo y te explico porq: luego de un append todos los registros quedan en blanco y estas sumando igual un valor nulo siempre

Exacto, la logica que estan usando nuestros dos compañeros (cHackAll y eduarcol) es la correcta, pero si lo que quieres es ir acumulando el valor (Como al parecer todos lo hemos entendido asi), entonces tambien podrias hacerlo asi:

Código Delphi [-]
procedure TDMSerie.ProcesaCadena(Sender: TObject; const Str: String)
begin
  with TblCaptura do
    begin
        Edit; //<-- En lugar de Append usas Edit, para que no se mueva el cursor...
        FieldByName('hfCaptura').Value := Now;
        FieldbyName('ID').Value := MidStr(Str,1,1);
        FieldByName('Valor').Value := MidStr(Str,3,7);
        FieldByName('Suma').Value :=
                      StrToFloat(MidStr(Str,3,7)) + FieldByName('Suma').Value;
      Post;
    end;
  DataCnx.ConsultaTotales;
end;

Pero si lo que quieres es ir añadiendo registros con cada valor acumulado y de esa manera llevar el "historial", lo mejor es usar la sugerencia que han especificado nuestros compañeros, usando dicha variable acumuladora ;).

FGarcia 21-11-2007 00:10:33

Como les dije es una tontera.....(cuanta falta me hace el conde Smirnoff!!!)

Código Delphi [-]
 
FieldByName('Suma').Value :=
                   (StrToFloat(MidStr(Str,3,7)) + FieldByName('Suma').AsFloat);

Jeje y asi funciona


Gracias!!

P:D: Jeje me adelante, asi como dije ya no muestra el error!! sin embargo en la tabla todos los valores de suma son iguales a valor. Ademas vi algo raro pero aun no lo defino. Luego les cuento!!

eduarcol 21-11-2007 00:16:23

Cita:

Empezado por FGarcia (Mensaje 247345)
Como les dije es una tontera.....(cuanta falta me hace el conde Smirnoff!!!)

Código Delphi [-]
 
FieldByName('Suma').Value :=
                   (StrToFloat(MidStr(Str,3,7)) + FieldByName('Suma').AsFloat);

Jeje y asi funciona


Gracias!!

P:D: Jeje me adelante, asi como dije ya no muestra el error!! sin embargo en la tabla todos los valores de suma son iguales a valor. Ademas vi algo raro pero aun no lo defino. Luego les cuento!!

Perdona que insisto, esa solucion solo va a dejar de mostrarte el error, analiza lo del edit y lo de la variable para que llegues a la solucion que mas te convenga...

Recuerda el hecho que no salten excepciones no quiere decir que vaya a funcionar.

FGarcia 21-11-2007 00:33:04

Bueno, ahora si!

Ya probe y revise tablas y parece que ya no hay problema. Esto quedo asi:

Código Delphi [-]
procedure TDMSerie.ProcesaCadena(Str: string);
var
  Acc: Double;
begin
  if not TblCaptura.FieldByName('Suma').IsNull then
    Acc := TblCaptura.FieldByName('Suma').Value
  else
    Acc := 0;
 
  with TblCaptura do
    begin
      Append;
        FieldByName('hfCaptura').Value := Now;
        FieldbyName('ID').Value := MidStr(Str,1,1);
        FieldByName('Valor').Value := MidStr(Str,3,7);
        FieldByName('Suma').Value := (StrToFloat(MidStr(Str,3,7)) + Acc);
      Post;
    end;
 
  DataCnx.ConsultaTotales;
end;

Se siguen aceptando sugerencias!!

Gracias!

eduarcol 21-11-2007 00:40:35

la variable debe ser global, tu la estas declarando local por eso se te reinicia cada vez que entras al procedimiento, sacala de alli y colocala como global.

FGarcia 21-11-2007 00:58:28

Cita:

Empezado por FGarcia (Mensaje 247360)
Bueno, ahora si!

Ya probe y revise tablas y parece que ya no hay problema. Esto quedo asi:

Se siguen aceptando sugerencias!!

Gracias!


Bueno, si, declare la variable local pues es el unico sitio donde la uso y ademas cada vez que entro al procedimiento le asigno el ultimo valor de suma que esta guardado en la tabla esto me da como resultado algo asi ya en la tabla:

Cita:

consecutivo | ID | Valor | Suma|
1 1 1 1
2 2 1 2
3 1 5 7
4 2 3 10
Aun asi se agradece si estoy obviando algo me lo hagan saber.

eduarcol 21-11-2007 01:41:43

pues si tienes razon, pero lo unico que te aconsejaria es asegurarte que al entrar al procedimiento se vaya al ultio registro, (.Last)

FGarcia 21-11-2007 05:22:07

Gracias!!
Eso si no lo habia tomado en cuenta!!


La franja horaria es GMT +2. Ahora son las 03:12:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi