Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
Sentencia en SQL que hace null como si fuese 0

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)
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 20-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 20-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
Hola,

Disculpa, pero, ¿que quieres decir con:

Cita:
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 20-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 20-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
Hola,

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

Cita:
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #6  
Antiguo 20-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 21-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #8  
Antiguo 21-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
Hola . aqui tienes un articulo muy completo de como hacer tus propias funciones, para solucionar este o cualquier otro problema similar.

Suerte
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #9  
Antiguo 21-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #10  
Antiguo 22-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
Hola,

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


En cuanto a:
Cita:
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:
Cita:
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #11  
Antiguo 22-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #12  
Antiguo 27-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #13  
Antiguo 27-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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/i....0.61_full.exe

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #14  
Antiguo 27-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #15  
Antiguo 27-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #16  
Antiguo 27-10-2003
Avatar de FNADALO
FNADALO FNADALO is offline
Miembro
 
Registrado: oct 2003
Ubicación: Palma de Mallorca
Posts: 97
Poder: 21
FNADALO Va por buen camino
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;
Responder Con Cita
  #17  
Antiguo 30-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
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


La franja horaria es GMT +2. Ahora son las 07:40:40.


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