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 09-11-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
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.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #2  
Antiguo 10-11-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 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
  #3  
Antiguo 10-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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 .

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
Responder Con Cita
  #4  
Antiguo 10-11-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Muchas gracias Roman, lo pruebo inmediatamente.

Gracias de nuevo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #5  
Antiguo 10-11-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Roman, funciona perfectamente. Gracias de nuevo
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
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 22:13:48.


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