只须要将“序号”定义成公式,并将公式设置为:get_block_property('block_name',current_record)就能够实现了,或者把这行语句放到“When-Create-Record”触发器中。数据库
缺点:增改删时,行号不能自动刷新。app
①在须要自动行号的Block中,新增一个Item,我这里取名为LINE_NUM(注:这不是数据库中的字段,即属性Database Item为No),放在对应画布上及调整布局;函数
②在对应Block添加相应Block级别的触发器:ORDER_LINES为个人数据块布局
KEY-CREREC: spa
DECLARE LINE NUMBER; BEGIN LINE := :SYSTEM.CURSOR_RECORD; LOOP IF :SYSTEM.LAST_RECORD = 'TRUE' THEN EXIT; ELSE NEXT_RECORD; :ORDER_LINES.LINE_NUM := :SYSTEM.CURSOR_RECORD + 1; END IF; END LOOP; GO_RECORD(LINE); CREATE_RECORD; :ORDER_LINES.LINE_NUM := :SYSTEM.CURSOR_RECORD; END;
KEY-DELREC:.net
DECLARE LINE NUMBER; BEGIN DELETE_RECORD; LINE := :SYSTEM.CURSOR_RECORD; LOOP :ORDER_LINES.LINE_NUM := :SYSTEM.CURSOR_RECORD; IF :SYSTEM.LAST_RECORD = 'TRUE' THEN EXIT; ELSE NEXT_RECORD; END IF; END LOOP; GO_RECORD(LINE); END;
WHEN-CREATE-RECORD:code
:ORDER_LINES.LINE_NUM := :SYSTEM.TRIGGER_RECORD;
POST-QUERY:(注:若是这里使用了该触发器,查询会获取不到行号,须要加入如下到该触发器获取行号)xml
begin :ORDER_LINES.LINE_NUM:=:SYSTEM.TRIGGER_RECORD; end;
效果图:包含两个数据块(OEDER_HEADERS和ORDER_LINES),ODRDER_HEADERS.TOTAL是全部总金额,ORDER_LINES.AMOUNT是没一行总金额blog
步骤:get
①建立ORDER_HEADERS.TOTAL,设置其子类属性为:TEXT_ITEM_DISPLAY_ONLY;
在合计显示的数据块中,建立合计项目的汇总临时项目,命名规则为:<合计项目名称>_RTOT_DB,NUMBER(38)/DISPLAY_ITEM,即TOTAL_RTOT_DB/NUMBER(38)/DISPLAY_ITEM;
(注:这两个字段都不是数据库中的字段,故Item的属性Database Item为No,不然会提示该字段无效);
②添加一个包,用于封装app_calculate.running_total()及初始化amount的存储过程,以下:
包头:
PACKAGE TOTAL_LINES IS procedure amount (event varchar2); procedure running_total (event varchar2); END TOTAL_LINES;
包体:
procedure running_total (event varchar2) is begin app_calculate.running_total(event,'ORDER_LINES.AMOUNT','ORDER_HEADERS.TOTAL'); end running_total; procedure amount (event varchar2) is begin if event = 'INIT' then copy(name_in('order_lines.price') * name_in('order_lines.quantity'),'order_lines.amount'); end if; end amount; END TOTAL_LINES;
③ORDER_LINES对应触发器:(ORDER_LINES块级,存放每行总金额的块)
KEY-DELREC:
total_lines.running_total('KEY-DELREC'); --注:这里是删除行号的代码,若是不删除会同时删除两行 --DELETE_RECORD; DECLARE LINE NUMBER; BEGIN DELETE_RECORD; LINE := :SYSTEM.CURSOR_RECORD; LOOP :ORDER_LINES.LINE_NUM := :SYSTEM.CURSOR_RECORD; IF :SYSTEM.LAST_RECORD = 'TRUE' THEN EXIT; ELSE NEXT_RECORD; END IF; END LOOP; GO_RECORD(LINE); END;
KEY-DUPREC:
total_lines.running_total('KEY-DUPREC'); duplicate_record;
KEY-CLRREC:
CLEAR_RECORD;
WHEN-CLEAR-BLOCK:
total_lines.running_total('WHEN-CLEAR-BLOCK');
POST-QUERY:
total_lines.amount('INIT'); total_lines.running_total( 'POST-QUERY'); --注:这是获取行号的 begin :ORDER_LINES.LINE_NUM:=:SYSTEM.TRIGGER_RECORD; end;
④在ORDER_HEADERS(放Total总金额的数据块)的数据块级触发器上添加查询初始化全部总金额Total
POST-QUERY:
select nvl(sum(price*quantity),0) into :order_headers.total from Cux_Order_Lines_All_25305 where header_id = :order_headers.header_id ; :order_headers.total_rtot_db:=:order_headers.total;
⑤Item级触发器(Price和Quantity,对应修改触发金额重新初始化)
Price和Quantity下触发器WHEN-VALIDATE-ITEM:
total_lines.amount('INIT'); total_lines.running_total('WHEN-VALIDATE-ITEM');
这是获取总金额的Item,须要单独放在一个Block里面,summrary Function属性中是求和函数SUM,summarized Block中是所求和Item的Block,Summarized Item是所求和的Item
给每一行设置公式获取每一行的总金额
可能会报如图的错,解决方式