Mostrando entradas con la etiqueta Oracle Forms. Mostrar todas las entradas
Mostrando entradas con la etiqueta Oracle Forms. Mostrar todas las entradas

lunes, 30 de noviembre de 2015

Columnas de registro histórico(WHO)

La función de registro histórico o Record History (WHO) se caracteriza por dar información acerca de quién creó o actualizo una o varias  filas en tablas de Oracle E-Business Suite.  Si se     agrega columnas especiales WHO a las tablas y la lógica WHO a los formularios y procedimientos almacenados, los usuarios pueden realizar un seguimiento de los cambios realizados en sus datos. Al observar columnas WHO, los usuarios pueden diferenciar entre los cambios realizados por los formularios y los cambios realizados por los programas concurrentes.


Puede presentar las columnas WHO como campos ocultos en cada bloque de su formulario (que corresponden a las columnas de la tabla asociada). Usando la opción  FND_STANDARD.SET_WHO en PRE-UPDATE y PRE-INSERT para rellenar estos campos.

Adición de Columnas de registro histórico
En la siguiente tabla se muestran las columnas estándar utilizados para Historial (WHO), los atributos de la columna y descripciones, como también las fuentes de los valores. Establezca las columnas CREATED_BY y CREATION_DATE sólo cuando se inserta una fila (usando FND_STANDARD.SET_WHO en un formulario).


Cualquier tabla que puede ser actualizado por un programa concurrente también tiene columnas adicionales. La siguiente tabla muestra las columnas de procesamiento simultáneos utilizados para Historial cuando se actualiza por un programa.



Clases de Propiedades
Aplicar la clase de propiedad CREATION_OR_LAST_UPDATE_DATE a los campos CREATION_DATE  y LAST_UPDATE_DATE en los formularios. Estas clases de propiedades establecen los atributos correctos para estos campos, incluyendo el tipo de datos y el ancho. Aplicar la clase de propiedad TEXT_ITEM a los campos del formulario LAST_UPDATED_BY y CREATED_BY.


Insertar FND_STANDARD.SET_WHO en los triggers PRE-UPDATE y PRE-INSERT para a ni vel del bloque de consulta. Una vez guardado los cambios compilar y verificar colocándose en el formulario de la tabla en consulta e ir a Ayuda >> Registrar Historial.

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;

martes, 21 de julio de 2015

Como Agregar Default_Where en un Bloque de Oracle Forms

En Oracle Forms puede crear un Bloque de Datos que la fuente de datos es una tabla o vista de su Base de Datos. Si bien puede colocar un filtro de que datos solo necesita trabajar hay ocasiones en que dependiendo de como se navega en el formulario y en sus bloques solo se requiera ciertos datos y por lo tanto diversos tipos de filtros.



La clausula Default_Where básicamente es agregar un filtro o condición desde el comando Set_Block_Property que le permite seleccionar las columnas de un conjunto de resultados.  Por ejemplo si desea limitar los resultados por un valor de columna específico o un registro en particular, que normalmente se debería añadir en la cláusula WHERE del bloque de datos. 

Sin embargo, desde su bloque solo se basa en una sola cláusula WHERE ,para modificarlo debe utilizar la opción DEFAULT_WHERE. Este puede ser usado en un botón cuando se dispare el trigger WHEN-BUTTON-PRESSED. Para ello puede utilizar el siguiente código:

IF P_REVIEW ='Y'  THEN

SET_BLOCK_PROPERTY('XX_DETAIL',DEFAULT_WHERE, 'REVIEW='''||P_REVIEW||'''');
      
ELSE

SET_BLOCK_PROPERTY('XX_DETAIL',DEFAULT_WHERE,'ID='||:XX_HEAD.HEAD_ID);
     
END IF;
  
EXECUTE_QUERY;

En este caso se ha utilizado de tal forma que tenemos dos bloques XX_HEAD XX_DETAIL. Si del bloque XX_HEAD marcamos la casilla REVIEW este debe filtrar solo la información de revisados en el bloque XX_DETAIL, sino esta marcado significa que debe traer todas las líneas por id del bloque XX_HEAD.

Variables de Sistema en ORACLE FORMS

Una variable de sistema es una variable en  Oracle Forms que sigue la pista de un estado interno del Formulario. Puede hacer referencia al valor de una variable de sistema para controlar el formulario en que una aplicación se comporta.

Oracle Forms mantiene los valores de las variables del sistema en función de cada formulario. Es decir, los valores de todas las variables del sistema corresponden al formulario en uso. 

SYSTEM.BLOCK_STATUS
Representa el estado del bloque donde se encuentra el cursor, o el bloque actual durante el procesamiento gatillo. El valor puede ser una de las tres cadenas de caracteres:

CHANGED: indica que el bloque contiene al menos un registro cambiado.
NEW: Indica que el bloque contiene sólo Nuevos registros.
QUERY: Indica que el bloque contiene sólo los registros válidos que han sido recuperados de la base de datos.

SYSTEM.COORDINATION_OPERATION
Esta variable de sistema funciona con SYSTEM.MASTER_BLOCK para ayudar a un control sobre el Trigger On-Clear-Details  el cual determina qué tipo de operación se ha activado del trigger y en cual  bloque principal esta la relación maestro-detalle.

SYSTEM.CURRENT_BLOCK
El valor que la variable de sistema SYSTEM.CURRENT_BLOCK representa depende de la unidad de navegación donde se ubique:

Si la unidad de navegación actual es el bloque, registro o elemento el valor de SYSTEM.CURRENT_BLOCK es el nombre del bloque donde se encuentra el cursor. Si la unidad de navegación actual es el formulario el valor de SYSTEM.CURRENT_BLOCK es NULL.

SYSTEM.CURRENT_DATETIME
Es una variable que representa la fecha del sistema operativo. El valor es una cadena CHAR en el siguiente formato:

DD-MON-YYYY HH24:MI:SS

SYSTEM.CURRENT_FORM
Representa el nombre del formulario que Oracle Forms está ejecutando. El valor siempre es una cadena de caracteres.

SYSTEM.CURRENT_ITEM
El valor que la variable de sistema SYSTEM.CURRENT_ITEM representa depende de la unidad de navegación donde se ubique:

Si la unidad de navegación actual es en el elemento, el valor de SYSTEM.CURRENT_ITEM es el nombre del elemento que Oracle que el cursor se encuentra. El nombre del elemento devuelto no incluye un prefijo del nombre de bloque. Si la unidad de navegación actual es el registro, bloque o formulario,  el valor de SYSTEM.CURRENT_ITEM es NULL.

SYSTEM.CURRENT_VALUE
Representa el valor del elemento que se registra en SYSTEM.CURRENT_ITEM. El valor siempre es una cadena de caracteres.

SYSTEM.CURSOR_BLOCK
El valor que la variable de sistema SYSTEM.CURSOR_BLOCK representa depende de la unidad de navegación donde se ubique:

Si la unidad de navegación actual es el bloque, registro o elemento, el valor de SYSTEM.CURSOR_BLOCK es el nombre de la cuadra donde se encuentra el cursor. El valor siempre es una cadena de caracteres. Si la unidad de navegación actual es el formulario, el valor de SYSTEM.CURSOR_BLOCK es NULL.

SYSTEM.CURSOR_ITEM
Representa el nombre del bloque y el elemento, block.item, donde se encuentra el cursor. El valor siempre es una cadena de caracteres.


SYSTEM.CURSOR_RECORD
Representa el número del registro donde se encuentra el cursor. Este número representa el orden físico actual del registro en la lista del bloque de registros. El valor siempre es una cadena de caracteres.

SYSTEM.CURSOR_VALUE
Representa el valor del elemento donde se encuentra el cursor. El valor siempre es una cadena de caracteres.

SYSTEM.CUSTOM_ITEM_EVENT
Almacena el nombre del evento disparado por un control VBX.

SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS
Almacena los argumentos complementarios para un evento disparado por un control VBX.

SYSTEM.DATE_THRESHOLD
Representa la nueva consulta de  fecha de base de datos. Esta variable trabaja en conjunto con las tres variables del sistema $$DBDATE$$, $$DBDATETIME$$, y  $$DBTIME$$. Controla la frecuencia con que Oracle Forms sincroniza la fecha de base de datos con el RDBMS. El valor de esta variable debe especificarse en el siguiente formato: MI: SS.

Debido a las consultas RDBMS frecuentes pueden degradar el rendimiento, lo mejor es mantener este valor razonablemente alto. Sin embargo, tenga en cuenta que si el valor no está sincronizado con la suficiente frecuencia, puede ocurrir un poco de tiempo de discrepancia. Además, si usted está construyendo una aplicación cliente-servidor, las implicaciones de rendimiento de SYSTEM.DATE_THRESHOLD podrían variar dependiendo de la complejidad de la configuración de red.

SYSTEM.EFFECTIVE_DATE
Representa la fecha base de datos efectiva. El valor de la variable siempre debe estar en el siguiente formato:

DD-MON-YYYY HH24:MI:SS

SYSTEM.EVENT_WINDOW
La variable de sistema SYSTEM.EVENT_WINDOW representa el nombre de la última ventana que se vio afectada por una acción que causó un trigger. Los siguientes triggers  para  esta variable se actualiza en :

WHEN-WINDOW-ACTIVATED
WHEN-WINDOW-CLOSED
WHEN-WINDOW-DEACTIVATED
WHEN-WINDOW-RESIZED

Desde dentro de estos trigger, puede asignar el valor de la variable a una  variable global, Parámetro, Variable o elemento.
  
SYSTEM.FORM_STATUS
Representa el estado del formulario actual. El valor puede ser una de las siguientes tres cadenas de caracteres:

CHANGE:- Indica que el formulario contiene al menos un bloque con un registro cambiado.  
NEW: Indica que el formulario contiene sólo Nuevos registros.
QUERY: Indica que una consulta Esta en consulta.

SYSTEM.LAST_FORM
Representa el ID de módulo del formulario anterior, donde múltiples formularios se han invocado usando OPEN_FORM. El valor puede ser una de las dos cadenas de caracteres: o bien el ID de módulo de formulario o NULL.

SYSTEM.LAST_QUERY
Representa la ultima instrucción SELECT que Oracle Forms ha utilizado para rellenar un bloque durante una sesión. El valor siempre es una cadena de caracteres.

SYSTEM.LAST_RECORD
Indica si el registro actual es el último registro en la lista de un bloque de registros. El valor es uno de los siguientes dos valores CHAR:

TRUE: Indica que el registro actual es el último registro en la lista del bloque actual de registros.
FALSE: Indica que el registro actual no es el último registro en la lista del bloque actual de registros.

SYSTEM.MASTER_BLOCK
Esta variable de sistema funciona con SYSTEM.COORDINATION_OPERATION para ayudar a un control sobre el Trigger On-Clear-Details  el cual determina qué tipo de operación se ha activado del trigger y en cual  bloque principal esta la relación maestro-detalle. SYSTEM.MASTER_BLOCK representa el nombre del bloque principal.

SYSTEM.MESSAGE_LEVEL
Representa uno de los siguientes niveles de severidad de mensajes: 0, 5, 10, 15, 20 o 25. El valor es siempre una cadena de caracteres.

Durante una sesión de Oracle Forms suprime todos los mensajes con un nivel de severidad que es igual o inferior (menos grave) que el nivel de severidad indicada.

Asignar un valor a la variable de sistema SYSTEM.MESSAGE_LEVEL con la sintaxis de PL / SQL estándar:

:System.Message_Level := value;

Los valores legales para SYSTEM.MESSAGE_LEVEL son 0, 5, 10, 15, 20 y 25. Oracle Forms no suprime avisos o mensajes de error vitales, no importa qué nivel de severidad seleccione.
  
SYSTEM.MODE
SYSTEM.MODE indica si el formulario está en Normal, Enter Query, o Fetch en modo de procesamiento. El valor siempre es una cadena de caracteres.

NORMAL:  Indica que el formulario está en modo de procesamiento normal.
ENTER-QUERY:  Indica que el formulario se encuentra actualmente en intro de modo de consulta.
QUERY:  Indica que el formulario se encuentra actualmente en consulta a modo de procesamiento, lo que significa que una consulta se está procesando actualmente.

SYSTEM.MOUSE_BUTTON_PRESSED
Indica el número del botón que se hizo clic. El botón del mouse se limita a los botones 1 y 2 (de izquierda o de centro) en un ratón de tres botones. El valor siempre es una cadena de caracteres.

SYSTEM.MOUSE_BUTTON_SHIFT_STATE
Indica la tecla que se pulsa durante el clic, por ejemplo, MAYÚS, ALT, o CONTROL. El valor siempre es una cadena de caracteres.

SYSTEM.MOUSE_CANVAS
Si el ratón está en un lienzo, SYSTEM.MOUSE_CANVAS representa el nombre de aquel lienzo como un valor CHAR. Si el ratón está en un elemento, esta variable representa el nombre del lienzo  que contiene el artículo. SYSTEM.MOUSE_CANVAS es NULL si el mouse no se encuentra en un lienzo

SYSTEM.MOUSE_FORM
Si el mouse está en un módulo de formulario, SYSTEM.MOUSE_FORM representa el nombre de ese módulo de formulario como un valor CHAR. Por ejemplo, si el mouse está en Form_Module1, el valor para SYSTEM.MOUSE_ITEM es FORM_MODULE1.

SYSTEM.MOUSE_ITEM

Si el mouse está en un elemento, SYSTEM.MOUSE_ITEM representa el nombre de ese elemento como un valor CHAR. Por ejemplo, si el ratón está en Item1 en Bloque2, el valor para SYSTEM.MOUSE_ITEM es: BLOCK2.ITEM1. SYSTEM.MOUSE_ITEM es NULL si  el mouse no está en un elemento.

SYSTEM.MOUSE_RECORD
Si el mouse está en un registro, SYSTEM.MOUSE_RECORD representa el número registro de ese registro como un valor CHAR.

SYSTEM.MOUSE_RECORD_OFFSET
Si el mouse está en un registro, SYSTEM.MOUSE_RECORD_OFFSET representa el desplazamiento desde el primer registro visible como un valor CHAR. Por ejemplo, si el mouse está en el segundo de los cinco registros visibles en un bloque, su valor será 2.

SYSTEM.MOUSE_X_POS

SYSTEM.MOUSE_Y_POS
Representa la coordenada Y del mouse en su  valor es relativo a la esquina superior izquierda de la pantalla

SYSTEM.RECORD_STATUS
Representa el estado del registro donde se encuentra el cursor. Puede tener los siguientes valores:

CHANGE: Indica que el estado de la validación de un registro  ha cambiado.
INSERT: Indica que el estado de la validación del registro se ha cambiado y que no existe el registro en la base de datos.
NEW: Indica que el estado de la validación del registro es Nuevo.
QUERY: Indica que el estado de la validación del registro es válido y que fue recuperado de la base de datos.

SYSTEM.TRIGGER_BLOCK
Representa el nombre del bloque en el que se encuentra el cursor cuando el Trigger se ejecuta. El valor es NULL si el Trigger es un PRE o POST Formulario. El valor siempre es una cadena de caracteres.

SYSTEM.TRIGGER_ITEM
Representa el elemento (BLOCK.ITEM) en el ámbito de aplicación para cuando el Trigger se ejecuta. El valor siempre es una cadena de caracteres.

SYSTEM.TRIGGER_RECORD

Representa el número del registro que Oracle Forms está procesando. Este número representa el orden físico actual del registro en la lista del bloque de registros. El valor siempre es una cadena de caracteres.

jueves, 9 de julio de 2015

Bloque de Datos en Oracle Forms

Un bloque es la unidad de construcción intermedia para los formularios. Cada formulario se compone de uno o más bloques. Un bloque es el propietario lógico de elementos, y cada elemento en una formulario pertenece a un bloque. Los elementos de un bloque son lógicamente relacionados; por ejemplo, que pueden ser las columnas de la misma tabla de base de datos o pueden tener que ser parte de la misma pantalla de navegación. Por lo tanto, los bloques proporcionan un mecanismo para agrupar elementos relacionados en una unidad funcional para almacenar, visualizar y manipular los registros.


Tipos de Bloques
En Forms Builder hay dos tipos principales de bloques: bloques de datos y bloques de control.

Bloques de Datos
Un bloque de datos se asocia con una tabla específica de base de datos (o vista), un procedimiento almacenado o un consulta. Si se basa en una tabla (o vista), el bloque de datos puede basarse en una sola tabla. Por defecto, la asociación entre un bloque de datos y la base de datos permite al usuario acceder de forma automática y manipular datos en la base de datos. Sin embargo, para acceder a los datos de otras tablas (nonbase tablas), tiene que escribir Triggers.

Bloque de Control
Un bloque de control no está asociado con una base de datos, y sus elementos no se refieren a las columnas dentro de una tabla de base de datos. Sus elementos se denominan elementos de control. Por ejemplo, puede crear muchos botones en el módulo para iniciar ciertas acciones y de grupo, lógicamente, estos botones en un bloque de control.

Creando un Bloque de Datos
Un  formulario consiste en uno o más bloques de datos y bloques de control. Para la creación de un bloque implica la creación del bloque de datos y luego trazar su contenido para su presentación visual. Puede crear un bloque de datos de forma manual o mediante el uso del Asistente de Bloque de Datos.


El Asistente de bloque de datos le permite crear (o modificar) bloques de datos rápida y fácilmente para su uso en su aplicación. El asistente puede generar automáticamente código para hacer cumplir las restricciones de integridad en la base de datos.

Para iniciar el Asistente de bloque de datos, realice una de las siguientes opciones:
En Form Builder , realice una de las siguientes opciones:

Seleccione Herramientas >> Asistente de Bloque de Datos o en el Navegador de objetos, seleccione el nodo de Bloques de Datos, a continuación, haga clic en el icono Crear. En el cuadro de diálogo Nuevo bloque de datos, seleccione la opción Usar el Asistente de bloque de datos. Podrá elegir entre  Tabla o Vista Procedimiento almacenado. Seleccione la tabla o vista opción (por defecto).


Luego ingresar el nombre del objeto onde se origina los datos o haga clic en Examinar y seleccione un objeto de cuadro de diálogo. Haga clic en Actualizar para mostrar una lista de columnas de la tabla seleccionada. Si no está conectado a la base de datos, se muestra el cuadro Conectar.

Seleccionar las columnas que desea incluir o excluir usando las flechas. También puede arrastrar las columnas seleccionadas de una lista a otra.



Finalmente seleccione la opción Crear el bloque de datos. Tiene la opción de salir del Asistente Bloque de Datos en esta etapa, sin invocar el Asistente de Diseño. Si lo hace, puede diseñar el bloque de datos de forma manual o invocar el asistente de diseño en un momento posterior para disponer los elementos de un bloque de datos. 


jueves, 2 de julio de 2015

Colocar en modo Lectura los campos Flexfields Descriptivos

La librería Custom.pll puede ser utilizado para una amplia gama de personalizaciones. Por ejemplo, puede ser utilizado para hacer que los segmentos de Flexfields Descriptivos(DFF) estén en modo de solo lectura basado en una condición o varias condiciones.

Para ello vamos a usar el proceso FND_DESCR_FLEX.UPDATE_DEFINITION. Este proceso ya esta dentro de las muchas librerías asociadas a la librería Custom.pll. Este proceso identifica el Flexfield Descriptivo indicando su nombre y el bloque donde se desea realizar una acción. Este proceso tiene la siguiente estructura de parámetros:      

FND_DESCR_FLEX.UPDATE_DEFINITION(
/* Parametros obligatorios */
    BLOCK=>'Nombre del Bloque',
    FIELD=>'Nombre del Campo',
/* Habilitar o Desahabilitar Flexfields*/   
    ENABLED=>'Indicar Y o N',
/* Habilitar modo lectura*/       
    READ_ONLY=>'Indicar Y o N',
/* Parametros opcionales*/       
    VDATE=>'Indicar Fecha',
    TITLE =>'Titulo',
    AUTOPICK=>'Indicar Y o N',
    USEDBFLDS=>'Indicar Y o N',
    LOCK_FLAG=>'Indicar Y o N',
    HELP=>'APPL=application_short_name;
            TARGET=target_name',
    CONTEXT_LIKE=>'WHERE_clause_fragment');

El procedimiento deshabilita todos los segmentos DFF, esto se debe a que un FlexField es un solo campo en un formulario, sin embargo cuando se hace clic en él, se abre la ventana de Flexfields Descriptivos, los múltiples campos que se visualizan es en realidad una salida de usuario con múltiples segmentos el cual no forman campos. Es por ello que no es posible deshabilitar un solo segmento Flexifled sin que los otros sigan habilitados. 

Por ejemplo vamos a deshabilitar los segmentos DFF de la pantalla de Proveedores. En nuestra librería custom debemos ubicarnos  en una Unidad de Programa y podemos colocar el siguiente código:   

IF ( EVENT_NAME = 'WHEN-NEW-BLOCK-INSTANCE' AND  V_FORM_NAME = 'APXVDMVD') THEN
  IF  V_BLOCK_NAME = 'VNDR' AND NAME_IN('VNDR.VENDOR_TYPE_LOOKUP_CODE')='VENDOR' IS NOT NULL THEN
               
 FND_DESCR_FLEX.UPDATE_DEFINITION(BLOCK     => 'VNDR',
                                  FIELD     => 'DESC_FF_MIR',
                                  READ_ONLY  => 'Y');
            
    END IF;
  END IF;     

Compilamos nuestra librería en el servidor de Aplicaciones y nos ubicaremos en la pantalla de Proveedores. Podremos apreciar que los campos DFF estan solo en modo lectura. Tener en cuenta que es necesario conocer el nombre del bloque en esta caso VNDR y el campo DFF al cual desea realizar la deshabilitación.