自动行号功能实现不同方法研究

本文详细介绍了在Oracle Forms中实现自动行号的五种方法,包括使用公式、Block触发器、创建参数和非数据库字段、自定义Package以及处理删除记录后的行号重排。每种方法都有其优缺点,适用于不同的场景。例如,方法一简单但无法自动刷新,方法三通过Package实现行号管理,但可能存在行号断号问题。文章还提到了与行记录操作相关的API,如APP_RECORD.DELETE_ROW和APP_RECORD.FOR_ALL_RECORDS。
摘要由CSDN通过智能技术生成


方法一、

只需要将序号定义成公式,并将公式设置为:get_block_property('block_name',current_record)就可以实现了,或者把这行语句放到“When-Create-Record”触发器中。

缺点:增改删时,行号不能自动刷新。




方法二、


block的三个触发器中添加相应的代码:


Key-Crerec:
DECLARE
LINE NUMBER;
BEGIN
LINE := :SYSTEM.CURSOR_RECORD;
LOOP
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN 
EXIT; 
ELSE
NEXT_RECORD; 
:blk.ID := :SYSTEM.CURSOR_RECORD + 1; 
END IF; 
END LOOP;
GO_RECORD(LINE);
CREATE_RECORD;
:blk.ID := :SYSTEM.CURSOR_RECORD;
END;
Key - Delrec:
DECLARE
LINE NUMBER;
BEGIN
DELETE_RECORD;
LINE := :SYSTEM.CURSOR_RECORD;
LOOP 
:blk.ID := :SYSTEM.CURSOR_RECORD; 
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN 
EXIT; 
ELSE 
NEXT_RECORD; 
END IF; 
END LOOP;
GO_RECORD(LINE);
END;
When - Create - Record:
:blk.ID := :SYSTEM.TRIGGER_RECORD;

缺点:对于记录数很少的table适用,当table中的记录很多时,由于使用了循环操作,所以会影响效率。


 

为了防止按F11时也生成序号,影响查询,可以在生成前加入以下条件:


IF (:SYSTEM.MODE != ‘ENTER-QUERY’) THEN 


方法三


Step1创建3个参数和一个非数据库字段


Parametername                                                 type       InitialValue


P_BOLCKNAME_MAX_LINE_NUMBER    number


P_BOLCKNAME_VALIDATE_FLAG            char


P_BOLCKNAME_RESET_LINE_NUMBER  char        N


在使用line_number功能的Block中添加一个非数据库Item


Columnname                          type       InitialValue


VAL_REC_FIRED_FLAG      char       N


 


Step2block-leveltrigger中添加以下代码


(1) pre_query


 BOLCKNAME.line_num('PRE-QUERY');


(2) post_query


 BOLCKNAME.line_num('POST-QUERY');


(3) when_create_record


 IF :PARAMETER. P_BOLCKNAME_RESET_LINE_NUMBER = 'Y' THEN


     copy('1',:PARAMETER.P_BOLCKNAME_MAX_LINE_NUMBER);


     :PARAMETER.P_BOLCKNAME_RESET_LINE_NUMBER:= 'N';


END IF;


BOLCKNAME.line_num('INIT');


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值