Oracle Forms多记录块排序需求:保存前排序及触发事件实现
解决Oracle Forms多记录块排序问题
先来说你遇到的第一个问题:修改Order By属性没作用。其实这里有个容易混淆的点——块的Order By属性(注意是块级的设置,不是单个项的)只对从数据库查询加载的记录生效,如果你是手动录入的新记录(还没提交到数据库),这个属性不会自动排序Forms内存里的临时记录。
如果是查询出来的记录也没按预期排序,你可以排查这几个点:
- 确认块的
Order By属性语法正确,比如是不是写成了EMPNO ASC, ENAME DESC这种符合SQL规则的语句,字段名要和块的数据源字段一致,别用别名 - 检查块的
Query All Records属性是否设为Yes,如果是No,Forms可能只加载部分记录,排序效果不明显 - 如果块的数据源是存储过程,那
Order By属性完全不起作用,得在存储过程的SQL里手动加排序逻辑
接下来是你第二个需求:在WHEN-NEW-RECORD-INSTANCE事件中实现录入最后一条记录后自动排序。这个可以用Forms内置的SORT_BLOCK过程来实现,它能直接对当前块的所有记录(包括未提交的新记录)进行排序。
给你一个具体的触发器代码示例,你可以根据自己的块名和排序字段调整:
-- 在目标块的WHEN-NEW-RECORD-INSTANCE触发器中编写 DECLARE v_block_name VARCHAR2(30) := 'YOUR_BLOCK_NAME'; -- 替换成你的块名 BEGIN -- 判断当前是否是最后一条记录,并且是刚录入的新记录 IF :SYSTEM.LAST_RECORD = 'TRUE' AND :SYSTEM.RECORD_STATUS = 'NEW' THEN -- 按指定字段排序,语法和SQL的ORDER BY一致 SORT_BLOCK(v_block_name, 'EMPNO ASC, ENAME DESC'); -- 排序后定位回最后一条记录,避免光标乱跑 GO_BLOCK(v_block_name); LAST_RECORD; END IF; END;
这里要注意几个细节:
:SYSTEM.LAST_RECORD是Forms的系统变量,当光标在块的最后一条记录时返回TRUE:SYSTEM.RECORD_STATUS用来判断当前记录是新记录(NEW)、修改过的(CHANGED)还是未修改的(QUERY),我们只需要在录入新记录完成后触发排序- 排序后调用
LAST_RECORD可以让光标回到最后一条,避免用户操作时找不到位置
如果你的需求是提交后再排序,那可以把逻辑放到WHEN-COMMIT或者POST-COMMIT触发器里,不过你要的是录入最后一条就排序,上面的代码应该就能满足。
内容的提问来源于stack exchange,提问作者Questionnaire
相关产品推荐
相关产品推荐

