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 sep one un ejempl ode ocidgo en la libreria 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;

viernes, 28 de agosto de 2015

Visión General Oracle BI Publisher

XML Publisher, también llamado  Oracle Business Intelligence Publisher (BI Publisher), es una herramienta de informes basada en plantilla que aprovecha las tecnologías estándar de extracción y visualización de datos. Los usuarios de negocio pueden crear el diseño y las reglas para el informe mediante el uso de herramientas de escritorio comunes. Los ingenieros de desarrollo pueden concentrarse en la extracción de datos de la manera más eficiente. El tiempo de implementación es más rápido. Además, los usuarios de negocio con un mínimo de entrenamiento pueden diseñar plantillas y los informes basados ​​en en base a extracciones de datos XML desde sus aplicaciones de Oracle existentes desde los programas concurrentes.

En tiempo de ejecución, XML Publisher combina las plantillas personalizadas con las extracciones de datos XML  para generar una salida en PDF, HTML, RTF, EXCEL (HTML), o incluso de texto para su uso con transmisiones EFT y EDI.



Ventajas del BI Publisher

BI Publisher rompe los tres componentes separados y los trata por separado en tiempo de diseño. En tiempo de ejecución, los tres se ponen de nuevo juntos por BI Publisher para generar el  formato final. Hay una ganancia inmediata ya que este modelo es mucho más flexible; es decir, una única definición de datos puede admitir varios diseños y múltiples traducciones de idiomas pueden ser aplicados en tiempo de ejecución para generar una salida especifica. Esto conduce a una reducción en los costos de mantenimiento al generar reportes.


jueves, 27 de agosto de 2015

Adjuntar Plantilla por PL/SQL usando la función FND_REQUEST.ADD_LAYOUT

Hay ocasiones que por un proceso PL/SQL utilizamos la función FND_REQUEST.SUBMIT_REQUEST el cual ejecuta una  solicitud concurrente para ser procesado por el administrador de concurrentes. Usando este proceso sólo se ejecuta el programa, hasta ahí todo está bien. Sin embargo si ejecutamos un programa concurrente que sea de tipo XML al ejecutar este proceso no adjunta la plantilla RTF ya sea para el tipo de salida que se necesita .


Podemos adjuntar una plantilla durante la ejecución de la solicitud utilizando la función llamado  FND_REQUEST.ADD_LAYOUT .  El código a continuación le ayudará a asociar la plantilla durante la ejecución del programa concurrente.

DECLARE

L_RESPONSIBILITY_ID  NUMBER=100;
L_USER_ID            NUMBER=10124;
L_APPLICATION_ID     NUMBER=250;
L_USER_ID            NUMBER;
L_REQUEST_ID         NUMBER;
L_LAYOUT             BOOLEAN;

BEGIN
 
 
APPS.FND_GLOBAL.APPS_INITIALIZE (L_USER_ID,L_RESPONSIBILITY_ID,L_APPLICATION_ID);

  L_LAYOUT := FND_REQUEST.ADD_LAYOUT(APLICACION => 'XXCUSTOM',
                                     CODIGO     => 'XX_AP_PROG_TEMPLATE',
                                     IDIOMA     => 'en',
                                     TERRITORIO => 'US',
                                     SALIDA     => 'EXCEL');
 
  L_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST (APLICACION   => 'XXCUSTOM',
                                              PROGRAMA     => 'XX_AP_PROG',
                                              DESCRIPCION  => '',
                                              FECHA        => NULL,
                                              SUB_REQUEST  => FALSE,
                                              PARAMETRO1   => '100');
 
  COMMIT;
 
  IF L_REQUEST_ID = 0
  THEN
     DBMS.OUTPUT.PUT_LINE ('ERROR EN LA EJECUCIÓN');
  ELSE
     DBMS_OUTPUT.PUT_LINE('SE HA EJECUTADO LA SOLICITUD');
  END IF;
 
END;

miércoles, 26 de agosto de 2015

Juego de Valores tipo Par

Los Juegos de Valores Tipo Par proporcionan un mecanismo que permite seleccionar campos de una estructura Flexfield. Estos juegos de valores se utilizan principalmente para la ejecución de solicitudes al momento de colocar los parámetros y no se utilizan como campos flexfields normales. Para un juego de valores Par, se ofrece un rango de valores válidos.




Para entender mejor este tipo de juegos valores recordemos que son los Flexfields Claves. Sabemos que son combinaciones de diferentes valores de segmento que se almacenan en una tabla de combinación separada. Dependiendo de la estructura puede tener de uno a más campos de segmentos validos. Esto nos ayuda a ejecutar como parámetro de un programa concurrente una combinación de Flexfield Clave el cual puede codificar su propia validación de los valores a escoger.

Creando Juego de Valores Tipo Par
Para crear un  Juego de valores tipo Par  debe tener en cuenta  que se usa User Exit para el ingreso, validación y consulta de  segmentos de Flexfield Clave. Con la validación especial, usted será capaz de entrar en uno o más valores de segmento para un FlexField clave. Para introducir valores de segmento, se pueden usar 3 tipos de User Exits :

POPID se utiliza para permitir que el usuario ingresé el valor del segmento FlexField. Se le llama cuando el cursor entra en el campo del valor del segmento. Con esta User Exits, puede decidir que valores de segmento se debe mostrar, y cómo se debe mostrar. Este se usa en el Evento  Editar

VALID se llama cuando el usuario sale del valor de segmento o confirma la combinación FlexField. Valida el valor introducido de acuerdo a los valores existentes en la tabla de FlexFields Claves. Este se usa en el Evento  Validar

LOADID es opcional, y se puede utilizar para elegir qué información se devuelve como valor FlexField. Esto puede ser los segmentos concatenados, o el value_id para la combinación FlexField o segmentos. Este se usa en el Evento Cargar

Ahora para este caso Juego de Valores debemos usar utilizar los User Exit POPIDR y VALIDR. Al colocar  R se crea automáticamente un rango. Por supuesto que necesitamos 2 parámetros para establecer el rango. Sin embargo, necesitamos sólo un juego de valores.

Para dar un ejemplo se ha creado el juego de valores XX_VS_PAIR_GL. Como todo juego de Valores este se crea con el tipo Par.



En Editar Información sólo se crea los eventos de  Editar y Validar. Primero debemos ingresar en el evento Editar, FND POPIDR , este User Exits sirve para que aparezca una pantalla FlexField, y dejar que el usuario introduzca los valores FlexField. Agregamos CODE="GL #", este es el código del FlexField Clave que vamos a utilizar.

NUM="500" Es el id de la estructura FlexField. Si sólo tiene una estructura única FlexField, esto es opcional. Para varias estructuras Flexfields habilitadas es necesario ingresar el número id. O bien puede usar el comando $FLEX$ para traer el valor de un juego de valor anterior que devuelva el id de la estructura flexfield.

APPL_SHORT_NAME="SQLGL" El nombre corto para la aplicación del FlexField el cual pertenece  Junto con el  Código, esto nos ayudara identificar el Flexfield. VALIDATE = "PARTIAL" Esta opción puede ser NONE, PARTIAL o FULL. NONE significa no se valida la combinación. PARTIAL significa solo se valida los segmentos por separados, no hay validación si existe la combinación. FULL significa que los segmentos y la combinación serán validados y si se introduce un nuevo valor, éste se insertará en la tabla de FlexField Claves.

SEG=":!VALUE" Este es el campo Formulario que se utilizará para almacenar el valor de los segmentos. Al agregar ID=":!ID" esto completara rellenará la  columna ID con el valor ID de la combinación. DESC=":!MEANING" nos ayudara a completar la  columna descripción con el valor descripción de la combinación.

Finalmente añadimos DISPLAY ="2", este parámetro" está por defecto con ALL. Pero también puede especificar los segmentos separados por su número de secuencia o nombres. En nuestro caso, estamos mostrando el segmento 2 de nuestra combinación

Luego debemos crear el evento Validar. Usaremos los mismos códigos que Editar solo que cambiaremos FND POPIDR por FND VALIDR.



El siguiente paso es establecer los parámetros tanto para el segmento Inicial como Final . Ambos parámetros tienen el mismo Juego de Valores de Tipo Par.



Ahora, al ejecutar el programa concurrente, podemos ingresar en un rango los segmentos que queremos consultar. Esto incluye la validación de que el valor final es de hecho superior o igual al valor inicial.


martes, 25 de agosto de 2015

Informe Revaluación Artículos Abiertos

El Informe Revaluación Artículos Abiertos se usa para revaluar cada línea de articulo abierto en las transacciones como por ejemplo  facturas, compromisos, notas de crédito y débito que no están totalmente pagados. Este informe tiene en cuenta los cambios en el valor debido a cambios en las tasas de tipo de cambio en moneda extranjera. El informe proporciona tres figuras importantes: 
  • El informe da pruebas de integridad enumerando el valor de sus líneas de artículos abiertas antes de la revaluación. Con ello, puede conciliar este resultado a los saldos del libro mayor. Además, este informe proporciona una lista completa de todos los artículos y así se explica el saldo de su cuenta por cobrar.
  • El informe calcula el valor de cada elemento abierto revalorizado con la tasa de fin de período. Se necesita el total de estos valores detallados en países como los Estados Unidos. 
  • En un artículo por artículo base, el informe determina el menor de los dos valores. El informe totaliza el menor de estos valores y calcula la diferencia entre los dos. Este total se utiliza en países como Alemania, donde el valor inferior del mercado de las líneas de  de articulo abiertos tiene que ser determinado.

El resultado de este informe sirve para  determinar la cantidad que necesita ajustar manualmente en el balance de General Ledger para reflejar la diferencia entre el saldo inicial y el saldo revaluado. Esta diferencia se calcula por el informe para cada FlexField Contable y se suma para cada valor del segmento de Balance. Luego, revertir estos asientos en el comienzo de los períodos siguientes para volver a sincronizar sus cuentas por cobrar con las cuentas del libro mayor.

Puede ejecutar este informe para un período de revaluación, hasta una fecha de vencimiento en particular, o para un rango de valores de segmento de Balance. Para ejecutar el reporte ir a una Responsabilidad de Receivables >> Ver Solicitudes. Al ejecutar el reporte deberás ingresar los siguientes  Parámetros:


De los cuales tiene estos parámetros importantes:

Periodo de revaluación: Debe seleccionar el período para el que desea revaluar.
Incluir hasta Fecha de Vencimiento: Si quiere diferenciar pasivos  a corto, mediano o largo plazo, se puede establecer una fecha. De lo contrario, deje este campo vacío. 
Segmento a Cuadrar Inferior / Superior: Ingresar el rango de los valores de segmento de balance que desea informar.


Al ejecutar el reporte debe salir de la siguiente manera:


viernes, 21 de agosto de 2015

Saltos de Pagina (Page Breaks) en Plantillas para XML Publisher

Para crear un salto de página o Page Breaks después de la ocurrencia de un elemento específico se debe  utilizar el comando split-by-page-break. Esto produce que al momento de generarse el reporte,se  inserte un salto de página entre cada instancia del elemento específico donde se le ha colocado el comando.

Para insertar un salto de página entre cada ocurrencia de un grupo, inserte el campo de formulario split-by-page-break en el grupo inmediatamente antes del campo  <?end for-each?> que cierra el grupo. En la plantilla RTF debe ingresar la siguiente  sintaxis:

<?split-by-page-break:?>

Para el siguiente XML, supongamos que se desea crear un salto de página para cada nuevo proveedor con su grupo de facturas:

<?xml version="1.0" encoding="UTF-8"?>
<XX_TEST_INVOICES>
<LIST_G_SUPPLIER>
<G_SUPPLIER>
 <NAME>XXR SLA</NAME>
 <LIST_G_INVOICES>
 <G_INVOICES>
   <INVOICE_NUM>0098-34</INVOICE_NUM>
   <DATE>11/12/2014</DATE>
   <AMOUNT>50923</AMOUNT>
 </G_INVOICES>
 <G_INVOICES>
   <INVOICE_NUM>0098-35</INVOICE_NUM>
   <DATE>18/12/2014</DATE>
   <AMOUNT>47103.5</AMOUNT>
 </G_INVOICES>
  </LIST_G_INVOICES>
</G_SUPPLIER>
<G_SUPPLIER>
 <NAME>INDUSTRIAS DAI DAI</NAME>
 <LIST_G_INVOICES>
 <G_INVOICES>
   <INVOICE_NUM>0097-93</INVOICE_NUM>
   <DATE>01/05/2015</DATE>
   <AMOUNT>8962</AMOUNT>
 </G_INVOICES>
 </LIST_G_INVOICES>
</G_SUPPLIER>  
</LIST_G_SUPPLIER> 
</XX_TEST_INVOICES>  

En la plantilla RTF se muestra el siguiente diseño, donde se muestra una estructura donde por cada proveedor se debe mostrara su listado de factura, por lo tanto hay dos Grupos de Repeticiones, uno para Proveedores y otro para las factura tal cual se peude observar en el XML anterior. El campo llamado PageBreak contiene la sintaxis split-by-page-break. 


Para dar el salto de Pagina se debe colocar en el campo PageBreak con la sintaxis <?split-by-page-break:?> inmediatamente antes del campo <?end for-each?>. El campo PageBreak se coloca dentro del bucle final en este caso G_Supplier


Esto asegura un salto de página antes de que se visualice el siguiente proveedor. Con ello cada pagina que se genera sera por las facturas de cada proveedor y se podrá ver de la siguiente manera si hacemos la ejecución por PDF: