Ayuda SAP

Query nivel de servicio

Etiquetas: #<Tag:0x00007f704b21f300>

Buenas Tardes Compañeros, tengo una consulta que hace de nivel de servicio,
Ejemplo tengo un pedido de 10 artículos con ‘X’ numero de entradas posteriores o sin entrada, como ven son 2 tablas distintas OPOR (Pedidos) y OPDN (entrada de mercancía) cada uno con su propia fecha, necesito que en el caso de que la fecha de la entrada sea nula la pueda sustituir por una con entrada valida en el pedido me tome la fecha de la entrada consiguiente y asi mostrar los nulos.

		CASE WHEN T1."ItemCode"=T2."ItemCode" THEN T2."ItemCode" else 'No Entregado En Esta Entrada' END AS "Entrada",
 		CASE WHEN T2."Quantity"IS NULL THEN 0 ELSE T2."Quantity" END as "CantidadEntrada",
		ifnull(T3."DocDate",T0."DocDate")  as "DocDate",
				CASE WHEN T2."Quantity" IS null then (T1."Quantity"*-1) else (T2."Quantity"-T1."Quantity") end as "Diferencia", 
		CASE WHEN T2."Quantity" IS NULL THEN 0 ELSE (T2."Quantity"/T1."Quantity")*100 END AS "NivelXLinea", 
		(SELECT SUM(T5."Quantity") FROM "REP_NIVEL_SERV_PEDIDOS_DET" T5 where T0."DocNum"=T5."DocNum") as "SumaPedido",
 		CASE WHEN T2."Quantity" IS NULL then 0 else (SELECT SUM(T6."Quantity") FROM  "REP_NIVEL_SERV_ENTRADAS_DET" T6 where T3."DocNum"=T6."DocNum")END as "SumaEntrada"
FROM OPOR T0 /* Pedido*/
	INNER JOIN POR1 T1 ON T0."DocEntry" = T1."DocEntry" /*Detalle de Pedido*/ 
	LEFT OUTER JOIN PDN1 T2 ON T1."DocEntry"= T2."BaseEntry" AND T1."LineNum"=T2."BaseLine" /*Entrada detalle*/ 
	LEFT JOIN OPDN T3 ON T2."DocEntry" = T3."DocEntry" /*Encabezado Entrada*/

order by 2


a grandes rasgos es el query que utilizo.

si filtro por fecha de pedido me trae los nulos y las entradas ligadas pero al filtrar por la fecha de entrada obvio que solo traerá solo lo ya recibido quisiera que considere lo que no ha sido recepcionado y lo muestre. si no trae solo esto.


Este query tiene un ifnull que lo cambia por la fecha de pedido si pudiera hacer que cambie pero al de una entrada valida que este ligada al pedido seria lo que estaria buscando, cualquier sugerencia es bien recibida.

Hola @IKASHIMI,

Podrías intentar con una sub-consulta dentro del IFNULL:

IFNULL(T3."DocDate", (SELECT MIN(A."DocDate") FROM OPDN A INNER JOIN PDN1 B ON A."DocEntry" = B."DocEntry" WHERE B."BaseEntry" = T0."DocEntry")) as DocDate

Esta sentencia te debería mostrar la fecha de la primera entrada de mercancías asociada a ese pedido.

Saludos.

Saludos, no funciono sigue filtrando los nulos al pedir fecha de entrada.

Podrías pasarme el query completo, así lo pruebo bien.

Es el puesto en el tema principal, ya luego se agregarian mas campos pero solo si se pudiera hacer lo de la fecha ayudaria mucho, por ahora lo filtro por mes y año pero del pedido
[/quote]

CASE WHEN T1."ItemCode"=T2."ItemCode" THEN T2."ItemCode" else 'No Entregado En Esta Entrada' END AS "Entrada",
 		CASE WHEN T2."Quantity"IS NULL THEN 0 ELSE T2."Quantity" END as "CantidadEntrada",
		ifnull(T3."DocDate",T0."DocDate")  as "DocDate",
				CASE WHEN T2."Quantity" IS null then (T1."Quantity"*-1) else (T2."Quantity"-T1."Quantity") end as "Diferencia", 
		CASE WHEN T2."Quantity" IS NULL THEN 0 ELSE (T2."Quantity"/T1."Quantity")*100 END AS "NivelXLinea", 
		(SELECT SUM(T5."Quantity") FROM "REP_NIVEL_SERV_PEDIDOS_DET" T5 where T0."DocNum"=T5."DocNum") as "SumaPedido",
 		CASE WHEN T2."Quantity" IS NULL then 0 else (SELECT SUM(T6."Quantity") FROM  "REP_NIVEL_SERV_ENTRADAS_DET" T6 where T3."DocNum"=T6."DocNum")END as "SumaEntrada"
FROM OPOR T0 /* Pedido*/
	INNER JOIN POR1 T1 ON T0."DocEntry" = T1."DocEntry" /*Detalle de Pedido*/ 
	LEFT OUTER JOIN PDN1 T2 ON T1."DocEntry"= T2."BaseEntry" AND T1."LineNum"=T2."BaseLine" /*Entrada detalle*/ 
	LEFT JOIN OPDN T3 ON T2."DocEntry" = T3."DocEntry" /*Encabezado Entrada*/

order by 2

Estimado, puedes probar con esto:

SELECT DISTINCT T0."DocNum", T1."LineNum", 
		CASE WHEN T1."ItemCode"=T2."ItemCode" THEN T2."ItemCode" else 'No Entregado En Esta Entrada' END AS "Entrada",
 		CASE WHEN T2."Quantity"IS NULL THEN 0 ELSE T2."Quantity" END as "CantidadEntrada",
		T99."DocDateEntrada",
				CASE WHEN T2."Quantity" IS null then (T1."Quantity"*-1) else (T2."Quantity"-T1."Quantity") end as "Diferencia", 
		CASE WHEN T2."Quantity" IS NULL THEN 0 ELSE (T2."Quantity"/T1."Quantity")*100 END AS "NivelXLinea",
		(SELECT SUM(T5."Quantity") FROM "REP_NIVEL_SERV_PEDIDOS_DET" T5 where T0."DocNum"=T5."DocNum") as "SumaPedido",
 		CASE WHEN T2."Quantity" IS NULL then 0 else (SELECT SUM(T6."Quantity") FROM  "REP_NIVEL_SERV_ENTRADAS_DET" T6 where T3."DocNum"=T6."DocNum")END as "SumaEntrada"
		
FROM OPOR T0 /* Pedido*/
	INNER JOIN POR1 T1 ON T0."DocEntry" = T1."DocEntry" /*Detalle de Pedido*/ 
	LEFT OUTER JOIN PDN1 T2 ON T1."DocEntry"= T2."BaseEntry" AND T1."LineNum"=T2."BaseLine" /*Entrada detalle*/ 
	LEFT JOIN OPDN T3 ON T2."DocEntry" = T3."DocEntry" /*Encabezado Entrada*/
	LEFT JOIN
	(SELECT 
	A."DocEntry",
	A."DocDate",
	IFNULL(B."DocEntry", (SELECT MIN(D."DocEntry") FROM PDN1 D WHERE D."BaseEntry" = A."DocEntry")) "DocEntryEntrada",
	IFNULL(B."DocDate", (SELECT MIN(D."DocDate") FROM PDN1 D WHERE D."BaseEntry" = A."DocEntry")) "DocDateEntrada"
	FROM POR1 A LEFT JOIN PDN1 B ON A."DocEntry" = B."BaseEntry" AND A."LineNum" = B."BaseLine")
	 T99 ON T99."DocEntry" = T0."DocEntry"

order by 2

Para filtrar por la fecha de entrada usa T99.“DocDateEntrada”.

Espero te funcione.