Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-10-2011
Quim Herrera Quim Herrera is offline
Miembro
 
Registrado: may 2004
Posts: 33
Poder: 0
Quim Herrera Va por buen camino
Nulos y cadenas vacias en Firebird y Delphi

Hola compañeros,

Tengo un problema con los nulos y las cadenas vacias en delphi 2009 y firebird 2.5.
Segun tengo entendido un valor nulo es distinto que una cadena vacia. Lo que me desconcierta es el comportamiento de los componentes: Se graba una cosa u otra depende del componente que utilizo.

Supongamos una tabla con:

Código SQL [-]
create table TEST
 ( NCODI         int default 0 not null , 
   CAMPO1     varchar( 15 ) collate ES_ES_CI_AI , 
   CAMPO2     varchar( 15 )  collate ES_ES_CI_AI , 
   CAMPO3     varchar( 15 ) collate ES_ES_CI_AI , 
 CONSTRAINT pk_TEST_NCODI PRIMARY KEY ( NCODI ) );

Utilizando un Tibsql:
Edit1.Text := 'a';
Edit2.Text := 'b';
Edit3.Text := '';

.... insert into TEST (1, Edit1.Text, Edit2.Text, Edit3.Text)
se graba 1, 'a', 'b', '' (cadena vacia)
con lo cual una busqueda
select * from TEST where CAMPO1='a' and CAMPO2='b' and CAMPO3=''
encuentra el registro.

Sin embargo si utilizo TibTable, TIBDataset o un TClientDataset con un TDataSetProvider
al hacer
Dataset.append;
Dataset.Fieldbyname('CAMPO1').asstring := Edit1.Text;
Dataset.Fieldbyname('CAMPO2').asstring := Edit2.Text;
Dataset.Fieldbyname('CAMPO3').asstring := Edit3.Text;
Dataset.post;

se graba 1, 'a', 'b', NULL
Lo que implica que esta convirtiendo la cadena vacia '' en NULL. ¿No hay forma de insertar una cadena vacia en un campo utilizando estos componentes?
Entonces la busqueda
select * from TEST where CAMPO1='a' and CAMPO2='b' and CAMPO3=''
no lo encuentra.

El no saber si va a haber cadenas vacias o nulos me obliga a escribir mucho más código al hacer busquedas:
Lo que seria:
Código Delphi [-]
strwhere := 'CAMPO1='+ quotedstr( Edit1.Text) + 'CAMPO2='+ quotedstr( Edit2.Text) + 'CAMPO3='+ quotedstr( Edit3.Text)
hay que ponerlo como
Código Delphi [-]
if (Edit1.text <> '') and ( Edit2.text <> '') and (Edit3.Text = '') then 
   strwhere := 'where ( CAMPO1= '+ quotedstr( Edit1.Text) + ' and  CAMPO2='+ quotedstr( Edit2.Text) + '   and ( CAMPO3='' or CAMPO3 is NULL )';
if (Edit1.text <> '') and ( Edit2.text = '') and (Edit3.Text = '') then 
   strwhere := 'where ( CAMPO1= '+ quotedstr( Edit1.Text) + ' and  ( CAMPO2='' or CAMPO2 is NULL )   and ( CAMPO3='' or CAMPO3 is NULL )';
if (Edit1.text = '') and ( Edit2.text = '') and (Edit3.Text = '') then 
   strwhere := ( CAMPO1='' or CAMPO1 is NULL ) and ( CAMPO2='' or CAMPO2 is NULL ) and ( CAMPO3='' or CAMPO3 is NULL )
La otra opción es forzar siempre a nulos al grabar pero tambien tengo que escribir más código:
Utilizando un Tibsql:
if (Edit1.text <> '') and ( Edit2.text <> '') and (Edit3.Text = '') then
.... insert into TEST (1, Edit1.Text, Edit2.Text, null)
if (Edit1.text <> '') and ( Edit2.text = '') and (Edit3.Text = '') then
.... insert into TEST (1, Edit1.Text, null, null)
if (Edit1.text = '') and ( Edit2.text = '') and (Edit3.Text = '') then
.... insert into TEST (1, null, null, null)


¿Hay alguna otra forma de solucionarlo?


Saludos y gracias de antemano

Quim Herrera
Responder Con Cita
  #2  
Antiguo 06-10-2011
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
entonces pregunta en FB que si llega un '' ponga un NULL en esa variable de entrada y ya.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #3  
Antiguo 06-10-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Tal vez con un coalesce te puedas mover mejor a la hora del where, eso si, de esta forma no habrá distinción entre null y espacios vacios.

Código SQL [-]
strwhere := 'coalesce(CAMPO1,'')='+ quotedstr( Edit1.Text) + .....
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #4  
Antiguo 06-10-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
o podrias usar la funcion isnull

Código SQL [-]
Select Campo1, campo2, campo3, isnull(campo3,'') from...
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 06-10-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Quim Herrera.

El comportamiento del TIBDataSet y TIBQuery está reportado aquí, y aquí la resolución...

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 06-10-2011
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Cita:
Empezado por oscarac Ver Mensaje
o podrias usar la funcion isnull

Código SQL [-]
Select Campo1, campo2, campo3, isnull(campo3,'') from...
ISNULL es de MsSQL, para FB es COALESCE, como dijo el compañero RONPABLO
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #7  
Antiguo 06-10-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
sorry, no me percate de ese detalle.. pero la idea es la misma
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #8  
Antiguo 07-10-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cabe anotar que IsNull es diferente que el Coalesce, teniendo este ultimo más funcionalidad, por ejemplo con el coalesce yo puedo evaluar mas de un campo o variable, algo así como
Código SQL [-]
... coalesce(Campo1, Campo2, Campo3, 'un valor cualquiera si no hay datos en los campos anteriores') ...
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #9  
Antiguo 07-10-2011
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
que buen dato
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #10  
Antiguo 07-10-2011
Quim Herrera Quim Herrera is offline
Miembro
 
Registrado: may 2004
Posts: 33
Poder: 0
Quim Herrera Va por buen camino
Muchísimas gracias a todos.

Coalesce(campo1, '') resuelve perfectamente mi problema.

Un abrazo.

Quim Herrera
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Etiquetas Vacias en XML BuenaOnda Varios 1 29-10-2010 23:54:23
valores nulos en delphi thelibmx Varios 5 22-06-2007 01:37:16
Problema con fechas vacias URBANO SQL 2 31-01-2006 12:42:42
Como concateno cadenas en Firebird?¿? burasu Firebird e Interbase 6 21-07-2004 13:38:29
problemas con celdas vacias davidgaldo Conexión con bases de datos 4 28-05-2004 10:33:18


La franja horaria es GMT +2. Ahora son las 14:02:32.


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