Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-09-2005
pepitu pepitu is offline
Miembro
 
Registrado: sep 2005
Posts: 25
Poder: 0
pepitu Va por buen camino
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

Última edición por dec fecha: 21-09-2005 a las 23:37:08. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #2  
Antiguo 21-09-2005
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
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..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #3  
Antiguo 21-09-2005
pepitu pepitu is offline
Miembro
 
Registrado: sep 2005
Posts: 25
Poder: 0
pepitu Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 22-09-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
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
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #5  
Antiguo 22-09-2005
pepitu pepitu is offline
Miembro
 
Registrado: sep 2005
Posts: 25
Poder: 0
pepitu Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 12-06-2007
jean19 jean19 is offline
Registrado
 
Registrado: may 2007
Posts: 1
Poder: 0
jean19 Va por buen camino
hola de verdad quien me pueda ayudar necesito saber mas sobre los campos aggregate gracias
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


La franja horaria es GMT +2. Ahora son las 15:16:49.


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