Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   PROBLEMA AL CALCULAR CAMPOS (OnCalcFields) (https://www.clubdelphi.com/foros/showthread.php?t=25407)

pepitu 21-09-2005 18:57:11

PROBLEMA AL CALCULAR CAMPOS (OnCalcFields)
 
Hola de nuevo (es la 2ª pregunta de hoy al foro).
He estado buscando en los foros sobre el problema que tengo pero sigo sin hallar la solución.
Me viene en mente uno de los mensajes leidos que rezaba:"Que pena tener que preguntar...."...
La otra cara de la moneda es que la solución a mi duda....posiblemente sea muy fácil y no le lleve mucho tiempo (a quien responda).

Tengo un datasource, database y ttable en un datamodulo (DM1)....bien conectados. Estoy con Paradox.
En el form principal tengo un grid y una serie de botones para añadir Facturas, borrarlas, editarlas, buscarlas, ver los detalles (dbedits), etc...

Al editar o añadir una factura, el usuario pondrá los valores de las distintas bases imponibles (BASE0, BASE4, BASE7...) a partir de los cuales se deben calcular otros campos (segun el iva de cada base se calculará los SUBTOTALES y las sumas de los mismos).
El problema lo tengo en esos campos a calcular, por lo que en el evento OnCalcFields del TTable (TableFC) pongo:

Código Delphi [-]
procedure TDM1.TableFCCalcFields(DataSet: TDataSet);
 begin
   {todo el código lo pongo bajo el siguiente condicional
   para que no dé error si el dataset no está en edit.}
   if (dataset.state in [dsEdit, dsInsert])then
   begin
 
     // PARA LA BASE0
     //Como no hay IVA, el subtotal 0% = Base0%
     Dataset.FieldValues['SUBTOTAL0'] := Dataset.FieldByName('BASE0').AsFloat;
 
     //PARA LA BASE4
     {pongo un codicional para evitar algun error en el
     cálculo si el usuario no ha puesto valor a BASE4}
     if TableFC.FieldByName('BASE4').Value <> 0 then
     begin
       Dataset.FieldValues['IVA4'] := Dataset.FieldByName('BASE4').AsFloat * 4 / 100;
       Dataset.FieldValues['SUBTOTAL4'] := Dataset.FieldByName('BASE4').AsFloat
         + Dataset.FieldByName('IVA4').AsFloat;
     end;
 
    //PARA LA BASE7
    {...parecido al anterior}
 
    //PARA LA BASE16
    {...parecido al anterior}
 
    {PARA BASEINVERS: es la base para inversiones. Su IVA puede
    variar (el usuario escoge un valor de un combobox:CBPerIvaInv)}
    if DataSet.FieldValues['BASEINVERS'] > 0 then
    begin
      If StrToInt(Form1.CBPerIvaInv.text) > 0 then
        Dataset.FieldValues['IVAINVERS'] := Dataset.FieldByName('BASEINVERS').AsFloat *
          StrToInt(Form1.CBPerIvaInv.text) / 100
      else
        Dataset.FieldValues['IVAINVERS'] := Dataset.FieldByName('BASEINVERS').AsFloat;
      Dataset.FieldValues['SUBTOTINV'] := Dataset.FieldByName('BASEINVERS').AsFloat +
        Dataset.FieldByName('IVAINVERS').AsFloat;
    end;
 
   //PARA LA SUMA DE SUBTOTALES E IVA'S
   {...parecido. Sin condicionales sumo todos los distintos IVA's del
   registro. Y lo mismo para SUBTOTALES (su suma será el total de la factura)}
 
   {...}
 end;
Me compila bien pero al ejecutar sale error del tipo "stack overflow" señalando error (supongo) en el primer condicional situado debajo de: "//PARA LA BASE4".
Suponiendo que el error podría estar en ese condicional...."a la desesperada" he probado con expresiones del tipo:

Código Delphi [-]
 if DataSet.FieldValues['BASE4'] > 0 then
o
Código Delphi [-]
if Dataset.FieldByName('BASE4').AsFloat > 0 then
pero con igual mal resultado.

Otra cosa....Supongo que no me va a redondear los cálculos a 2 decimales, no?
Gracias

Delfino 21-09-2005 19:46:39

Sin verificar mucho el codigo hay cosas q saber sobre los campos calculados:

no tienes pq decirle averiguar el modo del dataset, el programa sabe cuando ejecutar el calculo.

no se tiene q afectar ningun valor a otros fields q no sean los calculated en el evento oncalcfields.

creo q tu error viene de alli..

pepitu 21-09-2005 20:14:39

Seguiré probando lo que comentas
 
Gracias por responder, Delfino.
Todos los valores que modifico (lleno) son de campos calculados (es decir, los campos calculados son los "SUBTOTAL" e "IVA" (incluidos los SUBTOTINV y IVATOT).
Puse los condicionales porqué empezó a darme errores desde un principio... Si los saco sigue dándome error.

vtdeleon 22-09-2005 00:42:58

Saludos

Una sugerencia si usas FieldByName('').AsFloat trata de usarlo siempre con otro del mismo, no con FieldValues
Cita:

Otra cosa....Supongo que no me va a redondear los cálculos a 2 decimales, no?
Depende, si los campos estan declarados con 2,3,4o n decimales este devolvera la misma cantidad de decimales, a menos que hagas algun arreglo:-D

pepitu 22-09-2005 14:57:27

Gracias
 
Gracias a ambos por las respuestas.
No puedo deciros que todo funciona bien porqué tengo problemas con el PC (error NTLDR) y quizás pierda parte del proyecto que hacía.
Independientemente de ésto...gracias por ayudarme a aclarar ideas y conceptos.

jean19 12-06-2007 23:43:13

hola de verdad quien me pueda ayudar necesito saber mas sobre los campos aggregate :eek: :eek: :eek: gracias


La franja horaria es GMT +2. Ahora son las 07:27:26.

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