Список Oracle Forms не отображает значения

Я хочу создать список, в котором будут отображаться значения, такие как текстовый элемент, но в списке.

Мой код:

DECLARE
      rg_dept     RecordGroup;
   
      rg_dname    VARCHAR2(4) := 'Name';
     
      dlist_ID    Item := Find_Item('PROJESCT.LIST_ID');
    
      nDummy      NUMBER;
BEGIN
      rg_dept := Find_Group(rg_dname);
   
     
      -- Delete any existing Group first
      IF NOT Id_Null(rg_dept) THEN
            Delete_Group(rg_dept);
      END IF;
  
      -- Now create a Record Group using a SQL query
      -- Your Query must have a Label and a Value (two Columns)
      -- and the data types must match your item type   
      rg_dept := Create_Group_From_Query(rg_dname,'SELECT department_name, to_char(department_id) FROM departments');
    
 
      --Clear the existing List
      Clear_List(dlist_ID);
   
 
      -- Populate the Record Group
      nDummy := Populate_Group(rg_dept);
      
 
      -- Populate the List Item
      Populate_List(dlist_ID ,rg_dept);
     
END;

Если я создам элемент списка и добавлю этот код, форма ничего не отобразит; если я удалю список, все в порядке.

P.S. Триггер: when-list-item-change


person Wizard    schedule 06.12.2012    source источник


Ответы (2)


Я должен порекомендовать вам заполнить ваши списки, например. Когда-новый-Форма-Экземпляр. Как обычно, вы получите хорошее представление о том, что вам нужно сделать, из справки по формам (меню «Справка/Интерактивная справка»). Это процедура, которую я сделал для простого заполнения списка, указав только имя элемента списка и оператор выбора для заполнения элемента lsit.

PROCEDURE populate_list_item (
  p_item_name   VARCHAR2
, p_select  VARCHAR2
) IS
    l_rg_id         RECORDGROUP;
    l_list_id       ITEM;
    l_err_num       PLS_INTEGER;

    FUNCTION create_temp_group (
      p_select      VARCHAR2
    ) RETURN RECORDGROUP IS
        l_rg_id     RECORDGROUP;
        l_group_name    VARCHAR2(30) := 'TMP$RG';
    BEGIN
        l_rg_id := FIND_GROUP(l_group_name);

        --Make sure that record group don't alreay exist
        IF NOT ID_NULL(l_rg_id) THEN
           DELETE_GROUP(l_rg_id);
        END IF;

        --Populate the temporary record group
        l_rg_id := CREATE_GROUP_FROM_QUERY(l_group_name, p_select);

        RETURN l_rg_id;
    END create_temp_group;

BEGIN
    l_rg_id := create_temp_group(p_select);

    l_err_num := Populate_Group(l_rg_id);

    --Allow for no data found in the selection query
    IF l_err_num NOT IN (0, 1403) THEN
        RAISE Form_Trigger_Failure; 
    END IF;

    l_list_id := Find_Item(p_item_name);
    IF ID_NULL(l_list_id) THEN
        RAISE Form_Trigger_Failure; 
    END IF;

    Populate_List(l_list_id, l_rg_id);

    Delete_Group(l_rg_id);
END populate_list_item;

When-New-Form-Instance является триггером уровня формы и должен находиться под формой (а не блоком или элементом):

Добавление экземпляра новой формы

person Peter Å    schedule 07.12.2012
comment
When-new-Form-Instance, где я могу найти этот триггер, когда я нажимаю на список здесь, я не могу найти только when-list-chenge или что-то в этом роде. - person Wizard; 07.12.2012
comment
When-New-Form-Instance — это триггер уровня формы, поэтому его можно найти непосредственно под именем модуля формы. - person Peter Å; 07.12.2012

Лучше всего создать все группы записей во время разработки. Это не снижает производительность, если только у вас нет какой-то огромной, и без того медленной формы. Затем заполните элементы списка во время выполнения. Всегда копируйте/вставляйте код из справки по формам.

--Oracle Forms Example: Create a record group from a query, and populate it.

DECLARE 
  rg_name VARCHAR2(40) := 'Salary_Range'; 
  rg_id RecordGroup; 
  errcode NUMBER; 
BEGIN 
/* 
** Make sure group doesn't already exist 
*/ 
 rg_id := Find_Group( rg_name ); 
/* 
** If it does not exist, create it and add the two 
** necessary columns to it. 
*/ 
IF Id_Null(rg_id) THEN 
 rg_id := Create_Group_From_Query( rg_name, 
  'SELECT SAL-MOD(SAL,1000) BASE_SAL_RANGE,' 
   ||'COUNT(EMPNO) EMPS_IN_RANGE ' 
   ||'FROM EMP ' 
   ||'GROUP BY SAL-MOD(SAL,1000) ' 
   ||'ORDER BY 1'); 
END IF; 
/* 
** Populate the record group 
*/ 
  errcode := Populate_Group( rg_id ); 
END; 
person Art    schedule 06.12.2012
comment
где я могу найти Form help, вы о F1 ? - person Wizard; 06.12.2012
comment
Да, F1 или меню справки в Forms Builder при его открытии. Я скопировал код выше из справки... - person Art; 06.12.2012