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

たとえば、When-new-Form-Instanceからリストにデータを入力することをお勧めします。いつものように、Formsヘルプ(メニュー'ヘルプ/オンラインヘルプ')から何をする必要があるかがわかります。これは、リストアイテムの名前と、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 に答える
2

最善の方法は、設計時にすべてのレコード グループを構築することです。巨大ですでに遅いフォームがない限り、パフォーマンスが低下することはありません。次に、実行時にリスト項目を設定します。常に Forms ヘルプからコードをコピーして貼り付けます。

--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 に答える