Form 电子表格(JTF GRID)
JTF GRID 的简单概念
JTF Grid不是Form 的标准功能,而是 Oracle自己在 EBS 开发中总结出来的“可配置块字段”:块中有多少字段可以通过专门的界面定义。
对于开发来说,要做的事情就是用“遵循 JTF Grid规范”换取“增删字段无需修改 Form代码”。
测试:
1.引用JTF Grid的PLL库
选中 Attached Libraries ,点击“+ ”,选择 JTF_GRID.pll,其将自动引用 JTF_UTIL 、JTFDEBUG 。如果本地没有请先从服务器下载
2.拷贝标准 JTF Grid对象
1.1 对象组
打开 JTFSTAND.fmb,把对象组“JTF_GRID”拖到我们自己的 Form中,并选择“Subclass”而非“ Copy”,这个和前面讲的Folder一样。
这样会自动产生一系列用于 JTF_GRID的对象:块、画布、参数、 Property Classes、Window ,尤其注意 Form级触发器JTF_GRID_EVENT 。这些都不用修改。
1.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.创建数据库对象
-- Create table CREATE TABLE cux_test_jtf_grid AS SELECT line_num ,vendor_name ,vendor_id ,order_date ,po_number ,inventory_item_id ,item_number ,DESCRIPTION ,quantity ,unit_of_measure ,unit_price ,currency_code FROM xxibi_rcv_att_ohhand_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) )
4.定义 CRM 电子表格
路径:
输入电子表格名称、源视图、字段定义
5.创建GRID块
手工创建非数据库块,规范起见,块名后加“GRID”,这里是“DEMO_GRID”。
当然了,从 Template开始的常规修改步骤也是要做的。
6.修改GRID块
添加三个ITEM
Bean Area :READONLY_GRID
Button :FIND
Button :DETAIL
7.布局ITEM到画布
对于Bean Area 只能在其属性上设置其在画布上的显示宽度和高度
8.添加触发器代码
Form 级别 WHEN-NEW-FORM-INSTANCE
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 ;
用户点击 Find,通常是弹出查询界面,输入完条件再执行查询,我们这里省去查询条件界面
Find 按钮 WHEN-BUTTON-PRESSED
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 ;
9.处理选择事件
用户选中某行后,我们可以根据其选中的信息去打开一个普通块,这样首先需要在 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_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;
10.上传编译