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的大小。

posted @ 2023-03-15 14:49  胖大海527  阅读(92)  评论(0)    收藏  举报