Buen día solicito de su ayuda ya que se me presento un tema nuevo por resolver, estuve investigando en Internet y no encontré información al respecto.
La situación el la siguiente, necesito hacer un campo de usuario forzoso, para ello en la documentación de SAP me dice que utilizando el TransactionNotification en SQL puedo hacer dicha operación, el tema es que me maneja la siguiente estructura
IF (@Object_type = N’1470000113’) and @transaction_type IN (‘A’, ‘U’)
Donde @Object_type es el id del objeto con el que identifica SAP cuando actuar.
En mi caso como es una tabla de usuario creada por mi ese parámetro no lo tiene, solo tiene un parámetro llamado Object el cual hace referencia al nombre de la tabla, pienso que tal ves por ese lado venga la respuesta.
Pero no estoy seguro si sea así y de ser así no se como quedaría la estructura para este caso.
Hola @Alberth121484, la forma para poder crear un Object_type a una tabla de usuario es creando un UDO, de esa forma el UDO crea su propio Object_Type el cuál va a ser el mismo de la tabla.
Saludos.
Favio Enrique Duarte
Antes que nada muchas gracias por tu pronta respuesta.
Disculpa pero son nuevo en SAP, me podrías orientar en como crear el UDO, o explicarme brevemente a que te refieres, esto con la finalidad de entender tu sugerencia y poder investigar en la dirección adecuada.
Ya investigue sobre el UDO e incluso ya vi como generarlo, en este caso entiendo que hay que generar uno nuevo en la tabla de usuario y agregar el Object_Type para que de esa manera el sistema identifique cuando debe ejecutar el TransactionNotification.
Hola @Alberth121484, es correcta la afirmación, adicional para que se pueda crear el UDO, el tipo de objeto que debe llevar la tabla de usuario es: (Datos Maestros o Documentos). De ésta forma al creal el UDO le aparecerá la tabla creada. Adjunto imagen de los tipos de objeto para la tabla.
Al final me di cuenta que para los UDO’s u Objetos definidos por el usuario, se genera automáticamente el campo Object en mi caso con el nombre PROD_CAP_PISO, y mi duda era por que en las tablas del sistema si existe el campo Ophect_Type y normalmente es un numero, pero realice la prueba utilizando este campo y me funciono, después leí en Internet que el campo Objet_Type en SAP es de tipo string, por lo que acepta números y letras.
Pude realizar la configuración en el TransactionNotification con el siguiente código.
–Hacer el campo U_Departamento Obligatorio
IF @object_type = ‘PROD_CAP_PISO’ and @transaction_type IN (‘A’,‘U’)
BEGIN
IF (select U_Departamento from [@PROD_CAP_PISO] WHERE DocEntry=@list_of_cols_val_tab_del) is null
BEGIN
SET @ERROR = 20092018
SET @error_message = ‘En campo Departamento es Requerido’
end
end
Como puedes ver mande el valor del Objet del objeto como el capo de Objet_Type, y así fue como lo reconoció.
Espero que esta duda que me surgió pueda ayudar a otras personas que como yo vamos iniciando en SAP.
Hola @Alberth121484, le quedó perfecto el código, me alegra que haya podido solucionar su duda, le envío otra forma de crear los SP de bloqueo para SAP B1 con base de datos HANA.
IF :object_type = 'PROD_CAP_PISO' AND (:transaction_type='A' OR :transaction_type='U') THEN
SELECT COUNT(T0."DocEntry") INTO cnt FROM "INSTANCIA DE SU SERVIDOR"."@PROD_CAP_PISO" T0
WHERE T0."DocEntry" = :list_of_cols_val_tab_del AND T0."U_Departamento" is null
IF :cnt > 0 THEN
error := 20092018;
error_message := 'SP-PCP-001 - El campo Departamento es Requerido';
END IF;
END IF;
Explico algunas cosas: INSTANCIA DE SU SERVIDOR: Se encuentra en la primer línea del Transaction Notification COUNT(T0.“DocEntry”): De acuerdo a los parámetros de la consulta, el sistema cuenta si se cumple la condición, cuándo ésto sucede el conteo es > 0 cnt: El conteo se inserta en una variable llamada cnt (Puede ser cualquier nombre corto). :list_of_cols_val_tab_del: Toma los datos que están que están en éste momento en el formulario abierto. T0: Es un alias que se le crea a la tabla para no volver a repetirla en caso de tener varias (Tablas) unidas. :cnt > 0 : Si la variable cnt es > 0 entonces muestre el mensaje SP-PCP-001: (SP: Store Procedure, PCP: Abeviación del Object_Type, 001: En caso que se vaya a crear muchos SP) Éstos datos no son obligatorios, sólo que ayudan para encontrar rápido los SP creados.
Hola @Alberth121484, cuando creas un UDF, tienes la opcion de marcar que el campo sea obligatorio, con lo cual por defecto te pedira colocar alguna información alli antes de grabar.
Solo Marcas el checkbox “Campo obligatorio”, incluso puedes marcar que solo puedan escoger valores validos.
Por el momento no tengo una base de datos en Hana, pero estamos en vías de migración, seguro esta información me ayudara mucho para cuando cambiemos de base de datos, ya que si cambia un poco con respecto a SQL. y gracias también por la explicación detallada eso me ayudo a entender algunas cosas.
Muchas gracias @willy_Calderon, Efectivamente esos campos ya los había visto, el tema es que manda un mensaje de error que no es muy amigable para el usuario, es decir nosotros entendemos los errores, pero los usuarios no saben como interpretar esos errores, es justo ahí donde estaba mi problema, tenia que enviarles un mensaje de error lo suficientemente claro, para que pudieran saber exactamente que campo es el que tenia error, ya que de lo contrario estarían marcando aun y cuando ya se les haya explicado mas de una vez el por que de la falla, en ese sentido es que entra la parte del TransactionNotification.
Buenos días, me gustaría hacer una actualización del código que utilice, ya que al ponerlo como lo realice la vez pasada me percate de algunos inconvenientes.
Cuando aplicaba el código a un campo libre y solo se registraba un registro funcionaba perfecto, pero el problema venia cuando se capturaba mas de un registro, cuando esto pasaba y los valores en el campo eran distintos mandaba el error y no dejaba actualizar.
Básicamente esto se debe a que en la consulta le estoy poniendo que evalué si el campo es nulo, la solución a este tema lo encontré usando la palabra reservada exists, esta palabra reservada no valida los nulos, mas bien valida que ningún registro este sin información, y eso es precisamente lo que se esperaba.
Así que al final el código quedo de la siguiente manera:
– Hacer el Campo Fecha Obligatorio
IF @object_type = ‘PROD_CAP_PISO’ and @transaction_type IN (‘A’,‘U’)
BEGIN
IF exists(SELECT '' FROM [@PROD_CAP_PISOL] WHERE DocEntry = @list_of_cols_val_tab_del And isnull(U_Fecha,'') = '')
BEGIN
SET @error = 23092018
SET @error_message = ‘El campo Fecha es requerido’
END
END
Espero que esta actualización les si es que tienen el mismo problema a que yo.