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)
-   -   Consulta devuelve null (https://www.clubdelphi.com/foros/showthread.php?t=94680)

aqueron2000 21-05-2020 09:05:15

Consulta devuelve null
 
Buenos dias.

Tengo la siguiente consulta con la que quiero obtener el ultimo precio de compra UPC y el ultimo precio de venta UPV y el margen a ultimo precio, que sera la resta del UPV - UPC.
La consulta funciona perfectamente, el problema es que si no ha habido ninguna compra me devuelve null, en UPC y UPV, cuando lo que quiero es que me devuelva 0 en UPC y en UPV el precio y no NULL como hace, aunque si que tiene movimiento.

pongo aqui la consulta SQL.

Estoy usando firebird 2.5

Código SQL [-]
  select coalesce(ult_precio_compra, 0) as Ult_Precio_Compra , Ult_Precio_venta , Ult_Precio_venta - ult_precio_compra as Margen_Ult_precio
  from (select first 1 cast(coalesce(apl.precio_neto_regalo_dtocabe,0) as numeric(18,4) ) as ult_precio_compra from albaprovelineas apl
    join albaprovecabe apc on apl.albaprovecabe_id = apc.albaprovecabe_id
    where apc.estado > 9 and apl.precio_neto_regalo_dtocabe > 0
    and apl.articulo_id = :xarticulo
    order by apc.fecha_albaran desc )
,
( select first 1 li.precio_neto as Ult_Precio_venta from lineaalbaclie li
    join cabealbaclie ca on ca.cabealbaclie_id = li.cabealbaclie_id
    where ca.estado > 9 and li.precio_neto > 0
    and li.articulo_id = :xarticulo
    order by ca.fechaalbaran desc )

Gracias y un saludo.

Casimiro Notevi 21-05-2020 10:44:14

Usa coalesce también.
Aunque lo ideal es no tener campos con valores nulos, "not null default 0"

Neftali [Germán.Estévez] 21-05-2020 10:51:42

Si la consulta la haces sobre albaprovelineas y si esta tabla no tiene lineas no te devolverá ningun registro, por lo tanto obtienes valores NULOS en todos los campos. Me imagino que eso es lo que te está pasando.
Tal vez deberías utilizar un CASE, para determinar cuando hay o no registros en la tabla de compras y hacer algo diferente.

aqueron2000 21-05-2020 10:59:31

Cita:

Empezado por Casimiro Notevi (Mensaje 537321)
Usa coalesce también.
Aunque lo ideal es no tener campos con valores nulos, "not null default 0"

Hola Casimiro, gracias por responder.

Todos los campos numéricos están como not null y default 0, por lo que no hay ningún campo numérico a null.

El problema es que la primera sentencia, la del UPC, no devuelve ningún resultado, pues no hay ninguna compra de este producto, y me devuelve toda la sentencia a null.
Me gustaría saber si tiene arreglo con este tipo de consulta, y no buscar otra solución, como hacerlo en un procedimiento almacenado, p.e.

Gracias.

aqueron2000 21-05-2020 11:33:55

Hola Neftali.
Si, era por ver, si había alguna solución, que se me había pasado, en este caso utilizar el CASE para ver si la compra tiene movimientos, lo veo lioso para después darle mantenimiento, prefiero un Procedimento o un Execute block.

Gracias y un saludo.

Casimiro Notevi 21-05-2020 12:04:26

Cita:

Empezado por aqueron2000 (Mensaje 537323)
Todos los campos numéricos están como not null y default 0, por lo que no hay ningún campo numérico a null.
El problema es que la primera sentencia, la del UPC, no devuelve ningún resultado, pues no hay ninguna compra de este producto, y me devuelve toda la sentencia a null.

Con coalesce(loquesea,0) tiene que devolver 0 si no hay valores.

aqueron2000 21-05-2020 12:32:36

Cita:

Empezado por Casimiro Notevi (Mensaje 537327)
Con coalesce(loquesea,0) tiene que devolver 0 si no hay valores.

Pues
Código SQL [-]
select articulo_id
from articulos where articulo_id = 978798878
devuelve null. ( articulo_id = 978798878 no existe )
Código Delphi [-]
select coalesce(articulo_id, 0)
from articulos where articulo_id = 978798878
También devuelve null

Casimiro Notevi 21-05-2020 12:43:08

Cierto, has dicho que no hay null, lo había olvidado.

Casimiro Notevi 21-05-2020 12:51:31

Creo que lo mejor es que hagas un procedimiento almacenado que devuelva cero en caso de nulo.

egostar 21-05-2020 16:00:04

Hola

O se podría hacer algo "menos complejo"...

Código Delphi [-]
If not Query.isEmpty then
  //Pasar valores recuperados
else
  //Asignar valores en 0

Saludos


La franja horaria es GMT +2. Ahora son las 10:03:26.

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