EBS JTF GRID开发全过程
EBS JTF GRID 开发全过程
1.什么是JTF Grid
JTF Grid不是Form的标准功能,而是Oracle自己在EBS开发中总结出来的“可配置块字段”:块中有多少字段可以通过专门的界面定义,。
对于开发来说,要做的事情就是用“遵循JTF Grid规范”换取“增删字段无需修改Form代码”。
2.拷贝标准JTF Grid对象
1、对象组
打开JTFSTAND.fmb,把对象组“JTF_GRID”拖到我们自己的Form中,并选择“Subclass”而非“Copy”,这个和前面讲的Folder一样。
这样会自动产生一系列用于JTF_GRID的对象:块、画布、参数、Property Classes、Window,尤其注意Form级触发器JTF_GRID_EVENT。这些都不用修改。
2、过程
从JTFSTAND.fmb拷贝JTF_CUSTOM_GRID_EVENT过程到我们自己的Form中,然后补上事件处理,暂时全部放null:
PROCEDURE jtf_custom_grid_event(gridname IN VARCHAR2
,eventtype IN VARCHAR2 ) IS
grid_selection jtf_grid_property.row_selection_type;
l_start_row NUMBER;
BEGIN
IF eventtype = jtf_grid_events.hyperlink_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.new_record_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.popup_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.row_selection_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.end_of_find_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.doubleclick_event THEN
NULL;
END IF ;
END;
3.引用JTF Grid的PLL库
选中Attached Libraries,点击“+”,选择JTF_GRID.pll,其将自动引用JTF_UTIL、JTFDEBUG。如果本地没有请先从服务器下载。
4.创建数据库对象
创建数据库对象,没有任何特殊之处,可以使用现成的View和Table,比如我们使用gl_je_headers_v。
-- Create table
CREATE TABLE cux_test_jtf_grid
AS
SELECT *
FROM gl_je_headers_v;
--Or Create table
create table CUX_TEST_JTF_GRID
(
LINE_NUM NUMBER not null,
VENDOR_NAME VARCHAR2(240),
VENDOR_ID NUMBER,
ORDER_DATE DATE,
PO_NUMBER VARCHAR2(20) not null,
INVENTORY_ITEM_ID NUMBER not null,
ITEM_NUMBER VARCHAR2(40),
DESCRIPTION VARCHAR2(240),
QUANTITY NUMBER not null,
UNIT_OF_MEASURE VARCHAR2(25) not null,
UNIT_PRICE NUMBER,
CURRENCY_CODE VARCHAR2(15)
)
5.定义CRM电子表格 特殊
N: CRM Adminstrator/Spreadtable/Metadata Administraion
输入电子表格名称、源视图、字段定义:



6.创建Grid块
手工创建非数据库块,规范起见,块名后加“GRID”,这里是“DEMO_GRID”。
当然了,从Template开始的常规修改步骤也是要做的。
7. 修改Grid块 特殊
手工创建非数据库项,并设置这些字段的关键属性:
| 字段名 | Subclass | 说明 |
|---|---|---|
| READONLY_GRID | JTF_GRID_ITEM | 必须,名字随便 |
| FIND | BUTTON | 可选 |
| DETAIL | BUTTON | 可选 |
![]() |
||
![]() |
||
![]() |
8. 布局Item到画布 普通
把DEMO_GRID布局到画布,什么画布都可以,我们需要设置其在画布的启示位置、高度、宽度,因为设计时在画布上不容易看到,我们可以直接设置属性。
对于READONLY_GRID 只能在其属性上设置其在画布上的显示宽度和高度

9.追加Form级触发器 特殊
在WHEN-NEW-FORM-INSTANCE中追加:
IF NOT jtf_grid.getbooleanproperty('DEMO_GRID.READONLY_GRID',
jtf_grid_property.initialized) THEN
jtf_grid.init(jtf_custom.grid_name, 'GL_JE_HEADERS_V');
jtf_grid.setbooleanproperty(jtf_custom.grid_name,
jtf_grid_property.allow_multiple_row_selection,
FALSE);
END IF;
/*
IF NOT jtf_grid.getbooleanproperty('DEMO_GRID.READONLY_GRID',
jtf_grid_property.initialized) THEN
jtf_grid.init('DEMO_GRID.READONLY_GRID','CUX_TEST_JTF_GRID_V');
jtf_grid.setbooleanproperty('DEMO_GRID.READONLY_GRID',
jtf_grid_property.allow_multiple_row_selection,
FALSE);
END IF ;
*/
10. 编写Find Button触发器 特殊
用户点击Find,通常是弹出查询界面,输入完条件再执行查询。
我们这里省去查询条件界面,直接在FIND按钮的WHEN-BUTTON-PRESSED中编写:
jtf_grid.removeallbindvariables('DEMO_GRID.READONLY_GRID');
--jtf_grid.setbindvariable('DEMO_GRID.READONLY_GRID', 'CURRENCY_CODE', 'CNY');
jtf_grid.setcharproperty('DEMO_GRID.READONLY_GRID',
jtf_grid_property.where_clause,
'CURRENCY_CODE=''CNY''');
IF jtf_grid.getbooleanproperty('DEMO_GRID.READONLY_GRID',
jtf_grid_property.is_populated) THEN
jtf_grid.refresh('DEMO_GRID.READONLY_GRID');
ELSE
jtf_grid.populate('DEMO_GRID.READONLY_GRID');
END IF;
/*
jtf_grid.removeallbindvariables( 'DEMO_GRID.READONLY_GRID');
jtf_grid.setcharproperty('DEMO_GRID.READONLY_GRID'
,jtf_grid_property.where_clause
,'CURRENCY_CODE = ''USD''');
IF jtf_grid.getbooleanproperty('DEMO_GRID.READONLY_GRID'
,jtf_grid_property.is_populated) THEN
jtf_grid.refresh('DEMO_GRID.READONLY_GRID');
ELSE
jtf_grid.populate('DEMO_GRID.READONLY_GRID');
END IF ;
*/
11. 处理选择事件 特殊
用户选中某行后,我们可以根据其选中的信息去打开一个普通块,这样首先需要在FIND按钮的WHEN-BUTTON-PRESSED中编写:
jtf_grid.RequestRowSelection('DEMO_GRID.READONLY_GRID');
可以打开该包查看其具体作用。然后在过程jtf_custom_grid_event中响应选择事件:
PROCEDURE jtf_custom_grid_event(gridname IN VARCHAR2,
eventtype IN VARCHAR2) IS
grid_selection JTF_GRID_PROPERTY.ROW_SELECTION_TYPE;
l_startRow number;
BEGIN
IF eventtype = jtf_grid_events.hyperlink_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.new_record_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.popup_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.row_selection_event THEN
grid_selection := jtf_grid.GetRowSelection('DEMO_GRID.READONLY_GRID');
if grid_selection.COUNT > 0 then
l_startRow := grid_selection(1).startRow;
fnd_message.debug(jtf_grid.GetColumnCharValue('DEMO_GRID.READONLY_GRID', l_startRow, 'NAME'));
--Do any thing here
END IF;
ELSIF eventtype = jtf_grid_events.end_of_find_event THEN
NULL;
ELSIF eventtype = jtf_grid_events.doubleclick_event THEN
null;
END IF;
END;
/*
PROCEDURE JTF_CUSTOM_GRID_EVENT(gridName in varchar2, eventType in varchar2) IS
grid_selection JTF_GRID_PROPERTY.ROW_SELECTION_TYPE;
l_start_row number;
BEGIN
IF eventtype = jtf_grid_events.hyperlink_event THEN
null;
ELSIF eventtype = jtf_grid_events.new_record_event THEN
null;
ELSIF eventtype = jtf_grid_events.popup_event THEN
null;
ELSIF eventtype = jtf_grid_events.row_selection_event THEN
grid_selection := jtf_grid.getRowSelection('DMEO_GRID.READONLY_GRID' );
if grid_selection.COUNT > 0 then
l_start_row := grid_selection(1).startrow;
--fnd_message.debug(jtf_grid.getcolumncharvalue('DMEO_GRID.READONLY_GRID',l_start_row,'NAME'));
end if ;
ELSIF eventtype = jtf_grid_events.end_of_find_event THEN
null;
ELSIF eventtype = jtf_grid_events.doubleclick_event THEN
null;
END IF;
END;
*/
2.12. 上传&编译&运行

注,上述触发器代码通常全部组织到一个名字为“JTF_CUSTOM”的Program Units中,
这样就可以定义一个变量GRID_NAME来保存字段名,免得每处代码重复写'DEMO_GRID.READONLY_GRID'。
如果要使Window变化时Grid跟着变,那么需要参考Folder的做法,在WHEN-WINDOW-RESIZED触发器中调整画布大小、Grid的大小。




浙公网安备 33010602011771号