【问题标题】:Oracle Forms list does not display valuesOracle Forms 列表不显示值
【发布时间】:2021-03-02 14:13:58
【问题描述】:

我想创建一个列表来显示值,比如文本项,但在列表中。

我的代码:

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;

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

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

【问题讨论】:

    标签: oracle oracleforms


    【解决方案1】:

    我应该建议您填充您的列表,例如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,我可以在其中找到此触发器,当我单击此处的列表时,无法仅找到 when-list-chenge 或类似的东西。
    • When-New-Form-Instance 是表单级触发器,因此可以直接在表单模块名称下找到。
    【解决方案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; 
    

    【讨论】:

    • 我在哪里可以找到Form help,你是关于F1的?
    • 是的,打开 Forms Builder 时的 F1 或帮助菜单。我从帮助中复制了上面的代码...
    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2012-01-23
    • 2018-07-18
    • 2019-10-23
    相关资源
    最近更新 更多