zoukankan      html  css  js  c++  java
  • 客户化Form中实现行号功能

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

    这个行号的特点是:

    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过程的列子:

    --
    -- Name
    --    line_num
    -- Purpose
    --    ORD_HEADER: 单据的头数据块
    --    ORD_LINE:行号所属的数据块
    --    CUX_OM_ORDER_PKG.get_max_line_num:根据头ID取得数据库中单据的最大行号
    --    CUX_ENTER_UNIQUE_LINE_NUM:消息字典:请输入唯一行号
    --    CUX_ALL_ENTER_VALUE_GT_ZERO:消息字典:请输入大于0的值
    --
    PROCEDURE line_num(event VARCHAR2) IS
      l_line_num_count NUMBER;
    BEGIN
      IF (event = 'WHEN-VALIDATE-ITEM') THEN
        IF :ord_line.line_num <= 0 THEN
          fnd_message.set_name('CUX', 'CUX_ALL_ENTER_VALUE_GT_ZERO');
          fnd_message.error;
          RAISE form_trigger_failure;
        END IF;
      
        -- check the unique line number from DB
        IF cux_om_order_pkg.check_line_number_exists(name_in('ORD_HEADER.HEADER_ID'),
                                                     name_in('ORD_LINE.LINE_NUM')) THEN
          fnd_message.set_name('CUX', 'CUX_ENTER_UNIQUE_LINE_NUM');
          fnd_message.error;
          RAISE form_trigger_failure;
        END IF;
      
      ELSIF (event = 'WHEN-CREATE-RECORD') THEN
        :ord_line.line_num := :parameter.max_line_num + 1;
      ELSIF (event = 'PRE-QUERY') THEN
        -- get the maximums line number from the DB
        :parameter.max_line_num := cux_om_order_pkg.get_max_line_num(name_in('ORD_HEADER.HEADER_ID'));
      ELSIF (event = 'WHEN-VALIDATE-RECORD') THEN
      
        IF :ord_line.line_num >= :parameter.max_line_num THEN
          :parameter.max_line_num := :ord_line.line_num;
        END IF; --if :ord_line.line_num >= :parameter.max_line_num then
      
      ELSIF event = 'WHEN-NEW-RECORD-INSTANCE' THEN
        
        IF upper(get_block_property('ORD_LINE', status)) = upper('NEW') AND
           :system.mode <> 'ENTER-QUERY' THEN
          :parameter.max_line_num := cux_om_order_pkg.get_max_line_num(name_in('ORD_HEADER.HEADER_ID'));
          line_num('WHEN-CREATE-RECORD');
        
          --当前记录行状态设为NEW
          set_record_property(get_block_property('ORD_LINE', current_record),
                              'ORD_LINE',
                              status,
                              new_status);
        
        END IF; --IF upper(get_block_property('ORD_LINE', status)) = upper('NEW') AND
      
      ELSE
        app_exception.invalid_argument('LINE_NUM', 'EVENT', event);
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE;
    END line_num;

    各触发器的HANDLER:

    PROCEDURE when_create_record IS
    BEGIN
      IF :ord_header.project_number IS NOT NULL THEN --判断主块上是否存在值
        line_num('WHEN-CREATE-RECORD');
      END IF;
    END when_create_record;
    
    PROCEDURE when_new_record_instance IS
    BEGIN
      line_num('WHEN-NEW-RECORD-INSTANCE');
    END when_new_record_instance;
    
    PROCEDURE when_validate_record IS
    BEGIN
      line_num('WHEN-VALIDATE-RECORD');
    END when_validate_record;
    
    PROCEDURE pre_query IS
    BEGIN
      line_num('PRE-QUERY');
    END pre_query;

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

  • 相关阅读:
    向linux内核中添加外部中断驱动模块
    uboot中添加FIQ中断及相关问题
    访问内存中一个绝对地址
    ftp & tftp & vsftpd
    selinux基础
    ssh & screen
    Python自动化测试-unittest
    firewalld基础
    oracle体系结构-逻辑存储结构
    Oracle体系结构
  • 原文地址:https://www.cnblogs.com/Cqiang/p/2936675.html
Copyright © 2011-2022 走看看