Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con valores no null en FIREBIRD 2.1 (https://www.clubdelphi.com/foros/showthread.php?t=62763)

Jose Roman 13-01-2009 16:11:45

Ayuda con valores no null en FIREBIRD 2.1
 
Hola a todos, tengo una base de datos de unos estudiantes con los siguientes campos:
CODIGO CHAR(6) y NOMBRE VARCHAR(30)
Cuando hago una consulta con el codigo por ejemplo '001423' da el resultado deseado, pero si ingreso un codigo que no esta en la base de datos no da null, asi que esto me presenta problemas pues utilice un select asi:
SELECT COALESCE(NOMBRE,'NO REGISTRADO') FROM ESTUDIANTESWHERE CODIGO = :C
y necesito que me de indique la base de datos que el registro no existe, que debo hacer...
Gracias

Caro 13-01-2009 16:37:05

Hola Jose Roman, no te sirve preguntar por IsEmpty de tu dataSet, IsEmpty te devuelve True si no ha encontrado ningún resultado. Con la consulta que pones si no encuentra un registro con el codigo "c", no va devolver resultados, el Coalesce te va funcionar si ese codigo existe y el nombre sea Null.

Código Delphi [-]
 ......
 Query.Sql.Text := 'SELECT COALESCE(NOMBRE,'NO REGISTRADO') FROM ESTUDIANTESWHERE CODIGO = :C';
 Query.Open;
 
 if Query.IsEmpty then
  Showmessage('El estudiante no existe.');

Saluditos

jhonny 13-01-2009 17:06:36

Pero es que en teoria debe funcionarte eso que estas haciendo sin problema, acabo de hacer una prueba similar a la que comentas y me ha funcionado bien... Si estas haciendo esto en un procedure sería inetresante ver todo el procedure por si encontramos algo fuera de lo común.

Jose Roman 13-01-2009 17:09:01

Pero en que version de FIREBIRD realizaste la prueba?

jhonny 13-01-2009 17:15:57

Ahhhh, ya comprendo, es que claro, como la consulta no te arroja ningun dato, entonces coalesce no tiene registros para comparar si este campo es NULL o no, por lo que no tendra NULL un campo al no tener ningún registro.

Si es un procedimiento almacenado en el que estas ejecutando dicho coalesce, podrias aplicarlo a la variable donde cae ese valor, mas no en la consulta en si. (Lo dicho, muestra todo el procedimiento para ver que podemos hacer).

Cita:

Empezado por Jose Roman
Pero en que version de FIREBIRD realizaste la prueba?

Realmente la hice con Firebird 2.1, pero como ya es notable, habia hecho la prueba con una consulta que si me devolvia registros y uno de sus campos tenia valores NULL y no. Por lo que estaba haciendo la prueba de forma distinta a lo que tu estas haciendo. Muestranos el procedimiento almacenado y ya habra alguna buena solución.

Jose Roman 13-01-2009 17:19:29

Pues te cuento que no lo estoy realizaon a nivel de procedimiento solo a nivel de consulta...., sabes de casualidad alguna manera para que me de ese mensaje, sin tener que utilizar el Dataset

jhonny 13-01-2009 17:36:04

Cita:

Empezado por Jose Roman (Mensaje 334331)
Pues te cuento que no lo estoy realizaon a nivel de procedimiento solo a nivel de consulta...., sabes de casualidad alguna manera para que me de ese mensaje, sin tener que utilizar el Dataset

Entonces crea un procedimiento almacenado asi:

Código SQL [-]
CREATE PROCEDURE SP_NOMBRE_EST (
    C varchar(6))
returns (
    NOMBRE varchar(30))
as
begin
  SELECT NOMBRE FROM
  ESTUDIANTES WHERE CODIGO = :C
  INTO :NOMBRE;

  NOMBRE = COALESCE(:NOMBRE,'NO REGISTRADO');
end

El cual podras llamar, asi por ejemplo:

Código SQL [-]
select NOMBRE from SP_NOMBRE_EST('12356');

jhonny 13-01-2009 17:43:26

¿Porque sera que a uno siempre se le prende el "bombillito" cuando ya ha metido la pata? :D:D:D

En la sola consulta y sin necesidad de ningún procedimiento almacenado, puedes hacerlo tambien, haciendo uso de la función LIST, de la siguiente forma:

Código SQL [-]
select COALESCE(LIST(NOMBRE), 'NO REGISTRADO') from ESTUDIANTES where CODIGO='123456'

Esto, te devolvera "NO REGISTRADO" en caso de que no coincida el codigo con ningún registro y el NOMBRE del estudiante en caso de que si coincida.

Jose Roman 13-01-2009 18:17:15

Muchas gracias, definitivamente me falta mucho por explorar en Firebird 2.1.

jhonny 13-01-2009 19:10:48

Cita:

Empezado por Jose Roman (Mensaje 334344)
Muchas gracias, definitivamente me falta mucho por explorar en Firebird 2.1.

Acabo de publicar un articulo en mi blog a raiz de este hilo :).

pcicom 14-01-2009 05:13:06

ALGO MAS SIMPLE..

Código SQL [-]
select (casE when count(CODIGO)=0 then 'NO REGISTRADO' else 'REGISTRADO' end) from ESTUDIANTES where CODIGO='123456'

jhonny 14-01-2009 13:44:36

Cita:

Empezado por pcicom (Mensaje 334407)
ALGO MAS SIMPLE..

No solo mas simple, si no tambien mas economico y rapido, pero pregunto, ¿Como recuperarias el registro o los registros si existieran?


La franja horaria es GMT +2. Ahora son las 05:08:17.

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