Oracle 在plsql中生成组子组下拉列表

Oracle 在plsql中生成组子组下拉列表,oracle,plsql,oracleforms,Oracle,Plsql,Oracleforms,我有一个表,其中包含ID、组名和父组ID。我正在尝试创建两个下拉列表:第一个列表将所有具有父组\u id的组名设置为空,在选择第一个ddl(或仅选择默认值)后,第二个ddl中的值都应具有父组\u id列,以等于第一个选定组的id。到目前为止,我已经用2个poplists创建了数据块,并且在“whennewforminstance”上,我正在填充第一个ddl DECLARE rg_groups RecordGroup; rg_group_name VARCHAR2(5) := 'GNAME'

我有一个表,其中包含ID组名父组ID。我正在尝试创建两个下拉列表:第一个列表将所有具有父组\u id的组名设置为空,在选择第一个ddl(或仅选择默认值)后,第二个ddl中的值都应具有父组\u id列,以等于第一个选定组的id。到目前为止,我已经用2个poplists创建了数据块,并且在“whennewforminstance”上,我正在填充第一个ddl

DECLARE
 rg_groups RecordGroup; 
 rg_group_name VARCHAR2(5) := 'GNAME'; 
 plist_ID Item := Find_Item(':GROUPS.GROUP_NAME'); 
 nDummy NUMBER;
BEGIN 
  rg_groups := Find_Group(rg_group_name); 
 -- Delete any existing Group first 
  IF NOT Id_Null(rg_groups) THEN 
    Delete_Group(rg_groups); 
  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_groups := Create_Group_From_Query(rg_group_name,'SELECT group_name, 
  to_char(ID) FROM GROUPS WHERE PARENT_GROUP_ID IS NULL'); 
  -- Clear the existing List 
  Clear_List(plist_ID); 
  -- Populate the Record Group 
  nDummy := Populate_Group(rg_groups); 
  -- Populate the List Item 
  Populate_List(':GROUPS.GROUP_NAME',rg_groups);
END;
在第一个poplist项的“更改后”触发器上,填充第二个ddl:

DECLARE
 rg_groups RecordGroup; 
 rg_group_name VARCHAR2(5) := 'GPARENT_NAME'; 
 plist_ID Item := Find_Item(':GROUPS.PARENT_GROUP_ID'); 
 nDummy NUMBER;
BEGIN 
  rg_groups := Find_Group(rg_group_name); 
  -- Delete any existing Group first 
  IF NOT Id_Null(rg_groups) THEN 
    Delete_Group(rg_groups); 
  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_groups := Create_Group_From_Query(rg_group_name,'SELECT group_name, to_char(ID) FROM GROUPS WHERE PARENT_GROUP_ID = ' || :GROUPS.ID); 
   -- Clear the existing List 
   Clear_List(plist_ID); 
 -- Populate the Record Group 
 nDummy := Populate_Group(rg_groups); 
 -- Populate the List Item 
 Populate_List(':GROUPS.PARENT_GROUP_ID',rg_groups);
END;

然而,我觉得PARENT_GROUP_ID='||:GROUPS.ID的部分是错误的,因为我甚至没有填充ID,我需要从以前的ddl中提取ID,这就是我遇到的问题,我不太明白这在oracle表单中是如何工作的。我希望我能得到一些简单易懂的建议,关于采取哪种方式,谢谢

pop列表通常有两列-显示标签和存储到项目的值

您的第一个pop列表位于
组中。组名称
项显示组名称并存储组ID。这意味着当用户选择一个组时,其id将存储到
GROUPS.group\u NAME
,并且您的第二个pop列表中填充了错误的值

只需从
GROUPS.GROUP\u NAME
中删除您的第一个pop列表,然后在
GROUPS.ID
项上创建它


顺便说一句:当你通过名称引用一个项目时,不要使用冒号
Find_Item(':GROUPS.GROUP_NAME')
是错误的,
Find_Item('GROUPS.GROUP_NAME')
是正确的。

hm我理解你的意思,但是poplist如何理解我需要显示组名和id值,而不是显示id?这取决于select中的列顺序-第一个是label,第二个问题是,值也是
rg\u group\u name
的长度有问题,应该长一点