cancel
Showing results for 
Search instead for 
Did you mean: 

Orden de compra, factura y entrada (OPOR, OPCH y OPDN)

0 Kudos

Buenas, escribo este posta para hacerles unas cuantas preguntas, estoy realizando un query en el cual tengo que mostrar las ordenes de compra con estado CANCELED = N y ademas tengo que mostrar que ordenes de compra (OPOR) tienen facturas de reserva de proveedores (OPCH) y tambien las que tienen entradas de mercancias (OPDN), he realizado el siguiente query:

SELECT

T0.[CardCode],

T0.[CardName],

T0.[DocNum],

T0.[DocDate],

T1.[WhsCode],

T1.[ItemCode],

T1.[Dscription],

T1.LineNum+1,

T1.[Quantity], 

T1.[Currency],

T1.[PriceAfVAT],

T1.[Quantity]*T1.[PriceAfVAT] as "Total",

CASE WHEN T1.TargetType=18 then 'Fac. Prov.' else ' ' end 'Doc. Destino1',

CASE WHEN T3.TargetType = 20 THEN 'Entrada Merc.' else ' ' end 'Doc. Destino2'

FROM [dbo].[OPOR]  T0 INNER JOIN [dbo].[POR1]  T1 ON T0.DocEntry = T1.DocEntry INNER JOIN OPCH T2 ON T0.Docentry = T2.DocEntry INNER JOIN PCH1 T3 on T1.DocEntry = T3.Docentry

WHERE T0.[CardCode] =[%0] 

and  T0.[CANCELED] ='N'

and T1.LineStatus = 'C'

order by T0.DocNum asc

me despliega los resultados, pero no llega a mostrarme las entradas de mercancias. Cuando selecciono una orden de compra y veo el mapa de relaciones este documento tiene una factura de reserva de proveedores y tambien una entrada de mercancias, pero esto no se muestra en el resultado del query. Estoy utilizando el targettype 18 de la tabla POR1 y el targettype 20 de la PCH1 para hacer referencia a la factura y a la entrada de mercancias.

Si alguien podria ayudarme o darme algunos consejos de como podria resolver este problema.

Un saludo y muchas gracias por las respuestas.

PD: otra pregunta, cuando veo el mapa de relaciones, la factura de reserva de proveedores tiene relacion con la entrada de mercancias, pero de la factura salen dos flechas, una azul y otra amarilla, que significado tienen estas flechas??? Muchas gracias!!!

Accepted Solutions (1)

Accepted Solutions (1)

Former Member

Hola Raul,

Cuando enlazas documentos de sap siempre debes tener en cuenta el document base y el documento destino estos 2 documentos se unen por las lineas y los campos que normalmente se usan son: BaseType, BaseEntry y BaseLine.

En tu caso tu deseas saber que Facturas y que Entradas estas relacionadas a las ordenes de compra no canceladas para un determinado proveedor, para eso puedes probar el siguiente codigo:

SELECT

T0.[CardCode],

T0.[CardName],

T0.[DocNum],

T0.[DocDate],

T1.[WhsCode],

T1.[ItemCode],

T1.[Dscription],

T1.LineNum+1 AS Linea,

T1.[Quantity], 

T1.[Currency],

T1.[PriceAfVAT],

T1.[Quantity]*T1.[PriceAfVAT] as "Total",

'Doc Dest.' = CASE WHEN T3.OBJTYPE = '18' AND T3.ISINS = 'Y' THEN 'Fact. Reserva Prov.'

WHEN T3.OBJTYPE = '18' AND T3.ISINS = 'N' THEN 'Fact. Prov'

WHEN T5.OBJTYPE = '20' THEN 'Entrada Merc.'

ELSE NULL END,

'Num. Doc' = CASE WHEN T3.OBJTYPE = '18' THEN T3.DOCNUM

WHEN T5.OBJTYPE = '20' THEN T5.DOCNUM

ELSE NULL END

FROM OPOR T0

INNER JOIN POR1 T1 ON T0.DOCENTRY = T1.DOCENTRY

LEFT OUTER JOIN PCH1 T2 ON T2.BASEENTRY = T1.DOCENTRY AND T2.BASETYPE = T1.OBJTYPE AND T2.BASELINE = T1.LINENUM

LEFT OUTER JOIN OPCH T3 ON T2.DOCENTRY = T3.DOCENTRY

LEFT OUTER JOIN PDN1 T4 ON T4.BASEENTRY = T1.DOCENTRY AND T4.BASETYPE = T1.OBJTYPE AND T4.BASELINE = T1.LINENUM

LEFT OUTER JOIN OPDN T5 ON T4.DOCENTRY = T5.DOCENTRY

WHERE

T0.[CardCode] =[%0] AND

T0.[CANCELED] ='N' AND

T1.LineStatus = 'C'

ORDER

BY T0.DOCNUM ASC

Un punto importante es que si bien las Facturas de Proveedor y las Facturas de Reserva de Proveedor utilizan la misma table se diferencian a traves del campo IsIns. Si este campo es Y significa que es de Reserva y si es N significa que es una Factura convencional.

Con respecto a las flechas, la flecha azul indica relacion con otro documento y la amarilla indica que ha habido un pago.

Espero te sirva.

Saludos

Sebastian

0 Kudos

Muchísimas gracias!!! sebastian por la ayuda, no sabes cuando me ha ayudado tu respuesta, He revisado el query y le he agregado unas cuantas cosas mas para que despliegue el resultado que quiero.

El query quedo, hasta mientras, de la siguiente manera:

SELECT

T0.[CardCode],

T0.[CardName],

T0.[DocNum],

T0.[DocDate],

T1.[WhsCode],

T1.[ItemCode],

T1.[Dscription],

T1.LineNum+1 AS Linea,

T1.[Quantity],

T1.[Currency],

T1.[PriceAfVAT],

T1.[Quantity]*T1.[PriceAfVAT] as "Total",

'Doc Dest. 1' = CASE WHEN T3.OBJTYPE = '18' AND T3.ISINS = 'Y' THEN 'Fact. Reserva Prov.'

                                       WHEN T3.OBJTYPE = '18' AND T3.ISINS = 'N' THEN 'Fact. Prov.'

                                       WHEN T5.OBJTYPE = '20' THEN 'Entrada Merc.'

ELSE NULL END,

'Num. Doc' = CASE WHEN T3.OBJTYPE = '18' THEN T3.DOCNUM

                                   WHEN T5.OBJTYPE = '20' THEN T5.DOCNUM

ELSE NULL END,

'Doc Dest. 2' = CASE WHEN T7.OBJTYPE = '19' THEN 'Nota de Credito'

                                       WHEN T2.TARGETTYPE = '20' THEN 'Entrada Merc.'

                                       WHEN T4.TARGETTYPE = '18' THEN 'Fac. Prov.'

                                      WHEN T9.OBJTYPE = '21' THEN 'Devolucion de Merc.'

                              

ELSE NULL END

FROM OPOR T0

INNER JOIN POR1 T1 ON T0.DOCENTRY = T1.DOCENTRY

LEFT OUTER JOIN PCH1 T2 ON T2.BASEENTRY = T1.DOCENTRY AND T2.BASETYPE = T1.OBJTYPE AND T2.BASELINE = T1.LINENUM

LEFT OUTER JOIN OPCH T3 ON T2.DOCENTRY = T3.DOCENTRY

LEFT OUTER JOIN PDN1 T4 ON T4.BASEENTRY = T1.DOCENTRY AND T4.BASETYPE = T1.OBJTYPE AND T4.BASELINE = T1.LINENUM

LEFT OUTER JOIN OPDN T5 ON T4.DOCENTRY = T5.DOCENTRY

LEFT OUTER JOIN RPC1 T6 ON T6.BASEENTRY = T2.DOCENTRY AND T6.BASETYPE = T2.OBJTYPE AND T6.BASELINE = T2.LINENUM

LEFT OUTER JOIN ORPC T7 ON T7.DOCENTRY = T6.DOCENTRY

LEFT OUTER JOIN RPD1 T8 ON T8.BASEENTRY = T4.DOCENTRY AND T8.BASETYPE = T4.OBJTYPE AND T8.BASELINE = T4.LINENUM

LEFT OUTER JOIN ORPD T9 ON T9.DOCENTRY = T8.DOCENTRY

WHERE

T0.[CardCode] =[%0] AND

T0.[CANCELED] ='N' AND

T1.LineStatus = 'C'

ORDER

BY T0.DOCNUM ASC

Sin embargo me falta todavia relacionar mas documentos, porque lo que me pidieron es que se despliegue todo el circuito, desde su inicio hasta su fin, un documento final puede ser, un pago efectuado, una nota de credito, un precio de entrega, etc.

lo que queria hacer ahora era relacionar la tabla IPF1 con la PDN1, pero no estoy seguro con que campos relacinarlos, trate con los que tu me mencionaste y nada, nose si solamente es relacionarlos con el DocEntry, es decir IPF1.DocEntry = PDN1.Docentry.

Otra pregunta mas , pueden existir documentos que no tengan relación? es decir que no tengan un BaseType o talvez un Targettype registrado? esto debido a que realizaron un "copiar a" o un "copiar de"? de ser verdad como podria tratar esos documentos?

Una vez mas muchísimas gracias por la ayuda, espero no te molestes por las preguntas, pero de verdad quiero aprender lo mas que pueda del SAP que es muy interesante y que me encanta!.

Un Saludo

Former Member
0 Kudos

Hola Raul,

Al incluir documentos de pagos en tu query es un poco mas complejo ya que existen varias tablas relacionadas al pago dependiendo del metodo de pago que utilices y de la informacion que deseas mostrar. Mientras mas tablas utilices mas complicado puede ser tratar de relacionarlas, si vas a incluir pagos te recomiendo que muestres informacion basica para no complicar el reporte.

En el caso de precio de entrega la logica es parecida, el documento destino es el precio de entrega y el documento base es la entrada de mercancia. Te recomiendo tratar de buscar siempre el objeto, el docentry y la linea cuando trates de enlazarlos. Por ejemplo, en este caso puedes usar el BaseType, BaseEntry y el BaseRowNum del precio de entrega.

Con respecto a tu otra pregunta, si, si pueden existir documentos que no tienen relacion y en esos casos los campos se llenan con -1. Para incluirlos puedes usar un union all, ya que actualmente tu query arroja datos basado solamente en la orden de compra.

Espero que sea de ayuda

Saludos

Sebastian

0 Kudos

Una vez mas agradecerte por tu respuesta que me ayuda y guia para poder terminar con mi query. MUCHAS GRACIAS!

Cualquier otra respuesta y/o sugerencia para cambiar y/o mejor el query sera 100pre bienvenida!.

Estaré al tanto de cualquier respuesta.

Un saludo a todos.

Answers (1)

Answers (1)

former_member203638
Active Contributor
0 Kudos

Hola Raul, en el segundo case tienes:

CASE WHEN T3.TargetType = 20 THEN 'Entrada Merc.' else ' ' end 'Doc. Destino2'

Estas usando T3.TargetType=20, pero el T3 en tu query es la Tabla PCH1, y el destino de la PCH1 no seria 20, cambia el T3.targetType por T1.targetType.

Saludos.

Alessandro.

0 Kudos

Muchas Gracias por la respuesta Alessandro. tienes razón en la corrección, ya lo cambie, sin embargo necesito lo siguiente:

De una orden de compra puede ir a una Factura de Proveedores o a una entrada de mercancía, de la factura de proveedores puede ir a una Nota de Crédito y ahi terminaría el recorrido, pero si luego de la orden de compra viene la entrada de mercancía se puede generar una factura de proveedor.

Un posible recorrido puede ser:

OPOR -> OFCH -> OPDN -> OIPF

Otro recorrido puede ser:

OPOR -> OPDN -> OFCH ->  OVPM

otra opcion puede ser:

OPOR -> OPDN -> ORPN

y asi puedo tener varias combinaciones, dependiendo si la compra fue por una importación o por una compra local.

Espero haberme explicado mejor y que se haya entendido lo que necesito hacer, espero me puedan ayudar, el ultimo query que he generado es el siguiente:

SELECT

T0.[CardCode],

T0.[CardName],

T0.[DocNum],

T1.LineNum+1 'Nro. de Linea',

T0.[DocDate],T1.[WhsCode],

T1.[ItemCode],

T1.[Dscription],

T1.[Quantity], 

T1.[Currency],

T1.[PriceAfVAT],

T1.[Quantity]*T1.[PriceAfVAT] as "Total",

CASE WHEN T1.TargetType=18 then 'Fac. Prov.' when T1.TargetType=20 then 'Entrada Merc.' else ' ' end 'Doc. Destino1',

CASE WHEN T1.TargetType=18 AND T3.TargetType = 19 then 'Nota de Credito' else ' ' end 'Doc. Destino 1.1',

CASE WHEN T1.TargetType=18 AND T3.TargetType = 20 then 'Entrada Merc.' else ' ' end 'Doc. Destino 2',

CASE WHEN T1.TargetType=18 AND T3.TargetType = 20 AND T5.TargetType = 69 then 'Precio de Entrega' else ' ' end 'Doc. Destino 3',

CASE WHEN T1.TargetType=20 AND T5.TargetType = 69 then 'Precio de Entrega' else ' ' end 'Doc. Destino 1.2',

CASE WHEN T1.TargetType=20 AND T5.TargetType = 18 then 'Fac. Prov' else ' ' end 'Doc. Destino 2.1',

CASE WHEN T1.TargetType=20 AND T5.TargetType = 18 AND T3.TargetType = 19 then 'Nota de Credito' else ' ' end 'Doc. Destino 4',

CASE WHEN T1.TargetType=20 AND T5.TargetType = 18 AND T3.TargetType = 46 then 'Pago Efectuado' else ' ' end 'Doc. Destino 5'

FROM [dbo].[OPOR] T0 LEFT JOIN [dbo].[POR1]  T1 ON T0.DocEntry = T1.DocEntry

LEFT JOIN PCH1 T3

on T0.DocEntry = T3.BaseEntry

and T1.LineNum=T3.BaseLine

and T1.ItemCode = T3.ItemCode

LEFT JOIN OPCH T4

ON T4.DocEntry = T3.DocEntry

LEFT JOIN PDN1 T5

ON T4.DocEntry = T5.BaseEntry

and T3.LineNum = T5.BaseLine

and T3.ItemCode = T5.ItemCode

LEFT JOIN OPDN T6

ON T5.DocEntry = T6.Docentry

LEFT JOIN RPD1 T7

ON T6.Docentry = T7.BaseEntry

and T5.LineNum = T7.BaseLine

and T5.ItemCode = t7.Itemcode

LEFT JOIN ORPD T8

ON T7.DocEntry = T8.Docentry

LEFT JOIN RPC1 T9

ON T8.Docentry = T9.BaseEntry

and T7.LineNum = T9.BaseLine

and T7.ItemCode = T9.ItemCode

LEFT JOIN ORPC T10

ON T9.DocEntry = T10.Docentry

WHERE T0.[CardCode] =[%0] 

and  T0.[CANCELED] ='N'

order by T0.DocNum asc

Un saludo y muchas gracias por la ayuda!