PDA

Ver la Versión Completa : Sentencia en SQL que hace null como si fuese 0


Giniromero
20-10-2003, 11:26:42
Hola a todos,

estoy sumando campos numéricos, y he detectado que cuando hago una suma entre un campo con valor, ejem, 50, más un campo que no lo tiene valor numérico, (y por tanto tiene valor null), el resultado es null, en vez de 0 como yo necesitaría. Se que hay una forma de hacer que ese null se considere como 0 para estos casos, pero no se cual es, ni como se utiliza.

¿puede ayudarme alguien?

Saludos y gracias a todos,

Virginia
PD (estoy usando interbase 7 con dialecto sql 3)

guillotmarc
20-10-2003, 11:34:09
Hola.

Interbase 6 no tenia esa función. Desconozco si la han añadido en IB 7.

Prueba con la sintaxis de otros servidores : COALESCE(Campo, 0), NVL(Campo, 0), ISNULL(Campo, 0), CASE WHEN Campo IS Null THEN 0 ELSE Campo END

Si IB 7 no las acepta, y no encuentras ninguna función equivalente en la documentación, deberás usar una UDF.

Saludos.

Giniromero
20-10-2003, 13:01:32
Hola,

Disculpa, pero, ¿que quieres decir con:

Si IB 7 no las acepta, y no encuentras ninguna función equivalente en la documentación, deberás usar una UDF.

?

Muchas gracias

Virginia

guillotmarc
20-10-2003, 13:38:24
Hola.

¿ Que parte ?

Si Interbase no las acepta, quiero decir si al usar estas funciones te da un error. Lo de encontrar una función equivalente en la documentación, es buscar en el manual de Interbase una función nueva (tiene que haber aparecido en IB 6.5 o IB 7) que haga este calculo. Finalmente usar una UDF, es usar una librería externa de funciones, en forma de una dll.

Saludos.

Giniromero
20-10-2003, 15:14:23
Hola,

Perdona, no he sido muy explicita antes, es esta parte la que no entiendo:

Finalmente usar una UDF, es usar una librería externa de funciones, en forma de una dll.

¿Como se hace esto?

Disculpa, pero soy algo novata en la programación sql.

Gracias por todo,

Virginia

__cadetill
20-10-2003, 17:48:30
te recomiendo la lectura de este articulo hecho por el amigo Aprendiz y que está en la sección Interbase-Articulos dentro de esta misma web

http://www.clubdelphi.com/ib/articulos/udf/udf.php

Giniromero
21-10-2003, 15:34:52
Hola,

Muchas gracias por el articulo, me ha resultado muy util, pero, ¿sabes de alguna udf que tenga una función que entienda los campos null como 0 para poder usarlos para las sumas?

Gracias,

Virginia

Viet
21-10-2003, 16:14:56
Hola . aqui (http://www.ibphoenix.com/a558.htm?a=ibphoenix&page=ibp_howto7) tienes un articulo muy completo de como hacer tus propias funciones, para solucionar este o cualquier otro problema similar.

Suerte ;)

guillotmarc
21-10-2003, 17:32:35
Hola.

Yo utilizo la fbudf.dll que viene con Firebird 1. En concreto utilizo la función iNVL (NVL para enteros) que se declara como :

DECLARE EXTERNAL FUNCTION INVL
INTEGER BY DESCRIPTOR,
INTEGER BY DESCRIPTOR
RETURNS INTEGER BY DESCRIPTOR
ENTRY_POINT 'idNvl' MODULE_NAME 'fbudf'

Supongo que podrás utilizar esa librería en Interbase 7 (puedes descargar Firebird en http://firebird.sourceforge.net ). Por cierto, en Firebird 1.5, estas funciones vienen en el propio motor, y no hace falta utilizar UDF's.

Saludos.

Giniromero
22-10-2003, 11:52:10
Hola,

Gracias de nuevo por el artículo y demás ayuda recibida.


En cuanto a:
puedes descargar Firebird en http://firebird.sourceforge.net ).

Disculpa si te parezco torpe, pero, ¿me puedes explicar un poco más sobre este programa?
¿Para que sirbe?
¿que versión me bajo?, (hay muchas distintas en esa página).
¿Podría bajarme sólo lo relativo a la libreria fbudf.dll?

En cuanto a:
DECLARE EXTERNAL FUNCTION INVL
INTEGER BY DESCRIPTOR,
INTEGER BY DESCRIPTOR
RETURNS INTEGER BY DESCRIPTOR
ENTRY_POINT 'idNvl' MODULE_NAME 'fbudf'

¿Como lo declaro para poder usarlo? Supongo que tendré que conseguir la DLL correspondiente primero.

Bueno, en cualquier caso, muchas gracias por la ayuda.

Saludos

Virginia

guillotmarc
22-10-2003, 12:31:20
Hola

Te he enviado por correo esa librería.

En el artículo de Aprendiz, creo que te explica como registrar una función de la librería para poder utilizarla.

Respecto a Firebird, es una base de datos Open Source, que ha evolucionado a partir del código de Interbase 6.0 cuando Borland liberó las fuentes de esa base de datos. Borland ya no evoluciona Interbase en forma Open Source, sinó que las nuevas versiones (6.5 y 7) han salido con licencia comercial (de pago).

Al ser una base de datos Open Source por la que no hay que pagar licencias al hacer una instalación de Firebird en un cliente (al contrario que con Interbase), se está popularizando mucho ultimamente. Ademas tiene un grupo de desarrollo muy activo, que ha añadido mejoras muy interesantes en la versión 1.5. (Por ejemplo, el problema que tienes con los valores nulos, se puede solucionar en Firebird 1.5 sin usar librerías externas, puesto que el motor soporta directamente que en la consulta se utilizen las funciones NVL, COALESCE, ISNULL, ...)

Saludos.

Giniromero
27-10-2003, 11:39:11
Hola,


Muchas gracias por los ficheros, guillotmarc y por la ayuda. Estoy con ello, pero tengo una duda. Para usar el Firebird, ¿tengo que pasar mi base interbase a esa otra base de datoso es como usar mi base de datos desde otro "programa" de gestión de bases de datos?

En cualquier caso, estoy viendo como usar lo que me enviaste por e-mail.

Muchas gracias por todo, una vez más.

Saludos

Virginia

guillotmarc
27-10-2003, 12:03:04
Hola.

Aunque probablemente no te haga falta para pasar de Interbase 6 a Firebird 1, se recomienda que para pasar los datos, hagas una copia de seguridad con Interbase 6 y la restaures con Firebird 1.

Podrás seguir utilizando tu programa favorito de Administración de Interbase/Firebird con la base de datos en Firebird. Aunque si quieres probar otros, que aseguran una compatibilidad 100 % con Firebird, este es mi favorito (freeware) :

http://www.hksoftware.net/download/ibep_2.5.0.61_full.exe

Saludos.

Giniromero
27-10-2003, 12:18:48
Hola,

si lo intento ejecutar desde el scrip de ibExpert me da error.

He colocado el archivo fbudf.dll en la carpeta UDF de interbase, y el fbudf.sql en el mismo directorio en el que están los que vienen por defecto con la BD Interbase, que si me han funcionado.

¿Tal vez no funciona cuando tienes IB7?

Saludos, y gracias

Virginia

guillotmarc
27-10-2003, 12:35:52
Hola

El archivo fbudf.sql es un script para declarar las funciones. Tienes que copiar las lineas de la función que te interesa, al Script Executive del IB-Expert, y ejecutarlas.

Entonces te quedan las funciones definidas en la base de datos, apareciendo en la sección UDF de IB-Expert.

A partir de ese momento puedes utilizar la función dentro de cualquier consulta.

NOTA : Nunca he probado Interbase 7, aunque no creo que hayan hecho cambios que impidan utilizar una udf anterior, todo es posible.

Saludos.

FNADALO
27-10-2003, 18:18:23
Hola Mando un procedimiento que hace lo que pides
procedure SacaNulos(DataSet: TDataSet);
var
i: integer;
begin
try
with DataSet do begin
edit;
for i := 0 to fields.count do begin
if fields[i].value = null then
if fields[i] is TNumericField then fields[i].value := 0
else if fields[i] is TStringField then fieldl[i].value :=''
else if fields[i] is TDateTimeField then
fields [i]:='1/1/1900';
end;
post;
end;
except end;
end;

Giniromero
30-10-2003, 16:51:48
Muchas gracias a todos por la ayuda.

Al final, lo que he hecho a sido, poner todos los campos relativos a datos económicos que tenían el valor null como 0, y obligar al programa a que guarde siempre algún valor que no sea null.

Lo dicho, muchas gracias.

Virginia