PDA

Ver la Versión Completa : Consulta devuelve null


aqueron2000
21-05-2020, 09:05:15
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


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 (https://firebirdsql.org/refdocs/langrefupd21-case.html), para determinar cuando hay o no registros en la tabla de compras y hacer algo diferente.

aqueron2000
21-05-2020, 10:59:31
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
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
Con coalesce(loquesea,0) tiene que devolver 0 si no hay valores.
Pues
select articulo_id
from articulos where articulo_id = 978798878
devuelve null. ( articulo_id = 978798878 no existe )
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"...


If not Query.isEmpty then
//Pasar valores recuperados
else
//Asignar valores en 0


Saludos