概述
前言:
用户多选的操作应该是必须的,目的是为了提高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. 多选的效果:
下面的画面,如果想要批量选择:需求ID从12050200026~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) 当一个Form有2个或者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数据块记录多行选中 开发方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复