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)
-   -   Delphi 7 y Access 2003 (https://www.clubdelphi.com/foros/showthread.php?t=15926)

javiermorales 09-11-2004 19:52:47

Delphi 7 y Access 2003
 
Hola a todos/as, he comenzado el hilo en OOP, pero conforme investigo en el problema parece ser más correcto ponerlo en este foro.

Antes trabajaba con WMe, Delphi 7 y Access 2000 pero he tenido que cambiar de ordenador pasando a WXp Profesional, Delphi 7 y Access 2003.

La aplicación compiló sin ningún error pero aparece un problema, no funciona correctamente en lo siguiente (de momento):

1.- No actualiza el valor del campo relacionado en los TDBLookupComboBox

2.- En las relaciones Maestro/Detalle, no introduce de manera automática los campos del Maestro en el Detalle al crear un nuevo registro en el Detalle

Por favor es muy urgente que alguien me eche una mano. Gracias de antemano.

javiermorales 10-11-2004 11:04:44

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?

roman 10-11-2004 15:46:26

Lo que realmente es extraño es que te funcionara anteriormente ya que la versión de Delphi es la misma y me parecería extraño que se debiera al cambio de versión de Access.

Pero bueno, cosas más raras he visto :p .

En Delphi está la variable global NullStrictConvert que determina qué hacer cuando se debe convertir un valor Null en otro tipo de datos. Su valor por defecto es true, que significa que se lanzará la excepción EVariantTypeCastError, tal como te ocurre. Si NullStrictConvert es false, se convierte de acuerdo al tipo de datos destino como sigue:
  1. cero si el tipo destino es numérico
  2. Valor de la variable NullAsStringValue si el tipo destino es String
  3. false si el tipo destino es booleano

Así que, de acuerdo a esto, basta que pongas NullStrictConvert := false.

// Saludos

javiermorales 10-11-2004 16:02:36

Muchas gracias Roman, lo pruebo inmediatamente.

Gracias de nuevo.

javiermorales 10-11-2004 18:40:25

Roman, funciona perfectamente. Gracias de nuevo


La franja horaria es GMT +2. Ahora son las 21:43: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