PDA

Ver la Versión Completa : Poner un campo de fecha a 'Null'


gluglu
29-11-2005, 16:49:23
Hola Amigos !

Tengo un problema cuanto menos curioso. Lo que yo precisamente quiero es poner un campo de fecha a 'Null' !

Mi problema es cuando previamente ese campo YA CONTENIA una fecha !

Tengo un DBEdit, si el campo es Null y no introduzco caracter alguno, perfecto. Pero si previamente había introducido una fecha y vuelvo a editar el campo, no tengo manera de borrar la fecha completamente ! Si pongo todo a 0 me dá error diciendo que no es fecha válida. Y caracteres 'espacio' no me deja.

Indicar que tengo puesto una máscara EditMask = '!99/99/0099;1;_'

Un saludo a todos !

jhonny
29-11-2005, 18:08:52
Que sucede si usas este truquito?


procedure TForm1.Button1Click(Sender: TObject);
begin
TDataset.Edit;
TDataset.FieldByName('Fecha').Clear;
TDataset.Post;
end;


Donde TDataset es el TDataSet que estes usando... TTable, TQuery, TRxMemoryTable, T...

gluglu
29-11-2005, 18:19:24
No había pensado en la solución tuya.

No obstante, creo que no me soluciona mi asunto en el momento de la edición por parte del usuario en pantalla del campo correspondiente.

Tengo p.ej. 01/01/2005 grabado ya previamente en el DataSet asociado. Entonces al pedir la edición en pantalla del DBEdit, me aparece, claro está, por defecto 01/01/2005 en pantalla. (Tengo la propiedad AutoSelect a True).

Si ahora el usuario pulsa 'Supr' (con lo que el campo DBEdit se queda como '__/__/____') y enter, el Delphi me devuelve un error interno de fecha no válida antes de poder inteceptarlo por ningún evento (... no es verdad?).

Y por lo tanto no veo la manera de salir de dicho DBEdit para utilizar en su caso la funcion 'Clear' que propones.

P.D. Indicar que utilizo Delphi 2005.

Gracias de nuevo

gluglu
29-11-2005, 18:54:06
Aunque ponga un botón adicional para poner el campo de fecha a 'null' IBQuery.FieldByName('DATEFROM').Clear;me dá error : 'Invalid variant type conversion of Null variant into TDateTime'

roman
29-11-2005, 20:38:17
no tengo manera de borrar la fecha completamente ! Si pongo todo a 0 me dá error diciendo que no es fecha válida. Y caracteres 'espacio' no me deja.

Indicar que tengo puesto una máscara EditMask = '!99/99/0099;1;_'


Me parece que tu problema entonces no es como poner en null el campo en la tabla sino en el dbedit. Quizá podrías usar un truquito de poner una máscara vacía cuando el usuario borre el control. De esta manera, aun cuando el control contenga internamente la fecha por defecto, al usuario le aparece en blanco. Al momento de guardar el registro (en el evento OnBeforePost) te fijas si la máscara está vacía, lo que indicaría que uses el método Clear que te indicaron.

// Saludos

gluglu
29-11-2005, 23:43:07
Gracias Roman,

Tu consejo me encaminó bien, aunque me quedan ciertas dudas.

La solución que le he dado :procedure TFrame.DBEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_DELETE then
If DBEdit1.Text = ' / / ' then begin
IBQuery1DATEFROM.EditMask := '';
IBQuery1DATEFROM.OnValidate := nil;
DBEdit1.Text := '';
IBQuery1.Edit;
IBQuery1.Post;
IBQuery1DATEFROM.EditMask := '!99/99/9900;1;_';
IBQuery1DATEFROM.OnValidate := IBQuery1DATEFROMValidate;
DBEdit1.SetFocus;
end;
end;El problema adicional que tenía es que el campo correspondiente tiene un evento OnValidate, y si simplemente ponía el texto del DBEdit en blanco, entonces en el evento OnValidate me volvía a salir el mismo error 'Invalid variant type conversion of Null variant into TDateTime'.

Mi duda sigue siendo por qué no me funciona (al menos en mi Delphi 2005), la función Clear con el campo de fecha, ya que me dá el error que indico arriba.

Y también agradecería si alguien me pudiera aclarar como poder ejecutar correctamente este comando :IBQuery1DATEFROM.AsVariant := null;Un saludo de nuevo a todos !