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 :
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.
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;
@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.