viernes, 2 de julio de 2021

NAME_IN y COPY con vitaminas

Para acceder a los valores de los campos del registro en el que se encuentra el cursor se puede hacer simplemente usando :bloque.campo.

Si se hace desde una unidad de programa de una PLL habría que usar el Bult-in NAME_IN que se usa de de la siguiente forma: NAME_IN('BLOQUE.CAMPO'). Además de permitir usarse en desde una librería también nos permite hacer código genérico en tiempo de ejecución.

De forma similar, para asignar un valor habría que usar COPY. Se usaría de la siguiente forma: COPY('VALOR A ASIGNAR', 'BLOQUE.CAMPO');

Cuando se quiere acceder a valores de campos de otros registros distintos al actual es donde entra en juego la propiedad DATA_VALUE de Get_Item_Instance_Property y Set_Item_Instance_Property.

Para acceder al valor de un campo del registro anterior al actual se haría con:

Get_Item_Instance_Property('BL.CAMPO', TO_NUMBER(:system.cursor_record) - 1, DATA_VALUE);

Para cambiar el valor de un campo del registro anterior: 

Set_Item_Instance_Property('BL.CAMPO', TO_NUMBER(:system.cursor_record) - 1, DATA_VALUE, 'VALOR A ASIGNAR');

Por ejemplo, si queremos colorear un registro basándonos en registros anteriores, se podría hacer de la siguiente forma. POST-QUERY:

DECLARE
  PROCEDURE pinta_campo(p_campo VARCHAR2) IS
  BEGIN
   Set_Item_Instance_Property(p_campo,
                              CURRENT_RECORD, 
                              VISUAL_ATTRIBUTE, 'AMARILLO');
  END;
BEGIN
  IF :system.trigger_record = 1 OR
    Get_Item_Instance_Property('USER_TAB_COLUMNS.TABLE_NAME',
       TO_NUMBER(:system.trigger_record) - 1,
       DATA_VALUE) != :user_tab_columns.table_name THEN
    pinta_campo('USER_TAB_COLUMNS.TABLE_NAME');
    pinta_campo('USER_TAB_COLUMNS.COLUMN_NAME');
    pinta_campo('USER_TAB_COLUMNS.DATA_TYPE');
  END IF;
END;



FMB de ejemplo: giip_data_value.fmb

No hay comentarios: