Query - TN campos duplicados en sistema

Como están
Bueno estoy creando un TN para que no se permita el registro de información duplicada en el sistema, por ahora estoy haciendo la prueba con este, el problema es que a pesar de que el dato no está registrado en sistema no me deja continuar ya que siempre se activa el TN, espero me puedan ayudar.

En este TN Quiero que no me permita registrar 2 veces el mismo numero en el campo “NumAtCard” de las facturas de proveedores.

CNT:= 0;
IF object_type = '18' AND (:transaction_type='A' OR :transaction_type='U') THEN

	SELECT COUNT (*) INTO CNT 
	FROM OPCH T0
  	
	WHERE T0."DocEntry" = :list_of_cols_val_tab_del
	AND T0."NumAtCard" IN (SELECT "NumAtCard" FROM OPCH) ;

	IF :CNT>0 THEN

	error := 2;   
        error_message := '**** NVS - 02 El . No.Ref.del acreedor . ya se encuentra registrado en el sistema.';
	
	END IF;
END IF;

Hola @camilog identifico dos errores en tu query :

  1. Estas tomando en cuenta el DocEntry actual que viene al TN, por que el contador siempre sera 1 y Mayor que cero, siempre se disparara el TN.

  2. No estas verificando que el documento no este cancelado, podrian equivocarse en una factura y la cancelarian y crearian otra con la misma referencia.

Asi ajustaria el query, son dos posibles opciones.

#1
CNT:= 0;
IF object_type = '18' AND (:transaction_type='A' OR :transaction_type='U') THEN

	SELECT COUNT (*) INTO CNT 
	FROM OPCH T0
  	
	WHERE T0."DocEntry" <> :list_of_cols_val_tab_del
	AND T0."NumAtCard" IN (SELECT "NumAtCard" FROM OPCH and "CANCELED"='N') AND T0."CANCELED"='N' ;

	IF :CNT>0 THEN

	error := 2;   
        error_message := '**** NVS - 02 El . No.Ref.del acreedor . ya se encuentra registrado en el sistema.';
	
	END IF;
END IF;

#2
CNT:= 0;
IF object_type = '18' AND (:transaction_type='A' OR :transaction_type='U') THEN

	SELECT COUNT (*) INTO CNT 
	FROM OPCH T0
  	
	WHERE T0."NumAtCard" IN (SELECT "NumAtCard" FROM OPCH and "CANCELED"='N') AND T0."CANCELED"='N';

	IF :CNT>1 THEN

	error := 2;   
        error_message := '**** NVS - 02 El . No.Ref.del acreedor . ya se encuentra registrado en el sistema.';
	
	END IF;
END IF;
1 me gusta

Como estas @jrobredo

Recuerda que cuando uso el código:

WHERE T0."DocEntry" = :list_of_cols_val_tab_del

Lo hago para que el TN lea el documento que estoy creando en SAP, por lo tanto esta parte estaría correcta.

1 me gusta

@camilog si eso esta bien, el problema es que cuando ejecutas el TN lo que estas registrado ya esta incluida en la tabla, en palabras mas secillas, imagina que cuando se disapara el TN lo que estas poniendo en la pantalla de SAP ya se guardo.

Ahora analiza tu codigo:

WHERE T0."DocEntry" = :list_of_cols_val_tab_del
	AND T0."NumAtCard" IN (SELECT "NumAtCard" FROM OPCH) ;

Deberia ser asi:

`WHERE T0."DocEntry" = :list_of_cols_val_tab_del
	AND T0."NumAtCard" IN (SELECT "NumAtCard" FROM OPCH where "DocEntry" <> :list_of_cols_val_tab_del ) ;

Espero te sea de ayuda mi comentario.
Si te resulto util marcalo como la solucion.

1 me gusta

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