Ver Mensaje Individual
  #2  
Antiguo 10-11-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Reputación: 22
javiermorales Va por buen camino
No es que no funcionen los componentes, la BD, la conexión o las actualizaciones de los detalles, el problema reside en que al cambiar de sistema, el motor de base de datos no permite que se hagan cálculos con campos que tengan el valor null.

Es decir, con el antiguo sistema, se podía poner un campo calculado que realizase el calculo de una multiplicación entre valores de un registro y si alguno de ellos era null, le asignaba al resultado el valor cero. pero ahora lo que ocurre es que salta un "raised exception" en la clase "EVariantTypeCastError" con el mensaje "no se puede convertir variant de tipo (Null) al tipo (Double)".

Ejemplo:
Código Delphi [-]
procedure TDM.DSeF1CalcFields(DataSet: TDataSet);
begin
    DataSet.FieldValues['TotIRPF'] := RoundEuros(DataSet.FieldValues['F1_BASE2']*
                                      (DataSet.FieldValues['F1_RIRPF']/100));
end;
Este código antes no fallaba y aunque "F1_BASE2" o "F1_IRPF" fuesen Null, se le asignaba cero al resultado. Ahora aparece el error indicado y además no te indica la línea de código donde falla (se vá a la última línea del proyecto).

Se soluciona poniendo:
Código Delphi [-]
procedure TDM.DSeF1CalcFields(DataSet: TDataSet);
begin
  if (DataSet.FieldValues['F1_BASE2']=null) or
     (DataSet.FieldValues['F1_BASE2']=0) or
     (DataSet.FieldValues['F1_RIRPF']=null) or
     (DataSet.FieldValues['F1_RIRPF']=0) then
    DataSet.FieldValues['TotIRPF'] := 0
  else
    DataSet.FieldValues['TotIRPF'] := RoundEuros(DataSet.FieldValues['F1_BASE2']*
                                      (DataSet.FieldValues['F1_RIRPF']/100));
end;
Pasa lo mismo con una asignación a una etiqueta de un valor null
Código Delphi [-]
Obras.Label1.Caption := DataSource1.DataSet.FieldValues[OBR_NOM];
antes no le ponía nada y le asignaba null sin que pasase nada y ahora salta el error.

Esto hace que tenga que repasar por completo toda la aplicación.
¿Alguien conoce alguna solución?
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita