15.06.2014

WebADI: атрибуты интерфейса

Цель: ограничивать элементы в атрибуте интерфейса (выпадающий список) в зависимости от входных параметров. В нашем примере - три атрибута CAUSE_1, CAUSE_2, CAUSE_3, содержащих один и тот же комбо-бокс. Нужно выводить только те элементы, которые актуальны на текущий момент (в параметрах интегратора вводится месяц и год)

Нас интересует пункт WHERE:


Гарантированно не получится:
  • использовать в выражении WHERE переменную сессии/пакета. Интегратор запускается в отдельной сессии;
  • использовать ссылки на другие атрибуты;
  • использовать динамические конструкции.
Зато мы можем использовать в выражении: 
  • переменные окружения $ENV$ ($env$.userid, $env$.appid, $env$.respid);
  • параметры интегратора через $PARAM$ ($PARAM$.param1).
Обновить атрибут легко с помощью кода. В параметре val_addl_w_c гарантированно не сработает динамический SQL, поэтому ограничение реализуется с помощью функции.
DECLARE
   v_object_code       CONSTANT VARCHAR2 (30) := 'XXMY_DEVIATION'; -- код объекта
   v_interface_code    CONSTANT VARCHAR2 (30) := v_object_code || '_INTF';
begin
  UPDATE bne_interface_cols_b c
      SET val_type = 'TABLE',
          val_id_col = 'cause_fullname',
          val_mean_col = 'cause_fullname',
          val_obj_name = 'XXMY_DEVIATION_CAUSES',
          val_addl_w_c = 'XXMY_DEVIATION_PKG.compare_dates(p_month => $PARAM$.P_MONTH,p_year => $PARAM$.P_PERIOD_YEAR,p_start_date => start_date,p_end_date => end_date) = 1',
          lov_type = 'POPLIST'
    WHERE c.interface_code = v_interface_code
          AND (c.interface_col_name = 'CAUSE_1'
               OR c.interface_col_name = 'CAUSE_2'
               OR c.interface_col_name = 'CAUSE_3');
  commit;
end;

Комментариев нет :