Transaction Notification al cerrar una oferta

Hola de nuevo los molesto, necesito que al cerrar una oferta de ventas el usuario tenga que llenar un campo adicional al documento en donde describa el motivo de la NO VENTA.

Puedo realizar esta validacion desde Transaction Notification?? y si me podrian proporcionar el codigo ejemplo.

De antemano muy agradecido.

Hola, @renba78

Es un campo definido por usuario ?? , si es así bastará con que en el campo indiques que es obligatorio, la ruta es Herramientas - Ventanas definidas por usuario - Campos definidos por usuario Gestión ahí buscas tu campo y le habilitas el check, también puedes ver este vídeo,

Saludos.

1 me gusta

si es un campo obligatorio, definido por el usuario, pero debe ser obligatorio únicamente cuando se cierre la oferta de ventas. Gracias por tu tiempo

Antes de continuar pasa por #presentaciones

Que avance tienes, como está actualmente tu código para crear la validación en el TN ?

Saludos

gracias hasta donde recuerdo si pase por presentaciones cuando abri la cuenta en este foro.
Este es el codigo del TN, basicamente le he borrado algo para no hacerlo tan grande pero que no influye en el paso que me esta quedando pendiente. Espero se comprenda,. No soy programador como tal, pero si he realizado querys y TN variados. Gracias

CREATE PROCEDURE “SBO_SP_TransactionNotification_VE_OFERTA_DE_VENTAS”
(
in object_type nvarchar(20), – SBO Object Type
in transaction_type nchar(1), – [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose
in num_of_cols_in_key int,
in list_of_key_cols_tab_del nvarchar(255),
in list_of_cols_val_tab_del nvarchar(255),
out error integer,
out error_message varchar(255)
)
LANGUAGE SQLSCRIPT
AS

Ingresadopor nvarchar(10);
EstadoCoti varchar;
NoVenta nvarchar(100);

Begin
DECLARE EXIT HANDLER FOR SQLEXCEPTION --Error SQL
BEGIN --Accion a realizar si de produce un error SQL
error := ::SQL_ERROR_CODE;
error_message := 'Error SQL: ’ || ::SQL_ERROR_MESSAGE;
END;

error := 0;
error_message := N’Ok’;

– Query General
select T0.“U_Empl_Ingr”
,T0.“DocStatus”
,T0.“U_Denegada”
into
Ingresadopor
,EstadoCoti
,NoVenta
from OQUT T0
Inner Join OCRD T1 On T0.“CardCode”=T1.“CardCode” —DM Socios de Negocios
Inner Join OCRG T2 On T1.“GroupCode”=T2.“GroupCode” --Grupos de SN
Inner Join NNM1 T3 On T0.“Series”=T3.“Series” --Series de Numeración
where T0.“DocEntry” = :list_of_cols_val_tab_del;

/*** VALIDACIONES PARA OFERTA DE VENTAS" ***/
if ifnull(:Ingresadopor,’’) = ‘’
and :error=0
then
error := 12002;
error_message := ‘Ingrese iniciales de Usuario. UBICACION = Campos definidos por el Usuario.’;
end if;

/*** VALIDACIONES A NIVEL DE DETALLE ADICIONALES GLOBALES /
IF :transaction_type <> ‘A’ THEN
** if :EstadoCoti = ‘C’ and ifnull(:NoVenta,’-’)=’-’ and :error =0 then

** error := 12003;
*
** error_message :=‘Ingrese el motivo de la no aprobacion en esta cotizacion. Campos definidos por el usuario’;**
** end if;**
End if;
end;

Si, ya leí tu presentación.

Tu código está muy muy muy muy pobre, imposible hacer algo con el.

Si es posible construir la consulta y no es tan complicado.

Comienza por buscar la tabla de las ofertas de venta, el objetType de dicha tabla, el nombre del campo adicional donde se captura el motivo de no venta y el nombre del campo de estado del documento, con estos datos podrá generar una consulta y ponerla en el TN.

Nuevamente te recomiendo ver el vídeo ahí se muestra como obtener los datos que te hago mención

Saludos.

gracias si tengo esos datos y los estoy metiendo en una variable en el TN,:
Select
T0.“DocStatus” --(este es el campo que cambia cuando se cierra la oferta)
,T0.“U_Denegada” --(es es el campo de usuario que necesito sea obligatorio al cerra la oferta)
into
EstadoCoti,
NoVenta
From OQUT T0

y luego trato de hacer la validacion:

IF :transaction_type <> ‘A’ THEN
if :EstadoCoti = ‘C’ and ifnull(:NoVenta,’-’)=’-’ and :error =0 then
error := 12003;
error_message :=‘Ingrese el motivo de la no aprobacion en esta cotizacion. Campos Definidos por el usuario’;
end if;

Te lo vuelvo a poner con menos lineas para ir a lo mas practico, pero cuando se cierra la oferta no me da la alerta.

Le coloco

Está mal estructurada tu consulta, no es así como se declara una variable, por los campos que pones entre comillas deduzco que usas hana, echa un vistas a este vídeo

Saludos.

de verdad gracias por tu tiempo y eso si lo puedo hacer, se como crear un TN para que me exija un campo al crear, mi problema es que necesito que el campo sea exigible solo cuando le de cerrar a la oferta de ventas. Alguien ha trabajado algo asi antes?? tendra el codigo de ejemplo para que lo pueda adaptar. Le agradezco bastante.

Pon atención en los tipos de transacciones y ubica el objet type de tu documento

transaction_type nchar(1), – [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose

h_tps://blogs.sap.com/2017/04/27/list-of-object-types/

De acuerdo a tu necesidad debes de tener un código mas o menos así

IF object_type = '23' AND transaction_type  = 'L'
THEN 
   SELECT COUNT (T0.DocNum) INTO doc
     FROM OQUT T0 
	    WHERE T0."U_Denegada" IS NULL  
	    AND T0."DocEntry" = list_of_cols_val_tab_del;
	IF 	doc > 0
	 THEN 
	   error := 12003;
       error_message := N'Ingrese el motivo de la no aprobacion en esta cotizacion. Campos Definidos por el usuario';
     END IF;
 END IF;

Si observas no se parece nada al código que tu tienes

Saludos

1 me gusta

Quedo!!! la bendita “L” del transactionType es la que me estaba fallando. Básicamente este es el código con el que lo hice. muchas gracias por el tiempo y la paciencia. No se como cerrar el tema.

if :ObjectType = 23 then
Select
T0.“DocStatus”
,T0.“U_Denegada”
into
EstadoCoti,
NoVenta
From OQUT T0

IF :transaction_type = ‘L’ THEN
if ifnull(:NoVenta,’-’)=’-’ and :error =0 then
error := 12003;
error_message :=‘Ingrese el motivo de la no aprobación en esta cotización. Campos definidos por el usuario’;
end if;
End if;
end if;

Marca como solución el post que te ayudo y posterior a ello alguien cerrará el tema.

Saludos.