lunes, 31 de agosto de 2015

Usando Trigger WHEN-VALIDATE-ITEM y WHEN-VALIDATE-RECORD

La CUSTOM.PLL proporciona una forma para que los desarrolladores puedan agregar personalizaciones proporcionadas a los formularios del EBS sin modificar los objeto .FMB. Usar el trigger WHEN-VALIDATE-ITEM para realizar la validación cuando el cursor se mueve fuera de un elemento. Esto también implica que el control puede salir del registro en el proceso. Pero la diferencia con otro trigger llamado WHEN-VALIDATE-RECORD es solo cuando el cursor se cambia a otro registro. El Trigger no se ejecuta  mientras se esta tabulando  entre elementos del mismo registro.

Imagine la complejidad cuando hay más de tres elementos a validar. Un trigger WHEN-VALIDATE-RECORD,  requiere solamente una validación combinada que involucra los tres elementos. En cambio WHEN-VALIDATE-ITEM sería validando cada elemento por lo cual requiere código para cada uno. Esto aumenta la complejidad en la codificación cuando están involucrados muchos de estos elementos. También la probabilidad de error es mayor en este caso.

Por otro lado, escribiendo un disparador WHEN-VALIDAR-RECORD sólo requiere hacer la validación combinado una vez, y este método es completamente a prueba de errores. A continuación se pone un ejemplo de codigo en la librería Custtom.pll para cuando se requiere validar un campo especifico.

  FUNCTION EVENT(P_EVENT_NAME IN VARCHAR2) RETURN BOOLEAN IS
  v_form_name      VARCHAR2(30)  := NAME_IN('system.current_form');
  v_block_name     VARCHAR2(30)  := NAME_IN('system.cursor_block');
  v_item_name      VARCHAR2(30)  := NAME_IN('system.current_item');
  cStatus     VARCHAR2(500);


    IF  V_FORM_NAME = 'APXINWKB' AND V_BLOCK_NAME = 'INV_SUM_FOLDER'
        AND  v_item_name = 'VENDOR_NAME'
        AND P_EVENT_NAME IN('WHEN-VALIDATE-ITEM','WHEN-VALIDATE-RECORD') THEN
      IF NAME_IN('INV_SUM_FOLDER.VENDOR_NAME') IS NOT NULL THEN

    XX_PKG.VALID_VENDOR(P_VENDOR_ID => TO_NUMBER(NAME_IN('INV_SUM_FOLDER.VENDOR_ID')),
                        P_CSTATUS   => CSTATUS);

        IF CSTATUS = 'E' THEN
  
         FND_MESSAGE.SET_STRING('SELECCIONAR OTRO PROVEEDOR');
         FND_MESSAGE.ERROR;
         RAISE FORM_TRIGGER_FAILURE;
        END IF;
      END IF;
   END IF

RETURN(TRUE);

END EVENT;

3 comentarios:

  1. Buenos días.

    Le escribo para agradecerte toda esta información. Trabajo con Oracle R12 y esto me ha resultado de gran utilidad. Mi problema es que el CUSTOM no captura el WHEN-VALIDATE-ITEM. Después de mucho investigar, me he dado cuenta de por qué. Lo dejo aquí por si sirve.


    Triggers del CUSTOM
    WHEN–FORM–NAVIGATE
    WHEN–NEW–FORM–INSTANCE
    WHEN–NEW–BLOCK–INSTANCE
    WHEN–NEW–RECORD–INSTANCE
    WHEN–NEW–ITEM–INSTANCE
    WHEN–VALIDATE–RECORD
    SPECIALn (where n is a number between 1 and 45)
    ZOOM
    EXPORT
    KEY–Fn (where n is a number between 1-8)

    Fuente: https://imdjkoch.wordpress.com/2010/09/27/custom-pll-in-oracle-application/

    ResponderEliminar
    Respuestas
    1. Lo recomendable es usar WHEN–VALIDATE–RECORD de todas formas es un detalle importante el que compartes.

      Eliminar
    2. Gracias por responder Gustavo, es admirable que aunque no esté actualizado el blog, hayas tenido el detalle de dar tu opinión.

      Eliminar