You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:20