ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 客户化Form中实现行号功能

客户化Form中实现行号功能

原创 Linux操作系统 作者:blueshine07 时间:2012-08-31 10:36:20 0 删除 编辑

转自:http://oracleseeker.com/2009/08/18/add_automatic_increase_line_number_functionality_in_oracle_ebs_form/

在客户化Form开发中,经常会遇到需要给表格的记录块添加一个行号,行号不但作为数据行的一个序号,同时经常被作为单击的行标识,具有比较重要的业务意义。

form_line_num

这个行号的特点是:

  1. 新增行时自动生成默认行号:已有的最大行号+1
  2. 用户可以修改行号为合法的数字:大于0;保证唯一
  3. 如果用户修改了行号,新增生成的行号必须在用户修改行号的基础上+1

 

实现这样的行号相对比较麻烦,下面描述如何来实现上图中所示的行号功能:

  1. 在记录块的PRE-QUERY中查询出数据库中已有的最大行号,并将其记录到参数中作为最大的行号,如果单据的头是新建的,那这个参数默认的最大值则为1
  2. 在行记录的WHEN-CREATE-RECORD中将最大行号的参数值+1赋给行号字段
  3. 行号数据项的WHEN-VALIDATE-ITEM中检查行号是否<0;同时检查行号在数据库中是否存在(对于同时录入多行相同的行号在这个触发器中无需处理)
  4. 在WHEN-NEW-RECORD-INSTANCE中检查如果块的状态是NEW,从数据库中获取最大的行号,并设置行号
  5. 在WHEN-VALIDATE-RECORD中判断当前的行号是否大于参数中的最大行号,如果是则覆盖参数的最大行号

下面是将上面的代码按照HANDLER机制包装为LINE_NUM过程的列子:


procedure line_num ( event varchar2) is
  l_line_num_count number;
begin
  if ( event = 'WHEN-VALIDATE-ITEM') then
	if :lines.line_number <= 0 then
	  fnd_message.set_name('XHU','XHU_ALL_ENTER_VALUE_GT_ZERO');
	  fnd_message.error;
	  raise form_trigger_failure;
	end if;
	-- check the unique line number from DB
	if xhu_orders_sv.po_line_num_exists(name_in('headers.header_id'),name_in('lines.line_number')) then
	  fnd_message.set_name('XUH','XHU_ENTER_UNIQUE_LINE_NUM');
	  fnd_message.error;
	  raise form_trigger_failure;
	end if;
	elsif (event = 'WHEN-CREATE-RECORD') then
	  :lines.line_number := :parameter.max_line_num + 1;
	elsif (event = 'PRE-QUERY') then
	  -- get the maximums line number from the DB
	  :parameter.max_line_num := xhu_orders_sv.get_max_line_num(name_in('headers.header_id'));
	elsif (event = 'WHEN-VALIDATE-RECORD') then
	  if :lines.line_number > :parameter.max_line_num then
		:parameter.max_line_num := :lines.line_number ;
	  end if;
	elsif (event = 'WHEN-NEW-RECORD-INSTANCE')then
	if upper(get_block_property('lines',status)) = upper('NEW')  and :System.Mode <> 'ENTER-QUERY' then
	  :parameter.max_line_num := xhu_orders_sv.get_max_line_num(name_in('headers.header_id'));
	  line_num('WHEN-CREATE-RECORD');
	  SET_RECORD_PROPERTY(get_block_property('lines',current_record), 'lines', STATUS, NEW_STATUS );
	end if;
  else
	  APP_EXCEPTION.INVALID_ARGUMENT('LINE_NUMBER', 'EVENT', EVENT);
  end if;
exception
	when others THEN
	   	raise;
end line_num;
--headers:单据的头数据块
--lines:行号所属的数据块
--xhu_orders_sv.get_max_line_num:根据头ID取得数据库中单据的最大行号
--XHU_ENTER_UNIQUE_LINE_NUM:消息字典:请输入唯一行号
--XHU_ALL_ENTER_VALUE_GT_ZERO:消息字典:请输入大于0的值



触发器handler
procedure when_create_record is
begin
  lines.line_num('WHEN-CREATE-RECORD');
end when_create_record;
procedure when_new_record_instance is
begin
  lines.line_num('WHEN-NEW-RECORD-INSTANCE');
end when_new_record_instance;
procedure when_validate_record is
begin
  lines.line_num('WHEN-VALIDATE-RECORD');
end when_validate_record;
procedure pre_query is
begin
  lines.line_num('PRE-QUERY');
end pre_query;

添加一个MAX_LINE_NUM(NUMBER)的参数来保存当前最大行号的值

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25103190/viewspace-742325/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 设置日期范围
下一篇: BLOG声明
请登录后发表评论 登录
全部评论

注册时间:2011-08-26

  • 博文量
    55
  • 访问量
    151013