EBS文件夹功能(folder)的实现

75.1 问题描述
文件夹功能(folder)是EBS中强大的功能,可以实现点击前三列的列标题排序,拖动列,隐藏列,显示列,拉宽列,拉窄列,保存查询以供以后使用等等,但Oracle官方文档没有多少论述,自己也做过,模模糊糊,如果能有文档记载下来就好了。
75.2 解决方案
1.从$AU_TOP/forms/US下载好TEMPLATE.fmb并打开并重命名为自己的表单名,我这个例子是HELPSTZD,同时打开APPSTAND.fmb(该文件从$AU_TOP/resource 下载),如图:
2.删除TEMPLATE.fmb中的示例对象,主要是BLOCKNAME和DETAILBLOCK这两个数据块,BLOCKNAME这个画布,BLOCKNAME这个窗口。
3. 建立表单的主要窗口,我命名为MAIN,并将其Subclass Information值设置为WINDOW,如图,然后修改MAIN这个窗口的Title属性为自己想要的名字,比如通知单管理,再修改form级别的触发器PRE-FORM中的代码为类似下面的代码:
FND_STANDARD.FORM_INFO('$Revision: 115.12$', 'HELPSTZD', 'HEL',
                       '$Date: 2011/04/27 11:02  $', '$Author: luoyong $');
app_standard.event('PRE-FORM');
app_window.set_window_position('MAIN', 'FIRST_WINDOW');

备注:第一行代码的第二个和第三个参数在审计级别设置为表单时十分有用,如果不设置,到时候会追踪不到。
第三行的第一个参数是主要窗口的名称。
3.        修改APP_CUSTOM这个包中的代码如下,主要是关闭主窗口时退出表单。
  if (wnd = 'MAIN') then
app_window.close_first_window;
4.        首先创建一个主要的内容画布,我这里命名为MAIN,将其Canvas Type设置为Content,其Subclass Information值设置为CANVAS,设置好大小,如图。创建要应用文件夹功能的数据块,我这里是块 NOTICE_MAIN ,然后为该块添加一个项目,名称为CURRENT_RECORD_INDICATOR,其属性Subclass Information的属性值也设置为CURRENT_RECORD_INDICATOR,放在内容画布MAIN上面,也就是设置该项的Canvas属性为MAIN,一般其X Position属性设置为0.177,Y Position 属性设置为.5。一般来说,还应该将该块设置为该表单的首次导航块,设置方法:点击表单,然后按F4键调出属性面板,将属性First Navigation Data Block设置为刚才的数据块NOTICE_MAIN。当然还要将几个项目暂时放到内容画布上(为啥说暂时?因为后面会将其放到堆叠画布上),然后上传到EBS测试环境,确保能编译通过,且运行没有问题。
5.        从FTP上的au/11.5.0/resource/ 目录下载APPFLDR.pll到自己电脑上的某个位置,然后加载该pll,操作方法:选中表单的Attached Libraries节点,然后点击左侧的加号工具,也就是Create按钮,会弹出对话框,选择刚才下载的APPFLDR.pll,然后点击Attach按钮,在弹出的警告对话框中选择Yes,添加成功后就会出现APPFLDR。
6. 将原来已经打开的APPSTAND.fmb中的三个以FOLDER开头的三个窗口选中,按住ctrl键,然后移动到自己建的表单HELPSTZD的Windows节点,在弹出的对话框中选择Subclass。然后利用同样的方法将APPSTAND.fmb中的三个以FOLDER开头的画布Subclass到自己的表单中,还要用同样的方法将APPSTAND.fmb中的两个以FOLDER开头的数据块Subclass到自己的表单中。还要用还要用同样的方法将APPSTAND.fmb中的名称为STANDARD_FOLDER的Object Groups 通过Subclass的方式移植到自己的表单中。
7. 添加堆叠画布,我这里将堆叠画布命名为NOTICE_MAIN_STACKED,其属性Canvas Type设置为Stacked,属性Subclass Information设置为CANVAS_STACKED,属性Show Horizontal Scroll Bar设置为Yes,属性Window设置为主要窗口MAIN,Viewport X Position属性设置为0.5,Viewport Y Position属性设置为0.25,还有一个值得注意的地方就是其在Canvas节点的顺序要放到先前建立的内容画布MAIN的下面,如图。
8.为文件夹块NOTICE_MAIN的所有要显示给用户看的项设置相应的属性,所有的项都应该设置Subclass Information属性(一般设置为TEXT_ITEM或者TEXT_ITEM_DISPLAY_ONLY),设置其Canvas属性为建立的堆叠画布NOTICE_MAIN_STANCKED,X Position属性为0,Y Position属性设置为0.25。同时为该文件夹块增加一个项,名称为SWITCHER,Item Type属性值为Text Item,Subclass Information属性值设置为SWITCHER,属性CANVAS要设置为内容画布MAIN,还有就是该项目要是该块的第一个项目,也就是放到项目CURRENT_RECORD_INDICATOR的上面。还要设置该文件夹块的Show Scroll Bar属性值为Yes,Scroll Bar Orientation属性值为Vertical,Scroll Bar Canvas为内容画布MAIN,属性Scroll Bar Y Position属性设置为0.5,Scroll Bar Length属性设置为行数*0.25,比如我的设置为10行,所以该属性值就是2.5。
9. 为文件夹块建立列标题块,块一般命名为文件夹块名称后加上_PROMPT,我这里的名称是NOTICE_MAIN_PROMPT,为文件夹块所有要显示的项目增加一个对应的项目,项目名称同文件夹块对应项目的名称,叠放顺序将会是列显示的顺序,其Width属性将会是列显示的宽度,项目的Canvas要设置为堆叠画布NOTICE_MAIN_STACKED,属性Initial Value就是列标题,Item Type属性设置为Display Item,Subclass Information属性设置为FOLDER_PROMPT_MULTIROW,Height属性设置为0.25。还要为该块增加几个特殊的项目,分别是FOLDER_OPEN (该项目的Item Type为Push Button,Subclass Information属性设置为FOLDER_OPEN,CANVAS属性设置为内容画布MAIN),FOLDER_TITLE (该项目的Item Type为Text Item,Subclass Information属性设置为DYNAMIC_TITLE, CANVAS属性设置为内容画布MAIN,X Position属性设置为0.4,Width属性设置为4),FOLDER_DUMMY  (该项目的Item Type为Text Item,Subclass Information属性设置为FOLDER_DUMMY,CANVAS属性设置为TOOLBAR),ORDER_BY1,ORDER_BY2,ORDER_BY3 (这3个ORDER_BY项目的Item Type为Push Button,Subclass Information属性设置为FOLDER_ORDERBY,Y Position属性要设置为0.5 加上 0.25 乘以文件夹块显示行数(比如是10)的值,我这里设置为0.5+0.25*10=3,CANVAS属性要设置为内容画布MAIN)。
10.编写触发器代码。
?        文件夹块NOTICE_MAIN中的项目SWITCHER 增加WHEN-NEW-ITEM-INSTANCE触发器,Execution Hierarchy属性为Override,代码为app_folder_move_cursor('1');
?        文件夹块NOTICE_MAIN中的项目CURRENT_RECORD_INDICATOR 增加WHEN-NEW-ITEM-INSTANCE触发器,Execution Hierarchy属性为Override,代码为app_folder_move_cursor('1');
?        文件夹块NOTICE_MAIN增加触发器WHEN-NEW-BLOCK-INSTANCE,Execution Hierarchy属性为Before,代码为app_folder.event('WHEN-NEW-BLOCK-INSTANCE');
?        文件夹块NOTICE_MAIN增加触发器KEY-NEXT-ITEM,Fire in Enter-Query Mode属性为Yes,代码为app_folder.event('KEY-NEXT-ITEM');
?        文件夹块NOTICE_MAIN增加触发器KEY-PREV-ITEM,Fire in Enter-Query Mode属性为Yes,代码为app_folder.event('KEY-PREV-ITEM');
?        文件夹块NOTICE_MAIN增加触发器PRE-BLOCK,Execution Hierarchy属性为Before,代码为app_folder.event('PRE-BLOCK');
?        文件夹块NOTICE_MAIN增加触发器POST-BLOCK,Execution Hierarchy属性为Before,代码为app_folder.event('POST-BLOCK');
?        文件夹块NOTICE_MAIN增加触发器PRE-QUERY,Execution Hierarchy属性为Before,代码为app_folder.event('PRE-QUERY');
?        文件夹块NOTICE_MAIN增加触发器KEY-EXEQRY,Execution Hierarchy属性为Before,Fire in Enter-Query Mode属性为Yes,代码为app_folder.event('KEY-EXEQRY');
?        文件夹块NOTICE_MAIN增加触发器POST-QUERY,Execution Hierarchy属性为Before,代码为app_folder.event('POST-QUERY');
?        创建或修改表单级触发器WHEN-WINDOW-RESIZED增加代码
IF :system.event_window IN ('MAIN') THEN
IF (get_window_property(:system.event_window,
                            width) < 5.7) THEN
      set_window_property(:system.event_window,
                          width,
                          5.7);
    ELSE
      app_folder.event('WHEN-WINDOW-RESIZED');
    END IF;
  END IF;
?        创建或修改表单级触发器KEY-CLRFRM增加代码app_folder.event('KEY-CLRFRM');
创建或修改表单级触发器WHEN-NEW-FORM-INSTANCE增加代码app_folder.define_folder_block('HELPSTZD',
                               'NOTICE_MAIN',
                               'NOTICE_MAIN_PROMPT',
                               'NOTICE_MAIN_STACKED',
                               'MAIN');
app_folder.event('INSTANTIATE');

过程app_folder.define_folder_block的说明:
app_folder.define_folder_block('<OBJECT NAME>',
'<FOLDER BLOCK NAME>',
'<PROMPT BLOCK NAME>',
'<FOLDER STACKED CANVAS NAME>',
'<FOLDER WINDOW NAME>',
['<DISABLED FUNCTIONS>']);
参数解释
其中OBJECT NAME 为表单的名称。
FOLDER BLOCK NAME 为文件夹块的名称
PROMPT BLOCK NAME 为文件夹块对应的列标题块的名称
FOLDER STACKED CANVAS NAME 为堆叠画布的名称
FOLDER WINDOW NAME 为表单主窗口的名称
DISABLED FUNCTIONS 用来禁用某些功能。。。
?        修改表单级触发器FOLDER_ACTION,代码为app_folder.event(:global.folder_action);
?        修改表单级触发器FOLDER_RETURN_ACTION的代码为null;

猜你喜欢

转载自blog.csdn.net/gehixiaoge/article/details/83858460