Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con FireDac Delphi 10.4 y asignar valor Null con DateTimePicker (https://www.clubdelphi.com/foros/showthread.php?t=95377)

maildarofer 03-09-2021 08:38:44

Problemas con FireDac Delphi 10.4 y asignar valor Null con DateTimePicker
 
Hola a tod@s. Aunque llevo siguiendo el Foro desde hace tiempo, esta es mi primera intervención.
Siempre he trabajado con Delphi 7, pero ahora he dado el salto a Delphi 10.4 con FireDac y Mysql
y me he encontrado con un problemilla que ojalá me puedan resolver.
Cuando preparo una consulta para actualizar unos campos lo he hecho siempre de esta manera, es decir, primero monto la consulta utilizando parámetros
y después según el valor que tenga el TDateTimePicker pues asigno un valor Null o su fecha, de la siguiente manera:
//-----------
Código Delphi [-]
FDQuery.SQL.Add('UPDATE tabla ');
FDQuery.SQL.Add('fecha_nacimiento = :fecha_nacimiento');
FDQuery.SQL.Add('WHERE id = :id ');

if (DatetimePicker1.Format <> '') then FDQuery.ParamByName('fecha_nacimiento').IsNull
else FDQuery.ParamByName('fecha_nacimiento').AsDate := DatetimePicker1.Date;

FDQuery.ParamByName('id').AsInteger := StrToInt(LabeledEdit1.Text);

FDQuery.ExecSQL;
//------------
Con Delphi 7 este código funciona correctamente y me actualiza el campo en base de datos (tipo Date) a Null
si el DataTimePicker está vacío o me pone la fecha seleccionada en caso contrario.
Pero FireDac me da un error al asignarle Null, me dice:
Cita:

" [FireDAC] [Phys] [Mysql] -335. Parameter [FECHA_NACIMIENTO] data type is unknown. Hint: specify
TFDParam.DataType or assign TFDParam value before Prepare/Execute call. "
Sé que la forma de asignar el valor Null con este nuevo componente no es la correcta, y según el mensaje
de error debo de especificarle el tipo de dato, pero no sé como hacerlo. Espero que me puedan ayudar.
Gracias.

Casimiro Notevi 03-09-2021 10:42:12

Hola, no olvides usar las etiquetas cuando pongas código, ejemplo:

En cuanto a tu código, aparte de que no sé para qué poner a null un campo, hay un par de errores a simple vista:
Código Delphi [-]
SQL.Add('fecha_nacimiento =
Falta el set
Código Delphi [-]
SQL.Add('set fecha_nacimiento =
Y lo otro es esto:
Código Delphi [-]
if (DatetimePicker1.Format <> '') then FDQuery.ParamByName('fecha_nacimiento').IsNull
else FDQuery.ParamByName('fecha_nacimiento').AsDate := DatetimePicker1.Date;
No tiene una sintaxis correcta, si format<>'' then fecha_nacimiento.AsDate := null // por ejemplo.
O también:
Código Delphi [-]
if (DatetimePicker1.Format <> '') and FDQuery.ParamByName('fecha_nacimiento').IsNull
then FDQuery.ParamByName('fecha_nacimiento').AsDate := DatetimePicker1.Date;
Realmente no se sabe qué quieres hacer ahí.

maildarofer 03-09-2021 11:26:02

Problemas con FireDac Delphi 10.4 y asignar valor Null con DateTimePicker
 
Gracias por responder y por las indicaciones.
El "Set" si lo utilizo, ha sido un descuido al copiar y pegar, gracias.
Lo de poner a Null un campo es porque en base de datos los campos tipo Date suelo dejarlos a NULL cuando no tienen valor.
Es por ello que cuando el componente DateTimePicker en un formulario lo dejo en blanco quiero que el campo correspondiente de base de datos "fecha_nacimiento" lo
deje a NULL y si selecciono una fecha en el formulario me guarde la fecha en base de datos.
No se si será una buena praxis, pero lo llevo haciendo bastante tiempo y funciona bien.
El problema es justamente al asignarle el valor NULL al parámetro para que al realizar el UPDATE me ponga el campo de BBDD a NULL.
Espero haberme explicado bien. Gracias.

maildarofer 03-09-2021 11:41:20

Esto es lo que me da el error:

Código Delphi [-]
if (DatetimePicker1.Format <> '') then FDQuery.ParamByName('fecha_nacimiento').AsDate := null


Me sigue saliendo el error indicado anteriormente,:
" [FireDAC] [Phys] [Mysql] -335. Parameter [FECHA_NACIMIENTO] data type is unknown. Hint: specify
TFDParam.DataType or assign TFDParam value before Prepare/Execute call. "

No sé de que otra forma podré asignarle el valor Null.

kuan-yiu 03-09-2021 12:14:20

La primera vez que se ejecuta una query si no has definido los parámetros de forma persistente indicando su tipo el analizador no sabe lo qué son así que debes decírselo de forma explícita si pretendes pasar un null para que sepa que tipo de null debe poner.
No uso Delphi 10 pero me he encontrado ese problema ya en Delphi 5 y lo soluciono así:
Código Delphi [-]
      parambyname('campo1').DataType:= ftDateTime;

maildarofer 03-09-2021 13:15:11

Muchas gracias!. Tenías razón.
Le he indicado el tipo de dato "ftDate" que para ello he tenido que añadir la librería Data.DB, sino me decía Error: ftDate Undeclared
Luego esto me daba error
Código Delphi [-]
FDQuery.ParamByName('fecha_nacimiento').AsDate := null;

Y he tenido que ponerlo así:

Código Delphi [-]
FDQuery.ParamByName('fecha_nacimiento').DataType := ftDate;
FDQuery.ParamByName('fecha_nacimiento').Clear();

Y como decía antes, he tenido que añadir la librería:
Código Delphi [-]
USES Data.DB;

Solucionado!!. Muchas gracias a todos por vuestra ayuda.


La franja horaria es GMT +2. Ahora son las 11:56:22.

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