我是靠谱客的博主 聪慧嚓茶,最近开发中收集的这篇文章主要介绍From数据块记录多行选中 开发方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

前言:

用户多选的操作应该是必须的,目的是为了提高User的操作效率。

首先说明的是,我这里的多选开发和标准的多选开发是不一样的,我这里的多选开发还是在Block前面加个勾选框。

个人觉得加个勾选框可能更加实用,而且不容易误操作(我用标准的发运画面的时候,就经常由于鼠标多点了一下,之前多选的行都被取消了。。。)。

 

这里我将多选的核心逻辑写在一个公用的Pll(XYGPUBCORE.pll)里面。哪个Form需要用到这个功能,只需要调用里面的pkg即可实现。

这样子开发的效率会大大提高。也很简单可以实现多选勾中的效果。

Pll的核心代码下面会贴出来。

 

1.       从服务器下载Pll

如果你的电脑没有XYGPUBCORE.pll,则首先要从服务器下载XYGPUBCORE.pll到本地的Form Resource目录。

服务器Resource目录:$AU_TOP/resource/

我的本地Form Resource目录:D:DevSuiteHome_1XYG Oracle Resource

 

2.       在Form中加载Pll文件。

然后打开您要实现批量选中的的Form文件,将XYGPUBCORE.pll加载到您的Form里面。

加载之后,记得选择Remove path = Yes

 

3.       在勾选框的WHEN-CHECKBOX-CHANGED增加代码:

特别要注意的是,最好实现勾选高亮的效果。另外,为了让User知道自己的操作情况,最好增加User选中的行数以及选择的数量等信息框显示。

If :XYG_MANUFACTURE_NEED.CHK = 'Y' Then

          :XYG_MANUFACTURE_NEED.CHK_NUMBER := 1;--选中多少行

   app_record.highlight(PROPERTY_ON);--选中高亮

          :XYG_MANUFACTURE_NEED.WIP_JOB_QUANTITY_CHK := :XYG_MANUFACTURE_NEED.WIP_JOB_QUANTITY;--选中数量

Else

          :XYG_MANUFACTURE_NEED.CHK_NUMBER := 0; --选中多少行

   app_record.highlight(PROPERTY_OFF); --取消选中高亮

          :XYG_MANUFACTURE_NEED.WIP_JOB_QUANTITY_CHK := 0; --选中数量

End If;      

效果如下图所示:

 

 

4.       增加2个必须的参数。

参数名称可以自己定义,因为后面它们是作为一个参数输入pkg的:

上一次选中的行,类型NUMBER:LAST_CLICK_RECORD

本次选中的行,类型NUMBER:CURR_CLICK_RECORD

 

5.       在Block级增加触发器:WHEN-MOUSE-CLICK

代码:

XYG_MULTI_SEL_PKG.WHEN_CHECKED('XYG_MANUFACTURE_NEED.CHK'

                               ,'Y'

                               ,'N'

                               ---

                               ,'PARAMETER.LAST_CLICK_RECORD'

                               ,'PARAMETER.CURR_CLICK_RECORD'

                               );

参数说明:

         PROCEDURE WHEN_CHECKED(P_CHECKBOX_ITEM IN VARCHAR2 ---复选框按钮,如:'XYG_MANUFACTURE_NEED.CHK'

                               ,P_CHECK_VALUE IN VARCHAR2 ---选中按钮的时候,它的值,如:'Y'

                               ,P_UNCHECK_VALUE IN VARCHAR2 ---不选按钮的时候,它的值,如:'N'

                               ---

                               ,P_PARA_LAST_ITEM IN VARCHAR2 --上次选中的行的参数 'PARAMETER.LAST_CLICK_RECORD'

                               ,P_PARA_CURR_ITEM IN VARCHAR2 --本次选中的行的参数 'PARAMETER.CURR_CLICK_RECORD'

                               );

 

6.       多选的效果:

下面的画面,如果想要批量选择:需求ID12050200026~12050200041

鼠标选点到:12050200026

然后同时按下Shift按键,选中12050200041行。

同理,如果按下Ctrl按键,是单行的选择。

如果对于已经选中的行,做重复的Shift或者Ctrl选择,则是取消复选框。

 

7.       后期的数据处理

对于勾选的行,如果每次处理都要Loop整个Block,速度可能会很慢。

所以,现在的想法是,每次勾上Item,将核心的行标识数据(例如行ID等)塞到一个临时的表变量。

然后,后期的批量处理就针对表变量Loop一下,就可以了。

对表格的Loop比在Block里面Loop,那速度是快得多的。

具体实现:

在勾选框增加:

触发器:WHEN-CHECKBOX-CHANGED

代码如下图。核心代码:

XYG_MULTI_SEL_PKG.INSERT_TEMP_RECORD(:SYSTEM.CURSOR_RECORD,:XYG_MANUFACTURE_NEED.NEED_ID,NULL,NULL);

XYG_MULTI_SEL_PKG.DELETE_TEMP_RECORD(:SYSTEM.CURSOR_RECORD);

另外,为了方便调试,我增加了2个很有用的Procedure

1) 显示User勾选的行明细:XYG_MULTI_SEL_PKG.SHOW_TEMP_RECORD;

2) 初始化(清空)临时变量表:XYG_MULTI_SEL_PKG.CLEAR_TEMP_RECORD;

另外,用这个方法抓用户勾选的行,有几点必须注意的:

1)       当用户清除行或者删除行的时候,必须要将对应的表格的行删除掉。否则抓取数据会有问题。

2)       用户点全选按钮或者不选按钮的时候,要增加这个逻辑。直接用Pll里面的全选(反选)功能就可以实现了。

3)       当用户对这个Block重新查询或者别的刷新动作的时候,必须要初始化临时变量表。

4)       当一个Form2个或者2个以上的Block需要用到多选功能的时候,只有1个块可以用这个方法找数据。

5)       Form的数据有变动,没更新到数据库的时候,必须要提交Form的变更,再在后台处理(要注意)

效果:

测试,当清空临时表:

 

但是发现了一个问题:当在对应的PKG(XYG_MULTI_SEL_PKG)之外要处理这些数据的时候,就用不到,所以只能再用一个临时表作为中介。方便不同地方要调用用户所勾选的数据。

将用户勾选的数据一次性塞到临时表:XYG_MULTI_SEL_PKG.INSERT_TEMP_TABLE('XYG_MANUFACTURE_NEED');

实际调用的例子:

DECLARE

     V_SHOW_MESSAGE VARCHAR2(30000);

 BEGIN

           XYG_MULTI_SEL_PKG.INSERT_TEMP_TABLE('XYG_MANUFACTURE_NEED');

     V_SHOW_MESSAGE := '您选中的行信息如下:';

     FOR SELECT_REC IN (SELECT ATTRIBUTE1 Record_Number

,ATTRIBUTE2 TABLE_REC_ID

,ATTRIBUTE3 TABLE_REC_CODE

,ATTRIBUTE4 TABLE_REC_DESC

                          FROM XYG_PUB_COMMON_TABLE_TEMP

                          ORDER BY TO_NUMBER(ATTRIBUTE1)

                          ) LOOP

            BEGIN

             V_SHOW_MESSAGE := SUBSTRB(V_SHOW_MESSAGE || CHR(10)||'行号:'||SELECT_REC.Record_Number

                                                        ||'行标识:'||SELECT_REC.TABLE_REC_ID

                                                        ||'行代码:'||SELECT_REC.TABLE_REC_CODE,1,30000);

            END;

           

     END LOOP;

     FND_MESSAGE.DEBUG(V_SHOW_MESSAGE);

  END;

 

实现效果:

 

8.       全选/全不选/反选这3个功能的Pll集成。

这个的作用是,方便开发人员开发这3个功能。基本的代码都集成在Pll里面,开发人员只需要调用这个pll就可以实现这3大常用的功能。

对应的过程:XYG_MULTI_SEL_PKG. AUTO_MULTI_CHECK

参数说明:

  procedure  AUTO_MULTI_CHECK(P_CHECKBOX_ITEM IN VARCHAR2 ---复选框按钮,如:'XYG_MANUFACTURE_NEED.CHK'

                               ,P_CHECK_VALUE IN VARCHAR2 ---选中按钮的时候,它的值,如:'Y'

                               ,P_UNCHECK_VALUE IN VARCHAR2 ---不选按钮的时候,它的值,如:'N'

                               ---

                               ,P_MULTI_CHECK_TYPE IN VARCHAR2 --多选择的类型:全选CHECK_ALL/全不选UNCHECK_ALL/反选INVERSE_CHECK

                               );

调用例子:

If Get_Item_Property('MDS_CONTROL.CHK_SEL',LABEL) = '全选' Then

   XYG_MULTI_SEL_PKG.AUTO_MULTI_CHECK('XYG_MANUFACTURE_NEED.CHK','Y','N','CHECK_ALL');

   Set_Item_Property('MDS_CONTROL.CHK_SEL',LABEL,'反选');

Else

   XYG_MULTI_SEL_PKG.AUTO_MULTI_CHECK('XYG_MANUFACTURE_NEED.CHK','Y','N','UNCHECK_ALL');

   Set_Item_Property('MDS_CONTROL.CHK_SEL',LABEL,'全选');

End If;

 

效果(略)。

 

-------------------------------------------------------------------------------------------

核心Pll代码:

PACKAGE XYG_MULTI_SEL_PKG IS
   ---Form多选的临时表变量 2012.9.10 new add
   TYPE MULTI_SEL_Rec_Type   IS RECORD
   (
     Record_Number  NUMBER
   , TABLE_REC_ID             NUMBER
   , TABLE_REC_CODE       VARCHAR2(240)
   , TABLE_REC_DESC       VARCHAR2(4000)
      );

    TYPE MULTI_SEL_Tbl_Type IS TABLE OF MULTI_SEL_Rec_Type
    INDEX BY BINARY_INTEGER ;
   
  L_MULTI_SEL_TBL MULTI_SEL_Tbl_Type;
  n number:= 0;
  procedure  WHEN_CHECKED(P_CHECKBOX_ITEM IN VARCHAR2 ---复选框按钮,如:'XYG_MANUFACTURE_NEED.CHK'
                       ,P_CHECK_VALUE IN VARCHAR2 ---选中按钮的时候,它的值,如:'Y'
                       ,P_UNCHECK_VALUE IN VARCHAR2 ---不选按钮的时候,它的值,如:'N'
                       ---
                       ,P_PARA_LAST_ITEM IN VARCHAR2 --上次选中的行 'PARAMETER.LAST_CLICK_RECORD'
                       ,P_PARA_CURR_ITEM IN VARCHAR2 --本次选中的行 'PARAMETER.CURR_CLICK_RECORD'
                       );
  procedure  AUTO_MULTI_CHECK(P_CHECKBOX_ITEM IN VARCHAR2 ---复选框按钮,如:'XYG_MANUFACTURE_NEED.CHK'
                       ,P_CHECK_VALUE IN VARCHAR2 ---选中按钮的时候,它的值,如:'Y'
                       ,P_UNCHECK_VALUE IN VARCHAR2 ---不选按钮的时候,它的值,如:'N'
                       ---
                       ,P_MULTI_CHECK_TYPE IN VARCHAR2 --多选择的类型:全选CHECK_ALL/全不选UNCHECK_ALL/反选INVERSE_CHECK
                       );
 PROCEDURE CLEAR_TEMP_RECORD;
  PROCEDURE INSERT_TEMP_RECORD(P_Record_Number IN NUMBER,P_TABLE_REC_ID IN NUMBER,P_TABLE_REC_CODE IN VARCHAR2,P_TABLE_REC_DESC IN VARCHAR2);
 PROCEDURE DELETE_TEMP_RECORD(P_Record_Number IN NUMBER);
 PROCEDURE SHOW_TEMP_RECORD;
 PROCEDURE INSERT_TEMP_TABLE(P_BLOCK IN VARCHAR2);
END;

 

 

 

PACKAGE BODY XYG_MULTI_SEL_PKG IS
 PROCEDURE WHEN_CHECKED(P_CHECKBOX_ITEM IN VARCHAR2 ---复选框按钮,如:'XYG_MANUFACTURE_NEED.CHK'
                       ,P_CHECK_VALUE IN VARCHAR2 ---选中按钮的时候,它的值,如:'Y'
                       ,P_UNCHECK_VALUE IN VARCHAR2 ---不选按钮的时候,它的值,如:'N'
                       ---
                       ,P_PARA_LAST_ITEM IN VARCHAR2 --上次选中的行 'PARAMETER.LAST_CLICK_RECORD'
                       ,P_PARA_CURR_ITEM IN VARCHAR2 --本次选中的行 'PARAMETER.CURR_CLICK_RECORD'
                       )
 IS
     --,P_SHIFT_ENTER_ITEM IN VARCHAR2 --上次是否有点SHIFT的标识参数 'PARAMETER.SHIFT_ENTER'
    L_CHECKBOX_ITEM VARCHAR2(100);
    L_PARA_LAST_ITEM VARCHAR2(100);
    L_PARA_CURR_ITEM VARCHAR2(100);
    L_CURR_CLICK_RECORD NUMBER;
    L_LAST_CLICK_RECORD NUMBER;
    TEMP           NUMBER; -- Use to change the value of last_click_record and curr_click_record as needed.
    L_CURSOR_RECORD NUMBER;
     V_PROCESS_PHASE NUMBER;                                 --标识程序的进度
     L_PREVERSE_MULTI VARCHAR2(1); --是否进行反向选了。
 BEGIN
   V_PROCESS_PHASE := 0;
   L_CHECKBOX_ITEM := P_CHECKBOX_ITEM;
   L_PARA_LAST_ITEM := P_PARA_LAST_ITEM;
   L_PARA_CURR_ITEM := P_PARA_CURR_ITEM;
   --L_PARA_SHIFT_ITEM := P_SHIFT_ENTER_ITEM;---标识是否有点Shift按键
   L_CURSOR_RECORD := NAME_IN('SYSTEM.CURSOR_RECORD');
   -----
   V_PROCESS_PHASE := 1;
   -----
    IF NAME_IN ('SYSTEM.MOUSE_BUTTON_MODIFIERS') IS NULL THEN
      --FND_MESSAGE.DEBUG(L_CURSOR_RECORD||'-'||L_PARA_LAST_ITEM);
       COPY(L_CURSOR_RECORD,L_PARA_LAST_ITEM);
     V_PROCESS_PHASE := 2;
       --COPY('N',L_PARA_SHIFT_ITEM);
      --:PARAMETER.LAST_CLICK_RECORD := :SYSTEM.CURSOR_RECORD;
    ELSIF NAME_IN ('SYSTEM.MOUSE_BUTTON_MODIFIERS') = 'Shift+' THEN
      COPY(L_CURSOR_RECORD,L_PARA_CURR_ITEM);
      --:PARAMETER.CURR_CLICK_RECORD := :SYSTEM.CURSOR_RECORD;
      L_LAST_CLICK_RECORD := NAME_IN(L_PARA_LAST_ITEM);
      L_CURR_CLICK_RECORD := NAME_IN(L_PARA_CURR_ITEM);
     V_PROCESS_PHASE := 3;
           
      --fnd_message.debug('last_click_record=' || L_last_click_record ||CHR(10)|| 'curr_click_record=' || L_curr_click_record);
       IF L_LAST_CLICK_RECORD IS NOT NULL
      AND L_CURR_CLICK_RECORD IS NOT NULL
      AND NAME_IN ('SYSTEM.MOUSE_BUTTON_MODIFIERS') = 'Shift+' THEN
          ---反向多选
          IF L_LAST_CLICK_RECORD > L_CURR_CLICK_RECORD THEN
             --IF  NAME_IN(L_PARA_SHIFT_ITEM) = 'Y' THEN
             --   L_LAST_CLICK_RECORD := NAME_IN(L_PARA_LAST_ITEM)-1;
                --fnd_message.debug('L_LAST_CLICK_RECORD=' || L_LAST_CLICK_RECORD );
             --END IF;
             TEMP := L_CURR_CLICK_RECORD;
             L_CURR_CLICK_RECORD := L_LAST_CLICK_RECORD;
             L_LAST_CLICK_RECORD := TEMP;
             L_PREVERSE_MULTI := 'Y';
          ELSE
             L_PREVERSE_MULTI := 'N';
          END IF;
         V_PROCESS_PHASE := 4;
         --fnd_message.debug('last_click_record=' || L_last_click_record ||CHR(10)|| 'curr_click_record=' || L_curr_click_record);
 
          GO_RECORD (L_LAST_CLICK_RECORD);
 
          FOR I IN L_LAST_CLICK_RECORD .. L_CURR_CLICK_RECORD LOOP
             --PT_TEMP_RECORD.INSERT_TEMP_RECORD ('CUX_PFM_PRODTEAM_HEADERS',:PT_HEADERS.HEADER_ID);
             IF CHECKBOX_CHECKED (L_CHECKBOX_ITEM) THEN
               COPY(P_UNCHECK_VALUE,L_CHECKBOX_ITEM);
               --app_record.highlight('');
             ELSE
               COPY(P_CHECK_VALUE,L_CHECKBOX_ITEM);
               --APP_RECORD.HIGHLIGHT ('SELECTED_DATA');
             END IF;
             GO_ITEM(L_CHECKBOX_ITEM);
             execute_trigger('WHEN-CHECKBOX-CHANGED');
             EXIT WHEN NAME_IN('SYSTEM.LAST_RECORD') = 'TRUE';
             NEXT_RECORD;
          END LOOP;
          --IF L_CURR_CLICK_RECORD - L_LAST_CLICK_RECORD >= 1 THEN
             --PREVIOUS_RECORD;
          --END IF;
          --COPY(L_CURSOR_RECORD+1,L_PARA_LAST_ITEM);
          IF L_PREVERSE_MULTI = 'Y' AND L_LAST_CLICK_RECORD >=2 THEN
            GO_RECORD (L_LAST_CLICK_RECORD-1);
          END IF;
         
          COPY(NAME_IN('SYSTEM.CURSOR_RECORD'),L_PARA_LAST_ITEM);
         --L_SHIFT_ENTER := 'Y';
           --COPY('Y',L_PARA_SHIFT_ITEM);
         V_PROCESS_PHASE := 5;
       END IF;
    ELSIF NAME_IN ('SYSTEM.MOUSE_BUTTON_MODIFIERS') = 'Control+' THEN
        IF CHECKBOX_CHECKED (L_CHECKBOX_ITEM) THEN
          COPY(P_UNCHECK_VALUE,L_CHECKBOX_ITEM);
          --app_record.highlight('');
        ELSE
          COPY(P_CHECK_VALUE,L_CHECKBOX_ITEM);
          --APP_RECORD.HIGHLIGHT ('SELECTED_DATA');
        END IF;
        GO_ITEM(L_CHECKBOX_ITEM);
        execute_trigger('WHEN-CHECKBOX-CHANGED');
      V_PROCESS_PHASE := 6;
    END IF;
   V_PROCESS_PHASE := 7;
 EXCEPTION
     WHEN OTHERS THEN
     FND_MESSAGE.DEBUG('XYG多选处理出现异常情况,错误信息:'||CHR(10)||SQLCODE||'-'||SQLERRM||CHR(10)||'程序进度:'||V_PROCESS_PHASE);
     RETURN;
 END WHEN_CHECKED;
 
  procedure  AUTO_MULTI_CHECK(P_CHECKBOX_ITEM IN VARCHAR2 ---复选框按钮,如:'XYG_MANUFACTURE_NEED.CHK'
                       ,P_CHECK_VALUE IN VARCHAR2 ---选中按钮的时候,它的值,如:'Y'
                       ,P_UNCHECK_VALUE IN VARCHAR2 ---不选按钮的时候,它的值,如:'N'
                       ---
                       ,P_MULTI_CHECK_TYPE IN VARCHAR2 --多选择的类型:全选CHECK_ALL/全不选UNCHECK_ALL/反选INVERSE_CHECK
                       )
  IS
    l_block varchar2(300);
     V_PROCESS_PHASE NUMBER;                                 --标识程序的进度
     L_CHECKBOX_ITEM_ID ITEM;
  BEGIN
     V_PROCESS_PHASE := 0;
     L_CHECKBOX_ITEM_ID := FIND_ITEM(P_CHECKBOX_ITEM);
   Select XYG_PUB_COMMON_PKG.GET_CHAR_POSITION_CONTENT(P_CHECKBOX_ITEM,'.',1)
     Into l_block
     from dual;
   V_PROCESS_PHASE := 1;
   Go_Block(l_block);
  First_Record;
  Loop
    IF P_MULTI_CHECK_TYPE = 'CHECK_ALL' THEN
     IF CHECKBOX_CHECKED (L_CHECKBOX_ITEM_ID) THEN
      NULL;
     ELSE
      COPY(P_CHECK_VALUE,P_CHECKBOX_ITEM);
        GO_ITEM(L_CHECKBOX_ITEM_ID);
        execute_trigger('WHEN-CHECKBOX-CHANGED');
     END IF;
    ELSIF  P_MULTI_CHECK_TYPE = 'UNCHECK_ALL' THEN
     IF CHECKBOX_CHECKED (L_CHECKBOX_ITEM_ID) THEN
      COPY(P_UNCHECK_VALUE,P_CHECKBOX_ITEM);
        GO_ITEM(L_CHECKBOX_ITEM_ID);
        execute_trigger('WHEN-CHECKBOX-CHANGED');
     ELSE
       NULL;
     END IF;
     CLEAR_TEMP_RECORD;
    ELSIF  P_MULTI_CHECK_TYPE = 'INVERSE_CHECK' THEN
         IF CHECKBOX_CHECKED (L_CHECKBOX_ITEM_ID) THEN
           COPY(P_UNCHECK_VALUE,P_CHECKBOX_ITEM);
         ELSE
           COPY(P_CHECK_VALUE,P_CHECKBOX_ITEM);
         END IF;
        GO_ITEM(L_CHECKBOX_ITEM_ID);
        execute_trigger('WHEN-CHECKBOX-CHANGED');
    END IF;
   Exit When NAME_IN('SYSTEM.LAST_RECORD')='TRUE';
   Next_Record;
  End Loop;
   First_Record;
    
     V_PROCESS_PHASE := 2;
 EXCEPTION
     WHEN OTHERS THEN
     FND_MESSAGE.DEBUG('XYG自动选处理出现异常情况,错误信息:'||CHR(10)||SQLCODE||'-'||SQLERRM||CHR(10)||'程序进度:'||V_PROCESS_PHASE);
     RETURN;
  END;
 

  PROCEDURE CLEAR_TEMP_RECORD
  IS
  BEGIN
     L_MULTI_SEL_TBL.DELETE;
     N := 0;
     --L_MULTI_SEL_TBL.INITIAL;
     --L_MULTI_SEL_TBL.CLEAR;
  END;
 
  PROCEDURE INSERT_TEMP_RECORD(P_Record_Number IN NUMBER,P_TABLE_REC_ID IN NUMBER,P_TABLE_REC_CODE IN VARCHAR2,P_TABLE_REC_DESC IN VARCHAR2)
  IS
     --L_MULTI_SEL_Rec   XYG_PUB_COMMON_PKG.MULTI_SEL_Rec_Type;
     --L_MULTI_SEL_TBL    XYG_PUB_COMMON_PKG.MULTI_SEL_Tbl_Type;
  BEGIN
     L_MULTI_SEL_TBL(P_Record_Number).Record_Number := P_Record_Number;
     L_MULTI_SEL_TBL(P_Record_Number).TABLE_REC_ID := P_TABLE_REC_ID;
     L_MULTI_SEL_TBL(P_Record_Number).TABLE_REC_CODE := P_TABLE_REC_CODE;
     L_MULTI_SEL_TBL(P_Record_Number).TABLE_REC_DESC := P_TABLE_REC_DESC;
     ---N值永远指向最大的P_Record_Number
     IF N < P_Record_Number THEN
       N := P_Record_Number;
     END IF;
    
  END;
 
  PROCEDURE DELETE_TEMP_RECORD(P_Record_Number IN NUMBER)
  IS
     --L_MULTI_SEL_Rec   XYG_PUB_COMMON_PKG.MULTI_SEL_Rec_Type;
     --L_MULTI_SEL_TBL    XYG_PUB_COMMON_PKG.MULTI_SEL_Tbl_Type;
  BEGIN
     L_MULTI_SEL_TBL.delete(P_Record_Number);
  END;
 
  PROCEDURE SHOW_TEMP_RECORD
  IS
     --L_MULTI_SEL_Rec   XYG_PUB_COMMON_PKG.MULTI_SEL_Rec_Type;
     --L_MULTI_SEL_TBL    XYG_PUB_COMMON_PKG.MULTI_SEL_Tbl_Type;
     V_SHOW_MESSAGE VARCHAR2(30000);
  BEGIN
    V_SHOW_MESSAGE:='您共选中行:'||L_MULTI_SEL_TBL.COUNT;
     V_SHOW_MESSAGE := V_SHOW_MESSAGE||CHR(10)||'您选中的行信息如下:';
     FOR I IN 1..N LOOP
      BEGIN
       V_SHOW_MESSAGE := SUBSTRB(V_SHOW_MESSAGE || CHR(10)||'行号:'||L_MULTI_SEL_TBL(I).Record_Number
                                                  ||'行标识:'||L_MULTI_SEL_TBL(I).TABLE_REC_ID
                                                  ||'行代码:'||L_MULTI_SEL_TBL(I).TABLE_REC_CODE,1,30000);
      EXCEPTION
       WHEN NO_DATA_FOUND THEN
        NULL;
      END;
      
     END LOOP;
     FND_MESSAGE.DEBUG(V_SHOW_MESSAGE);
  END;
 
  PROCEDURE INSERT_TEMP_TABLE(P_BLOCK IN VARCHAR2)
  IS
     L_TEMP_REC XYG_PUB_COMMON_TABLE_TEMP%ROWTYPE;
  BEGIN
   DELETE XYG_PUB_COMMON_TABLE_TEMP;
     FOR I IN 1..N LOOP
       BEGIN
         L_TEMP_REC := NULL;
         L_TEMP_REC.ATTRIBUTE_CATEGORY := P_BLOCK;
         L_TEMP_REC.ATTRIBUTE1 := L_MULTI_SEL_TBL(I).Record_Number;
         L_TEMP_REC.ATTRIBUTE2 := L_MULTI_SEL_TBL(I).TABLE_REC_ID;
         L_TEMP_REC.ATTRIBUTE3 := L_MULTI_SEL_TBL(I).TABLE_REC_CODE;
         L_TEMP_REC.ATTRIBUTE4 := L_MULTI_SEL_TBL(I).TABLE_REC_DESC;
         INSERT INTO XYG_PUB_COMMON_TABLE_TEMP
         VALUES (L_TEMP_REC);
       EXCEPTION
        WHEN NO_DATA_FOUND THEN
         NULL;
       END;
     END LOOP;
  END;
 
END;

 

 

----------------------------------------------------------- 

 

备注:本教程参考网络文章:http://blog.retailsolution.cn/archives/2800

 

 

最后

以上就是聪慧嚓茶为你收集整理的From数据块记录多行选中 开发方法的全部内容,希望文章能够帮你解决From数据块记录多行选中 开发方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部