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)
-   -   Como insertar NULO en campo numerico (https://www.clubdelphi.com/foros/showthread.php?t=75504)

Antoniov 29-08-2011 18:30:23

Como insertar NULO en campo numerico
 
Uso Delphi XE y Firebird 2.5


A veces necesito insertar algunos nulos en una tabla.
Intento poner el codigo TablaCampo.value := null;

Y compila bien pero al ejecutar da el error "could not convert variant of type (null) into type (integer).

Como lo puedo insertar en un campo de una tabla un valor NULL?

Gracias

roman 29-08-2011 18:44:48

Me parece que no es lo mismo el null de delphi que el que espera la base de datos. Según la ayuda de delphi. lo que debes usar es el método Clear del campo correpondiente:

Código Delphi [-]
TablaCampo.Clear;

// Saludos

Coichi Kake 29-08-2011 18:54:19

Buenas, no soy muy experto en el asunto pero creo que tambien lo pudes hacer de la siguiente manera

TablaCampo.Value := nil

ya que con 'nil' es que delphi identifica que es un null pero para base de datos.

Antoniov 29-08-2011 19:03:32

Campo null
 
Es un campo INTEGER, crees que le puedo poner .clear?

roman 29-08-2011 20:00:54

Pues, la mejor forma de averiguarlo es probando...

Desde luego, en la base de datos debes especificar que el campo acepta nulos.

// Saludos

Antoniov 29-08-2011 20:03:47

Empezando a probar
 
El campo acepta nulos.

Pero a nadie le ha pasado tener que usar una base de datos con nulos?

Casimiro Notevi 29-08-2011 20:35:31

Cita:

Empezado por Antoniov (Mensaje 410387)
Pero a nadie le ha pasado tener que usar una base de datos con nulos?

¿Qué utilidad puede tener?

Antoniov 29-08-2011 20:42:16

Mucha utilidad
 
Muchas veces, un campo no tiene por que tener un valor.

Por ejemplo, las veces que se permite borrar en cascada, hay que poner un null en las referencias borradas.

Otras veces se inserta un registro y en ese momento no se sabe que valor va a tener ese campo.

Ejemplo práctico:
Una base de datos que tiene tareas para los usuarios identificados.
A veces, se crea un mensaje cuyo destinatario no se sabe quién será porque la persona que da de alta y la que asigna trabajos pueden ser distintas.

Tengo más ejemplos prácticos.

roman 29-08-2011 21:35:08

Hay quienes opinan que una tabla que admite valores NULL es una tabla mal diseñada. Por ejemplo, en el caso de haber llaves foráneas que no tienen asignación, puede ponerse un cero (suponiendo que el campo es entero) indicando así que no hay correspondiente en la tabla foránea.

Por otra parte, independientemente de si es correcto o no usar valores NULL, aquí lo que se pregunta es simplemente si se puede o no mandar un valor NULL desde delphi y la respuesta, hasta ahora, sigue siendo la misma: método Clear. Y digo hasta ahora porque habría que hacer la prubea, cosa que no lleva más que unos minutos.

// Saludos

ecfisa 29-08-2011 22:09:02

Hola Antoniov.
Cita:

Es un campo INTEGER, crees que le puedo poner .clear?
Es tan acertado lo que está diciendo román, que ni siquiera hay que molestarse en hacer la prueba, solo leer la ayuda de Delphi:
Cita:

Clear method (TField)
Sets the value of the field to NULL.

Delphi syntax:
procedure Clear;

C++ syntax:
virtual void __fastcall Clear(void);

Description
Call the Clear method to give the field a blank value (a NULL value in SQL terms).
Saludos.:)

Antoniov 29-08-2011 22:46:30

Solucionado
 
Ok, de esa manera también funciona.

He encontrado otra que me resulta más gráfica.

Código Delphi [-]
TablaCampo.AsVariant := NULL;

Muchas gracias a todos.

SAGOAN 12-09-2011 10:29:48

Al hilo de este problema yo tengo uno similar. Desde que uso Delphi 2010 (BBDD interbase) he notado un comportamiento diferente de los datos numéricos en los TDBEdits. Me explico tengo una aplicación que anteriormente estaba compilada con Delphi 2007 (BBDD interbase) y cuando hacía una edit, append, el TDBEdit que estaba enlazado a un campo numérico funcionaba correctamente de forma que si tenía un dato y borraba dicho dato con la tecla "DEL" o "SUPR" al pasar a otro campo el valor del DBEdit quedaba vacio. Ahora con Delphi 2010 no es así, pues si borro y paso a otro campo, el valor vuelve aparecer de nuevo.

He intentado capturar la presión de la tecla de borrado "VK_BACK" en el evento OnKeyPress del DBEdit y añadir lo que aquí se ha dicho:

TDBEdit(sender).field.Clear;

Pero, nada, lo único que funciona es poner un CERO para que borre el anterior valor.

¿Alguna idea?

Muchas Gracias

SAGOAN 12-09-2011 18:29:47

Hola a todos:

He encontrado la solución: pongo el link que me ha ayudado:
_h_ttp://qc.embarcadero.com/wc/qcmain.aspx?d=78920

El código de "IBCustomDataSet.pas" lo he cambiado (línea 3480) por el siguiente y funciona:

//. CODIGO ANTIGUO
//.
//. if (Buffer = nil) or
//. (Field is TIBStringField) and (PChar(Buffer)[0] = #0) then
//. if TIBStringField(Field).EmptyAsNull then
//. rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdIsNull := True
//. else
//. begin
//. rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdDataLength := 0;
//. rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdIsNull := False;
//. end
//. else
//. CODIGO NUEVO
//.
if (Buffer = nil) then
rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdIsNull := True
else
//.FIN GODIGO ANTIGUO

Depués se compila la libreria "IBCustomDataSet.pas" para obtener la DCU y se cambia en el directorio donde se encuentre la original. OJO, no borreis la original, cambiarla de nombre.

Un saludo a todos


La franja horaria es GMT +2. Ahora son las 20:19:58.

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