Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   NullAsZero en Delphi ? (https://www.clubdelphi.com/foros/showthread.php?t=43927)

aprendiz2 24-05-2007 03:47:52

NullAsZero en Delphi ?
 
Alguien seria tan amable de decirme si existe en Delphi alguna variable de entorno que funcione igual a la del Paradox NullAsZero ?

Sobre todo para SQL en Delphi, donde los NULL a veces son un problema, al hacer operaciones aritmeticas "horizontales" ( en el mismo registro ).

Por ejemplo:

Código SQL [-]
Select (Col1 + Col2) as Suma
From MiTabla

asumiendo que Col1 y Col2 son columnas de tipo numerico, y un registro contiene un NULL en cualquiera de esas dos columnas, la Suma seria NULL
para ese registro ( horizontalmente hablando ).


Se trata de que alguna variable de entorno permita interpretar a los NULL como ceros, a opcion del programador.

Muchas gracias, Saludos a todos !!!!

defcon1_es 24-05-2007 12:44:03

Buenos dias.
Lo que pides es una función SQL, no de Delphi.
Si usas FireBird 1.5 o superior lo puedes hacer con la instruccion COALESCE

Ejp:
Código SQL [-]
Select COALESCE(Col1 + Col2, 0) as Suma
From MiTabla
si uno de ellos (col1 o col2) es null, el resultado será CERO.


Código SQL [-]
Select (COALESCE(Col1, 0) + COALESCE(Col2, 0)) as Suma
From MiTabla
Si cualquiera de ellos es NULL, se sumará CERO

aprendiz2 24-05-2007 18:50:07

Gracias por la informacion
 
Muchas gracias, Defcon1_es !

Estoy trabajando con el SQL que viene con Delphi ( version 5 ), usando tablas tipo Paradox / BDE.

( Entiendo le llaman Local SQL al ).

Sio alguien sabe de alguna forma de lograr interpretar los NULL como ceros, le ruego me enseñe como poder hacerlo.


Muchas gracias !!! Saludos !!!

roman 25-05-2007 00:02:37

Pues el SQL local me parece que no cuenta con Coalesce o equivalente. Si ha de hacerse con SQL podrías intentar algo como

Código SQL [-]
select a,b,a+b
from tabla
where a is not null and b is not null

union all

select a,b,b
from tabla
where a is null and b is not null

union all

select a,b,a
from tabla
where a is not null and b is null

union all

select a,b,0
from tabla
where a is null and b is null

aunque lo veo bastante chapucero.

Podrías intentarlo del lado del cliente agregando un campo calculado al Table que uses, por ejemplo:

Código Delphi [-]
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
  DataSet['suma'] :=
    DataSet.FieldByName('a').AsInteger +
    DataSet.FieldByName('b').AsInteger;
end;

// Saludos

aprendiz2 25-05-2007 04:43:16

Gracias !!
 
"Al Leon se le reconoce por las garras !"

Es increible !!!! Roman siempre encuentra una solucion ingeniosa y elegante !!!!

Con mucho respeto lo llamare G.M.Roman de ahora en adelante. ( G.M. --> Grand Master ).

Si usted estuviese en Borland, estoy seguro que Delphi seria mucho mejor, y definitivamente mejor documentado !!!

Mi admiracion y gran respeto para usted, por su inteligencia, conocimiento, facilidad de expresion y tanta paciencia !!!

Le deseo siempre lo mejor !!!

roman 25-05-2007 18:51:59

La consulta anterior- como dije -es bastante chapucera. Aquí te pongo otra, igual de chapucera pero quizá más eficiente y manejable:

Código SQL [-]
select
  a,b,
  cast(cast(a as char(10)) || '' as float) +
  cast(cast(b as char(10)) || '' as float) suma
from tabla

suponiendo aquí, que a y b son de tipo NUMERIC. El CAST interno,

Código SQL [-]
cast(a as char(10)) || ''

fuerza el valor NULL a ser una cadena, de manera que el CAST exterior ya lo convierte a 0. Si el valor no es NULL, el doble CAST simplemente convierte a cadena y de vuelta a número sin alterar nada.

De esta manera nos evitamos los UNION y nos permite agregar más columnas a la suma. Con el método del UNION, por cada columna extra, se requeriría agregar otro tanto de consultas, es decir, con n columnas se tendrían que usar 2^n consultas en la unión.

Por otra parte, yo prefiero que sigas llamándome roman, que ése es mi nombre. Lo demás, si bien agradezco el halago, sólo son palabras. Aquí somos todos iguales.

// Saludos

aprendiz2 25-05-2007 23:39:38

Muy bonita solucion !!
 
Roman, muy bonita solucion !!!.
Con esto queda mas que resuelto el problema !

Otra vez le agradezco !!!

Saludos y les deseo lo mejor !

PD: Tengo otra pregunta acerca de SQL, pero mejor la pongo en otro hilo, porque no tiene nada que ver con esto.


La franja horaria es GMT +2. Ahora son las 11:26:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi