Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-11-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!!
Responder Con Cita
  #2  
Antiguo 21-11-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 21-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
A ver, ¿Osea que tu lo que quieres es ir incrementando el valor del campo suma?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 21-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #5  
Antiguo 21-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por eduarcol Ver Mensaje
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 .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #6  
Antiguo 21-11-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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: 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!!

Última edición por FGarcia fecha: 21-11-2007 a las 00:14:42.
Responder Con Cita
  #7  
Antiguo 21-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Cita:
Empezado por FGarcia Ver Mensaje
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: 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.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #8  
Antiguo 21-11-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!
Responder Con Cita
  #9  
Antiguo 21-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #10  
Antiguo 21-11-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Cita:
Empezado por FGarcia Ver Mensaje
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.
Responder Con Cita
  #11  
Antiguo 21-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
pues si tienes razon, pero lo unico que te aconsejaria es asegurarte que al entrar al procedimiento se vaya al ultio registro, (.Last)
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #12  
Antiguo 21-11-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Gracias!!
Eso si no lo habia tomado en cuenta!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar antes de que mi aplicacion se cierre Gelmin Varios 4 24-09-2008 09:20:23
Cambiar tamaño de una imagen antes de guardar en una bd chux Gráficos 6 28-11-2006 11:58:58
Saber el valor auto_increment antes del insert cahosoft PHP 9 13-10-2006 09:46:47
actualizar tabla al calcular un campo autocalculado Telemaco Conexión con bases de datos 14 08-04-2004 17:07:14
Calcular datos de un tabla y mostrar en un edit Telemaco Conexión con bases de datos 3 17-02-2004 14:40:27


La franja horaria es GMT +2. Ahora son las 01:21:40.


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
Copyright 1996-2007 Club Delphi