Inner join entre opdn, pdn1, opor, por1

Hola buenas tardes,

Soy nuevo en esto de SQL en SAP y agradeceria su ayuda con el inner entre estas tablas para calcular la cantidad pedida entre la entrega de mercancia y la orden de compra

SELECT COUNT(*) INTO cntA FROM OPDN T0 INNER JOIN PDN1 T1 ON T1."DocEntry" = T0."DocEntry"
	INNER JOIN OPOR T2 ON T1."DocEntry" = T2."DocEntry"
	INNER JOIN POR1 T3 ON T2."DocEntry" = T3."DocEntry"

Asi lo tengo pero no me funciona agradeceria su colaboracion

Hola @Nelson183

La unión entre la entrada (PDN1) con la OC (POR1), la puedes realizar utilizando el campo TrgetEntry en la POR1, que deberá ser igual al docentry de la entrada, y el campo tipo de documento TargetType deberá ser igual a 20 que es el Object Type de la entrada.

Esto te permitirá ligar los detalles de ambos documentos.

2 Me gusta

Hola @cdeleon entiendo lo que me dices, ya a lo practico esa union como seria?

	OPOR T0
	INNER JOIN POR1 T1 ON T0.DocEntry = T1.DocEntry
	LEFT JOIN (OPDN T3 
			INNER JOIN PDN1 T4 ON T3.DocEntry = T4.DocEntry
		) ON T4.BaseType = T0.ObjType AND T4.BaseEntry = T0.DocEntry AND T4.BaseLine = T1.LineNum
1 me gusta

Hola @epr06 mira que intento como me dices y no me funciona, sigue sin funcionar

Al menos muestra el error que te arroja y una captura del mapa de relaciones de tus documentos, el código que te di es la relacion que guardan esas tablas, pero depende del flujo que lleven tus documentos.

Si tu mapa de ralaciones esta como la siguiente imagen, el query SI funciona, tu problema debe ser otro

Si nos posicionamos en la entrada:
BaseType te dice el Tipo de documento origen, los mas comunes en la entrada son:
18 = el origen es una factura de reserva (debes vincular con las tablas PCH)
22 = el origen es un pedido (debes vincular con las tablas POR)
20 = el origen es una entrada, el actual es la cancelación de dicha entrada.
-1 = No esta relacionado
BaseEntry Identifica el documento especifico de donde nace la entrada
BaseLine Identifica la linea especifica del origen

puedes tener mas orígenes, pero con esos 3 campos se vincula en cualquier documento de compras o ventas solo revisando el objeto para ver que tablas son las correctas

1 me gusta

@epr06 Esta es la relacion entre la orden de compra y la entrada de mercancía


Lo que intento hacer es que me relacione las filas de cada pedido y me compare la cantidad entre la orden de compra y luego la entrada, y no me deje realizar una entrada si la cantidad es mayor a la de la orden de compra, lo estoy haciendo en TN
No se si me hice entender

@epr06 Amigo mira como tengo el TN lo realice tal cual con los parametros que me diste y no me funciona, tengo por ejemplo 100 en la cantidad de la orden de compra y al pasarlo a entrada de mercancia lo cambio por 200 y me deja crear, donde deberia sacar el mensaje

IF :object_type = '20' --ENTRADAS DE MCIA POR COMPRAS
AND (:transaction_type='A'or :transaction_type='U') THEN --Actualización o Creación	
	SELECT COUNT(*) INTO cntA FROM OPOR T0
	INNER JOIN POR1 T1 ON T0."DocEntry" = T1."DocEntry"
	LEFT JOIN (OPDN T3 
			INNER JOIN PDN1 T4 ON T3."DocEntry" = T4."DocEntry"
		) ON T4."BaseType" = T0."ObjType" AND T4."BaseEntry" = T0."DocEntry" AND T4."BaseLine" = T1."LineNum"
	WHERE T4."Quantity" > T1."Quantity"
	AND T3."DocNum" = :list_of_cols_val_tab_del;
	  IF :cntA > 0 THEN
	  		error := -111;
	  		error_message := '**La cantidad de la entrada de marcancia es mayor a la del pedido';
	  END IF;
	 END IF;

Con ese código no estas pensando en todos los escenarios posibles, solo en el que causo el problema que quieres solucionar, y dejándolo de esa forma vas a interrumpir procesos o dejar pasar cosas que no deberían, te dejo algunos puntos a considerar:

  • Al querer validar eso, yo solo usaría las tablas que terminan en 1 (POR1,PCH1,PDN1), no necesitas mas (de acuerdo con lo que alcanzo a entender del problema)
  • El código tal cual lo tienes solo va a funcionar cuando tienes UNA linea en la entrada, si hay mas te arrojara un error del tipo “Intentas comparar una tabla con una constante” (No recuerdo exactamente que dice)
  • La entrada es un documento que contabiliza el movimiento, estos en la cancelación crean uno nuevo idéntico que representa el movimiento inverso, es conveniente que desde el inicio mandes las cancelaciones a otro lado en la validación, cuando haces una cancelación en un documento se llama como minimo 2 veces el TN, una vez cuando el documento original cambia el transaction_type = C y otra vez cuando el documento de cancelación pasa como transaction_type = A
  • Algunos posibles escenarios de los que menciono al inicio son, si la entrada no tiene documento base o no es una orden de compra que pasa, otro seria si la entrada es una parcialidad (orden de compra = 100 pz, primera entrada 80 pz, segunda entrada 80 pz) con el código similar al actual ambas entradas pasan.
  • El campo llave en documentos es DocEntry y la combinación que había mencionado (ObjeType,DocEntry,LineNum) es la que identifica cualquier linea en cualquier documento de forma única
  • El campo DocNum puede ser un campo NO UNICO dependiendo de tus configuraciones en Series de Numeración y Permisos
  • Si vas bloquear el ingreso de producto de esa forma es por que el excedente se lo lleva quien te lo entrego en el momento que realizo la entrega física, en cualquier otro caso a futuro es altamente probable que te genere diferencias de costo y/o inventario, es mejor analizar que se debe hacer con ese producto en lugar de solo bloquear
1 me gusta

@epr06 Amigo entiendo todos los factores que mencionas, como tal ya tengo otras validaciones en donde soluciono alguna de las cosas que me dices, pero en estos momentos solo necesito bloquear cuando intenten crear una entrada de mercancía con mas cantidad que la de la orden de compra (Ejemplo: Orden Compra: Cantidad=100 y Entrada de mercancía: Cantidad =150) Me podrías ayudar a cuadrar el código de verdad he intentado de muchas maneras y no he podido

con el punto 5 “funciona”, con el punto 2 lo completas un poco mas. Ofrezco orientación, partes de código o esas cosas.
Te puedo apostar que si buscas la respuesta a tu problema en el TN ya esta en el foro, quizá no en un solo tema pero de eso se trata, investigar y buscar para completar la respuesta.
La pregunta inicial, sobre cual es la relacion? esa te la di aquí y también la he visto en múltiples temas con preguntas similares, cuestión de buscar.

Si quieres el 100% de la solución eso no es gratis y aun asi quiza entre respuestas de múltiples compañeros la obtengas, tu partner de sap la debe poder hacer pero te va a cobrar, yo la puedo hacer pero que te digo, tampoco trabajo gratis, no me cuesta nada orientar y ya lo hice.

Con que cambies esto T3."DocNum" = :list_of_cols_val_tab_del por esto T3."DocEntry" = :list_of_cols_val_tab_del te va a funcionar en el caso simple que mencionas, pero va a fallar en la operación normal y al final vas a decir “No sirve”

Buenas Tardes.

No se si ya revisaste mi post

Query flujo Facturacion Proveedores
ahí esta un ejemplo de un flujo completo solo cambia las bases por las de clientes, espero que te sirva como base.

Saludos.

Este tema se cerró automáticamente 30 días después de la última publicación. No se permiten nuevas respuestas.