1

我想制作一个显示值的列表,比如文本项,但在列表中。

我的代码:

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;

如果我制作列表项并添加此代码,表单将不显示任何内容;如果我删除列表,一切正常。

PS触发器:when-list-item-change

4

2 回答 2

2

最好的办法是在设计时构建所有记录组。它不会降低性能,除非你有一些巨大的、已经很慢的形式。然后在运行时填充您的列表项。始终从表单帮助中复制/粘贴代码。

--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; 
于 2012-12-06T13:58:19.997 回答
2

我应该建议您从例如When-new-Form-Instance 中填充您的列表。像往常一样,您将从表单帮助(菜单“帮助/在线帮助”)中了解需要做什么。这是我为简单填充列表所做的一个过程,仅通过指定列表项的名称和用于填充 lsit 项的 select 语句。

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 是一个表单级别的触发器,应该在表单下(而不是块或项):

添加When-New-Form-Instance

于 2012-12-07T07:06:01.967 回答