zoukankan      html  css  js  c++  java
  • FORM界面批量处理-全选框实现

    http://blog.csdn.net/cai_xingyun/article/details/17127823

    全选框实现方法多种多样,这里只介绍两种

    方法一:触发器式,优点程序简单,缺点颜色单调不突出

    1.      在数据块和控制块上分别创建check box

    2.      设置check box选中与为选中的值 Y/N和初始值

    3.  

    在数据块check box下触发器WHEN-CHECKBOX-CHANGED中调用程序

    1. PROCEDURE check_box IS  
    2.     BEGIN  
    3.         IF :HEADER.check_box = 'Y' THEN  
    4.             --:HEADER.count := 1;  
    5.             NULL;--特殊用途,可选  
    6.         ELSE  
    7.             --:HEADER.count := 0;  
    8.              NULL;  
    9.         END IF;  
    10. END check_box;  

    4.      在数据块下建立BLOCK级触发器CHECK_ALL_RECORDS调用程序

    1. PROCEDURE check_all_records IS  
    2. BEGIN  
    3.   --fnd_message.debug('PACKAGE BODY headers IS PROCEDURE check_all_records IS');  
    4.   IF :control.check_header_all = 'Y' THEN  
    5.     IF :header.check_box = 'N' OR :header.check_box IS NULL THEN  
    6.       :header.check_box := 'Y';  
    7.       --  :line.count     := 1;  
    8.     END IF;  
    9.   ELSE  
    10.     IF :header.check_box = 'Y' THEN  
    11.       :header.check_box := 'N';  
    12.       -- :line.count     := 0;  
    13.     END IF;  
    14.   END IF;  
    15.   
    16.   --fnd_message.debug('PACKAGE BODY headers IS PROCEDURE check_all_records IS');  
    17.   
    18. END check_all_records;  


     

    5.      在控制块下的check box CHECK_HEADER_ALL下建立触发器WHEN-CHECKBOX-CHANGED调用程序

    1. PROCEDURE check_header_all IS  
    2.     BEGIN  
    3.       
    4.           app_record.for_all_records('HEADER', 'CHECK_ALL_RECORDS');  
    5. END check_header_all;  

    6.      在需要处理的地方循环判断处理

    1. PROCEDURE apply IS  
    2. v_count number;  
    3. v_line_num number;  
    4. BEGIN  
    5.   go_block('HEADER'); --跳到目的数据  
    6.   first_record; --从第一条记录开始循环  
    7.   LOOP  
    8.       
    9.     IF :header.check_box = 'Y' THEN  
    10.     v_count := v_count + 1;  
    11.     --fnd_message.debug('循环处理次数');  
    12.      AP_INVOICE_LINES_ALL_PRIVATE.INSERT_ROW (X_LINE_NUM =>v_line_num,  
    13.                                                                                         P_FLAG =>'APPLY',  
    14.                                                                                         P_AMOUNT =>:header.AMOUNT);  
    15.        
    16.      AP_DISTRIBUTIONS_PRIVATE.INSERT_ROW (P_LINE_NUM =>v_line_num,  
    17.                                                                                 P_FLAG =>'APPLY',  
    18.                                                                                 P_AMOUNT =>:header.AMOUNT,  
    19.                                                                                 P_INVOICE_ID => :parameter.G_INVOICE_ID);  
    20.        
    21.      LINE_PRIVATE.insert_row (P_LINE_NUM =>v_line_num,P_FLAG =>'APPLY');  
    22.       -- :line.CURRENT_RECORD_INDICATOR := 'Y'; --将指定行的复选框设置为选中  
    23.       --  BATCH_PROCESSING. EVENT('WHEN-MOUSE-CLICK', 'LINE');  
    24.       DOCOMMIT;  
    25.     END IF;  
    26.     
    27.     EXIT WHEN :system.last_record = 'TRUE';  
    28.     
    29.     next_record;  
    30.     
    31.     END LOOP;  
    32.     --fnd_message.debug('循环处理次数-----');  
    33.   --commit;  
    34.   DOCOMMIT;  
    35.   first_record;  
    36.   go_block('HEADER');  
    37.     
    38.     :parameter.g_query_find := 'TRUE';  
    39.     app_find.find('HEADER');  
    40.     :parameter.g_query_find := 'FALSE';  
    41. END apply;  

    方法二:选中与未选中颜色不同,显示多样

    1. 在需要进行批量操作的数据块中,对于item——current_record_indicator将其项类型改为‘“复选框”。
    2. 包app_multi在库appcore中,确保有该库
    3. 根据以下列表创建trigger

    S. No

    Trigger Level

    Trigger Name

    Standard Library Call

    Form

    KEY-CLRFRM

    App_multi.event(‘KEY-CLRFRM’)

    Block

    WHEN-MOUSE-CLICK

    App_multi.event(‘WHEN-MOUSE-CLICK’)

    Block

    WHEN-NEW-RECORD-INSTANCE

    App_multi.event(‘WHEN-NEW-RECORD-INSTANCE’)

    Block

    KEY-CREREC

    App_multi.event(‘KEY-CREREC’)

    Block

    WHEN-CLEAR-BLOCK

    App_multi.event(‘WHEN-CLEAR-BLOCK’)

    Block

    PRE-BLOCK

    App_multi.event(‘PRE-BLOCK’)

    Block

    POST-BLOCK

    App_multi.event(‘POST-BLOCK’)

    Block

    KEY-DELREC

    App_multi.event(‘KEY-DELREC’)

    Block

    KEY-CLRREC

    App_multi.event(‘KEY-CLRREC’)

    Block

    DESELECT_ALL*

    App_multi.event(‘DESELECT_ALL’)

    Block

    SELECT_ALL*

    App_multi.event(‘SELECT_ALL’)

    *Note – The triggers are user defined triggers

     

    1. 在form级别下添加MULTI_RETURN_ACTION自定义trigger
    1. DECLARE  
    2. action VARCHAR2(64);  
    3. blockname VARCHAR2(30);  
    4. rec_count VARCHAR2(3);  
    5. BEGIN  
    6.      blockname := :GLOBAL.APPCORE_MULTI_BLOCK;  
    7.      action := :GLOBAL.APPCORE_MULTI_ACTION;  
    8.   
    9.   
    10. IF blockname = 'FORM-LEVEL' THEN  
    11.      IF action = 'KEY-CLRFRM' THEN  
    12.           NULL;  
    13.      END IF;  
    14.   
    15.   
    16.      ELSIF blockname = 'TRN_ORD_HEADERS_V_SUM' THEN  
    17.           IF action = 'LABEL_CHANGE' THEN  
    18.                NULL;  
    19.           ELSIF action = 'PRE-KEY-DELREC' THEN  
    20.                fnd_message.set_name('FND', 'MULTI_DELETE_RECORD');  
    21.                rec_count := TO_CHAR( app_multi.  
    22.                get_group_count('TRN_ORD_HEADERS_V_SUM'));  
    23.                fnd_message.set_token('NUM_OF_RECS', rec_count);  
    24.                IF (not fnd_message.warn) THEN  
    25.                     RAISE form_trigger_failure;  
    26.                END IF;  
    27.           ELSIF action = 'KEY-DELREC' THEN  
    28.                delete_record;  
    29.                IF NOT(FORM_SUCCESS) THEN  
    30.                     RAISE form_trigger_failure;  
    31.                END IF;  
    32.           ELSIF action = 'KEY-CLRREC' THEN  
    33.                clear_record;  
    34.                IF NOT(FORM_SUCCESS) THEN  
    35.                     RAISE form_trigger_failure;  
    36.                END IF;  
    37.           ELSIF action = 'RECORD_DESELECTED' then  
    38.                     --fnd_message.debug('deselected');  
    39.                     null;  
    40.           ELSIF action = 'RECORD_SELECTED' then  
    41.                  --fnd_message.debug('selected');  
    42.                  null;  
    43.           END IF;  
    44. ELSE  
    45. fnd_message.debug('There is no multi-select block '  
    46. || blockname ||'. Action: '||action);  
    47. END IF;  
    48. END;  

    5.    创建过程event

    1. PROCEDURE event(event_name VARCHAR2 DEFAULT 'WHEN-MOUSE-CLICK',  
    2.                   blockname  VARCHAR2 DEFAULT NULL) IS  
    3.     cursor_blk       VARCHAR2(30);  
    4.     cursor_blk_id    BLOCK;  
    5.     groupname        VARCHAR2(40);  
    6.     records_id       RECORDGROUP;  
    7.     rec_num_col_id   GROUPCOLUMN;  
    8.     anchors_id       RECORDGROUP;  
    9.     block_col_id     GROUPCOLUMN;  
    10.     anchor_col_id    GROUPCOLUMN;  
    11.     added_rec_col_id GROUPCOLUMN;  
    12.     prev_wnri_col_id GROUPCOLUMN;  
    13.     wnri_col_id      GROUPCOLUMN;  
    14.     anchors_row      INTEGER;  
    15.     new_rec          INTEGER;  
    16.     new_item         VARCHAR2(60);  
    17.     rec_count        INTEGER;  
    18.     modifier         VARCHAR2(30);  
    19.     rec_num          INTEGER;  
    20.     anchor           INTEGER;  
    21.     i        INTEGER;  
    22.     added_rec        INTEGER;  
    23.     trig_block       VARCHAR2(30);  
    24.     q_hits           INTEGER;  
    25.     multi_block      VARCHAR2(30);  
    26.   begin  
    27.     COPY('Entering app_multi.event. Event is '||event_name||'.','global.frd_debug');  
    28.     anchors_id := find_group('anchors');  
    29.     if event_name in ('KEY-CLRFRM') then  
    30.       --  
    31.       -- This is the only form-level event  
    32.       --  
    33.       if not(id_null(anchors_id)) then  
    34.         rec_count := get_group_row_count(anchors_id);  
    35.         for anchors_row in 1..rec_count LOOP  
    36.           groupname := get_group_char_cell('anchors.groupname', anchors_row);  
    37.           delete_group_row(groupname, ALL_ROWS);  
    38.           set_group_number_cell('anchors.anchor', anchors_row, 1);  
    39.           set_group_number_cell('anchors.added_rec', anchors_row, null);  
    40.           set_group_number_cell('anchors.previous_wnri_anchor', anchors_row, null);  
    41.           set_group_number_cell('anchors.wnri_anchor', anchors_row, null);  
    42.         end LOOP;  
    43.         app_multi_private.menu_refresh;  
    44.         --  
    45.         -- Developer must call app_standard.event('KEY-CLRFRM')  
    46.         --  
    47.         copy('FORM-LEVEL', 'GLOBAL.APPCORE_MULTI_BLOCK');  
    48.         copy('KEY-CLRFRM', 'GLOBAL.APPCORE_MULTI_ACTION');  
    49.         execute_trigger('MULTI_RETURN_ACTION');  
    50.       else  
    51.         app_standard.event('KEY-CLRFRM');  
    52.       end if;  
    53.     else  
    54.       --  
    55.       -- Initialize or find group and column id's  
    56.       --  
    57.       trig_block := name_in('SYSTEM.TRIGGER_BLOCK');  
    58.       multi_block := nvl(upper(blockname), trig_block);  
    59.       copy(multi_block, 'GLOBAL.APPCORE_MULTI_BLOCK');  
    60.       groupname := multi_block||'_MULTI';  
    61.   
    62.       records_id := find_group(groupname);  
    63.       if id_null(records_id) then  
    64.         records_id := create_group(groupname);  
    65.         rec_num_col_id := add_group_column(records_id, 'rec_num', NUMBER_COLUMN);  
    66.       else  
    67.         rec_num_col_id := find_column(groupname||'.rec_num');  
    68.       end if;  
    69.       --  
    70.       -- Store the select anchor in another group (use a record  
    71.       -- group to make the group specific to the form)  
    72.       --  
    73.       if id_null(anchors_id) then  
    74.         anchors_id := create_group('anchors');  
    75.         block_col_id := add_group_column(anchors_id, 'groupname', CHAR_COLUMN, 30);  
    76.         anchor_col_id := add_group_column(anchors_id, 'anchor', NUMBER_COLUMN);  
    77.         added_rec_col_id := add_group_column(anchors_id, 'added_rec', NUMBER_COLUMN);  
    78.         prev_wnri_col_id := add_group_column(anchors_id, 'previous_wnri_anchor', NUMBER_COLUMN);  
    79.         wnri_col_id := add_group_column(anchors_id, 'wnri_anchor', NUMBER_COLUMN);  
    80.         add_group_row(anchors_id, 1);  
    81.         anchors_row := 1;  
    82.         set_group_char_cell(block_col_id, anchors_row, groupname);  
    83.         set_group_number_cell(anchor_col_id, anchors_row, 1);  
    84.         set_group_number_cell(prev_wnri_col_id, anchors_row, null);  
    85.         set_group_number_cell(wnri_col_id, anchors_row, null);  
    86.       else  
    87.         block_col_id := find_column('anchors.groupname');  
    88.         anchor_col_id := find_column('anchors.anchor');  
    89.         prev_wnri_col_id := find_column('anchors.previous_wnri_anchor');  
    90.         wnri_col_id := find_column('anchors.wnri_anchor');  
    91.         anchors_row := get_group_record_number(block_col_id, groupname);  
    92.         if anchors_row = 0 then  
    93.           anchors_row := get_group_row_count(anchors_id) + 1;  
    94.           add_group_row(anchors_id, anchors_row);  
    95.           set_group_char_cell(block_col_id, anchors_row, groupname);  
    96.           set_group_number_cell(anchor_col_id, anchors_row, 1);  
    97.           set_group_number_cell(prev_wnri_col_id, anchors_row, null);  
    98.           set_group_number_cell(wnri_col_id, anchors_row, null);  
    99.         end if;  
    100.       end if;  
    101.   
    102.       cursor_blk := upper(nvl(blockname,name_in('SYSTEM.CURSOR_BLOCK')));  
    103.       cursor_blk_id := find_block(cursor_blk);  
    104.       if not id_null(cursor_blk_id) then  
    105.         new_rec := get_block_property(cursor_blk_id, CURRENT_RECORD);  
    106.       else  
    107.         new_rec := name_in('SYSTEM.CURSOR_RECORD');  
    108.         cursor_blk := name_in('SYSTEM.CURSOR_BLOCK');  
    109.       end if;  
    110.   
    111.       if event_name like 'WHEN-MOUSE-CLICK%' then  
    112.         if get_item_property(name_in('SYSTEM.TRIGGER_ITEM'), ITEM_TYPE) = 'BUTTON' then  
    113.           COPY('Completed app_multi.event. Event is '||event_name||  
    114.                '.  Return from procedure, item type is button','global.frd_debug');  
    115.           RETURN;  
    116.         end if;  
    117.         --  
    118.         -- System.mouse_button_modifiers will contain a string like  
    119.         -- 'Shift+Control+' - should be platform/language-independent.  
    120.         --  
    121.         modifier := name_in('SYSTEM.MOUSE_BUTTON_MODIFIERS');  
    122.         --  
    123.         -- In the case of Shift+Control+ we act like it's just Shift-  
    124.         --  
    125.         if ( instr(modifier, 'Shift') <> 0 ) then  
    126.                          null;  
    127.         elsif 1=1 then  
    128.           if get_record_property(new_rec, cursor_blk, status) <> 'NEW' then  
    129.       -- Determine the state of the current rec  
    130.       rec_num := get_group_record_number(rec_num_col_id, new_rec);  
    131.       if rec_num = 0 then  
    132.         app_multi_private.select_records(records_id, rec_num_col_id, new_rec);  
    133.       else  
    134.         app_record.highlight('');  
    135.         delete_group_row(records_id, rec_num);  
    136.               copy('RECORD_DESELECTED', 'GLOBAL.APPCORE_MULTI_ACTION');  
    137.               execute_trigger('MULTI_RETURN_ACTION');  
    138.         app_multi_private.menu_refresh;  
    139.         copy('LABEL_CHANGE', 'GLOBAL.APPCORE_MULTI_ACTION');  
    140.         execute_trigger('MULTI_RETURN_ACTION');  
    141.         set_group_number_cell(anchor_col_id, anchors_row,new_rec);  
    142.       end if;  
    143.     end if;  
    144.   
    145.         else -- No modifier key  
    146.           if get_group_number_cell(anchor_col_id, anchors_row) <> new_rec then  
    147.             app_multi_private.deselect_all(records_id, rec_num_col_id);  
    148.           end if;  
    149.         end if;  
    150.         set_group_number_cell(anchor_col_id, anchors_row, new_rec);  
    151.         set_group_number_cell(prev_wnri_col_id, anchors_row, null);  
    152.   
    153.       elsif event_name = 'WHEN-NEW-RECORD-INSTANCE' then  
    154.         set_group_number_cell(prev_wnri_col_id, anchors_row,  
    155.                               get_group_number_cell(wnri_col_id, anchors_row));  
    156.         set_group_number_cell(wnri_col_id, anchors_row, new_rec);  
    157.       elsif event_name = 'KEY-CREREC' then  
    158.         app_multi_private.deselect_all(records_id, rec_num_col_id);  
    159.         -- Developer must call create_record;  
    160.       elsif event_name = 'WHEN-CLEAR-BLOCK' then  
    161.         app_multi.clear_group(multi_block);  
    162.       --elsif event_name = 'KEY-F2' then  
    163.       --  app_multi.event('WHEN-MOUSE-CLICK.Shift+',blockname);  
    164.       --elsif event_name = 'KEY-F3' then  
    165.       --  app_multi.event('WHEN-MOUSE-CLICK.Control+',blockname);  
    166.       elsif event_name = 'DESELECT_ALL' then  
    167.         app_multi_private.deselect_all(records_id, rec_num_col_id);  
    168.       elsif event_name = 'SELECT_ALL' then  
    169.         app_multi_private.select_all(records_id, rec_num_col_id);  
    170.       elsif event_name in ('POST-BLOCK', 'PRE-BLOCK') then  
    171.         app_multi_private.menu_refresh(event_name);  
    172.       elsif event_name in ('KEY-DELREC', 'KEY-CLRREC') then  
    173.         app_multi_private.action(records_id, event_name, multi_block);  
    174.         app_multi.clear_group(multi_block);  
    175.       else  
    176.         app_multi_private.action(records_id, event_name,  
    177.                                  nvl(blockname, cursor_blk));  
    178.       end if;  
    179.     end if;  
    180.     COPY('Completed app_multi.event. Event is '||event_name||'.','global.frd_debug');  
    181.   EXCEPTION  
    182.     WHEN OTHERS THEN  
    183.       set_application_property(CURSOR_STYLE, 'DEFAULT');  
    184.   END event;  

    6.创建函数get_group_count

    1. FUNCTION get_group_count(blockname VARCHAR2)  
    2.     RETURN NUMBER IS  
    3.     groupid   RECORDGROUP;  
    4.     rec_count INTEGER;  
    5.   BEGIN  
    6.     COPY('Entering app_multi.get_group_count.','global.frd_debug');  
    7.     groupid := find_group(blockname||'_MULTI');  
    8.     if id_null(groupid) then  
    9.       fnd_message.debug('DEVELOPER ERROR: Invalid blockname '||blockname  
    10.         ||' in app_multi.get_group_count');  
    11.     end if;  
    12.     rec_count := get_group_row_count(groupid);  
    13.     if rec_count = 0 then  
    14.       --COPY('Completed app_multi.get_group_count.  RETURN 1.','global.frd_debug');  
    15.       return 0;  
    16.     else  
    17.       COPY('Completed app_multi.get_group_count.RETURN rec_count.','global.frd_debug');  
    18.       return rec_count;  
    19.     end if;  
    20.   END get_group_count;  

    7.在要进行批量操作的数据块下的current_record_indicator添加when-checkbox-changed

        调用过程event

     

    8.创建按钮,添加按钮的when-button-pressed

      1. DECLARE  
      2.      l_num_group_count NUMBER;  
      3.   l_grp_group_col_id GROUPCOLUMN;  
      4.   l_num_rec_num NUMBER;  
      5.   l_chr_current_block VARCHAR2(80);  
      6.   
      7.   
      8.   --l_num_hike_percent NUMBER;  
      9. BEGIN  
      10.   l_chr_Current_Block := :GLOBAL.APPCORE_MULTI_BLOCK;  
      11.   GO_BLOCK(l_chr_Current_Block);  
      12.   l_num_group_count  := Get_Group_Count(l_chr_Current_Block);  
      13.  -- fnd_message.debug('count=' || l_num_group_count);  
      14.   if l_num_group_count > 0 then  
      15.        l_grp_Group_Col_Id := App_Multi.Get_Group_Col(l_chr_Current_Block);  
      16.   
      17.      For i IN 1..l_num_group_count  
      18.           LOOP  
      19.                l_num_Rec_Num := Get_Group_Number_Cell(l_grp_Group_Col_Id,i);  
      20.                         GO_RECORD(l_num_Rec_Num);  
      21.                         fnd_message.debug('--' || name_in(l_chr_Current_Block||'.order_number'));   
      22.                          --在这里循环选中的record,对其进行自己的逻辑  
      23.                                    --     Copy (TO_CHAR(TO_NUMBER(name_in(l_chr_Current_Block || ‘.SALARY’) * (1 + l_num_hike_percent ))), l_chr_Current_Block || ‘.SALARY’);  
      24.           END LOOP;  
      25.     end if;  
      26. EXCEPTION  
      27. WHEN invalid_number THEN  
      28.      Fnd_message.debug ('Invalid Number format exception: Please Check the name of the button. The format is HIKE_PERCENT_<percentage>');  
      29. END;  
  • 相关阅读:
    批量修改文件名
    查看数据库版本及当前登录用户是什么?
    安装mysql5.5时候的报错解决办法:
    mysql.sock的作用
    Linux系统编程15_C函数总结
    Linux系统编程14_信号和进程状态
    Linux系统编程13_CoreDump
    Linux系统编程12_标准库和POSIX标准头文件
    gcc使用
    http长链接短链接
  • 原文地址:https://www.cnblogs.com/xiaoL/p/5038362.html
Copyright © 2011-2022 走看看