1、 在WHEN-NEW-FORM-INSTANCE后面添加以下代码:
--定义文件夹数据块
app_folder.define_folder_block(
object_name => ' DETAILBLOCK _FOLDER' ,
folder_block_name => 'DETAILBLOCK',
prompt_block_name => 'DETAILBLOCK_PROMPT',
folder_canvas_name => 'DETAILBLOCK_STACKED',
folder_window_name => 'BLOCKNAME',
disabled_functions => '');
--以上参数均为VARCHAR2,长度不得超过20个字符
2、 增加FORM级触发器:FOLDER_ACTION,PL/SQL代码如下:
app_folder.event(:global.folder_action);
3、 增加FORM级触发器:FOLDER_RETURN_ACTION,PL/SQL代码如下:
null;
--
-- action code is in :global.folder_action
-- affected field is in :global.folder_field
--
添加文件:APPFLDR.PLL
来源:ERP安装目录下,AU目录下查找该类文件所在的目录
继承一个对象组:STANDARD_FOLDER
做法:复制APPSTAND.FMB中的同名对象,粘贴到模板对象组中,选择“Refence”(继承),路径方式选择“Remove path”(不要路经)。
结果:将会把对象组中的所有对象映射添加到相应的对象节点中。
1、 修改WHEN-NEW-FORM-INSTANCE中文件夹数据块定义语句中的参数,确定对象名称(一般为form对象名称)、文件夹数据块名称、标题块名称、堆叠画布名称、窗口名称。
2、 定义窗口(windows),win_main:继承属性WINDOW_NORMAL
3、 定义堆叠画布(stacked canvas-views), cv_detail_stacked:继承属性类CANVAS_STACKED
4、 定义文件夹数据块(folder block),blk_detail:继承属性类BLOCK
(1) 触发器:
· KEY-EXEQRY:
app_folder.event('KEY-EXEQRY');
· KEY-NEXT-ITEM
app_folder.event('KEY-NEXT-ITEM');
· KEY-PREV-ITEM
app_folder.event('KEY-PREV-ITEM');
· POST-BLOCK
app_folder.event('POST-BLOCK');
· PRE-BLOCK
app_folder.event('PRE-BLOCK');
· WHEN-NEW-BLOCK-INSTANCE
App_folder.event('WHEN-NEW-BLOCK-INSTANCE');
· KEY_CLRBLK
App_folder.event(' KEY_CLRBLK ');
· KEY_ENTQRY
App_folder.event(' KEY_ENTQRY ');
· KEY_NXTREC
App_folder.event(' KEY_NXTREC ');
· KEY_PRVREC
App_folder.event(' KEY_PRVREC ');
· PRE_QUERY
App_folder.event(' PRE_QUERY ');
· WHEN-NEW-RECORD-INSTANCE
App_folder.event('WHEN-NEW-RECORD-INSTANCE');
(2) 定义数据项,可以是表项,也可以是非基表项,确定哪些项需要放在堆叠画布上,注意只有在堆叠画布上的项才能使用文件夹功能
(3) 注意:数据项的类型不能是:Display Item、List Item等;
可以是:Text Item、Check Box等;
如果打开folder时出现错误:“Set_Item_Property没有这样的属性”,说明erp标准程序中用到的属性在个别项中不存在,出现几次就有几个缺乏这个属性的Item;是否拥有这个属性,是由Item的类型确定的,因此有些Item类型不能用于folder功能。
(4) 确定各个项在画布中的位置
5、 定义标题数据块(prompt block), blk_detail_prompt:继承属性类BLOCK_DIALOG
便捷的做法:先复制文件夹数据块blk_detail,改名称,再删去新块下的全部触发器,然后除去不需要的项,修改剩下所有项的属性继承FOLDER_PROMPT_MULTRIROW,最后将各个项的default value属性值写入对应的中文或英文标题
(1) 触发器:无
(2) 标题项,来自文件夹数据块blk_detail,属性继承自FOLDER_PROMPT_MULTIROW,default value属性值写入相应的中英文标题
实现文件夹功能
1、在客制的Form里面实现Oracle Folder的功能,最终效果如下:
2、使用TEMPLATE.fmb创建一个Form(名称:FRMSTONE)。
2.1添加Form Objects 包括一个Window,MY_FOLDER
一个Canvas, MY_FOLDER 一个Block,MY_FOLDER(可以使用向导创建),并修改其属性。如下图:
注:使用文件夹的数据块,其名称总长不能超过22字节!
2.2修改Trigger和ProgramUnits
Form Level Trigger: PRE-FORM:
app_window.set_window_position('MYFOLDER', 'FIRST_WINDOW');
Program Units:APP_CUSTOM:
if (wnd = 'MYFOLDER') then app_window.close_first_window;
2.3修改FORM属性设置
注:须要说明的是:设成第一个导航数据块的blockname必须至少一个item处于canvas中,否则会报FRM-40106的错误。
2.4其他的具体步骤同一般的FORM开发一样,就不多说了。
3、添加Folder相关的Objects
3.1文件夹相关的Window、Canvas、Block、Item…等都包含在Oracle Standard Form APPSTAND.FMB。
3.2在同一窗口打开标准的Form和我们自己客制的Form,并且选择APPSTAND.FMB 的Object Groups STANDARD_FOLDER然后用鼠标拖动至我们自己的Form的Object Groups。
将原来已经打开的APPSTAND.fmb中的三个以FOLDER开头的三个窗口选中,按住ctrl键,然后移动到自己建的表单HELPSTZD的Windows节点,在弹出的对话框中选择Subclass。然后利用同样的方法将APPSTAND.fmb中的三个以FOLDER开头的画布Subclass到自己的表单中,还要用同样的方法将APPSTAND.fmb中的两个以FOLDER开头的数据块Subclass到自己的表单中。还要用还要用同样的方法将APPSTAND.fmb中的名称为STANDARD_FOLDER的Object Groups 通过Subclass的方式移植到自己的表单中。
3.3此时会弹出对话框:
选择子类,你会发现Form Builder都会在你的Form里面自动添加很多对象。做完这一步后,请不要关闭APPSTAND.FMB。
4、增加Attached Libraries
做完上面的步骤后,检查一下Attached libraries里面有没有APPFLDR。如果没有,我们需要手工添加。
5、增加Stacked Canvas FOLDER_STACK 这一步是必须的,而且你期望实现Folder拖动功能的那些Item都是放在这个Canvas里面,这个Stacked Canvas又是放在前面我们建立的Canvas:MY_FOLDER上面的。
5.1增加Stacked Canvas 双击打开Canvas MY_FOLDER,在左侧工具条里面选择Stacked Canvas,然后在Canvas MY_FOLDER里面拖动即可。
5.2设置Stacked Canvas属性
6、更改数据块MY_FOLDER中的Item属性
7、创建控制块MY_FOLDER_PROMPT
7.1设置块的属性 子类信息:block 数据库数据块:否
7.2增加ITEM 注:增加Item,名称必须和Block MY_FOLDER中的Item保持一致。 另外,数据块中有些item(如id)不要显示在canvas上的,那么此类item也无须在MY_FOLDER_PROMPT创建相应的item.
7.2设置其初始值,也就是显示的标签名及子类信息
7.3增加其他相关Item 我们还需要增加其他的一些Item,都是和Folder的功能有关的。
8、增加相应的trigger
9、其他注意事项
9.1错误:在编译带有文件夹的FORM时,经常会出现如下提示。
FRM-30085: Unable to adjust form for output
这是因为ITEM超出的了画布的高度或是宽度造成的。如图:
可以通过调整ITEM的X坐标或Y坐标来解决此错误。
9.2错误:无法实现拖动。
解决:数据块的item与folder的item与调整一定的距离。
在按FOLDER按鍵時,為了防止系統詢問是否查詢所有數據
需要添加FOLDER_RETURN_ACTION 触发器:
if :global.folder_action = 'CONFIRM-AUTOQUERY' then
:global.folder_action_allowed := 'FALSE';
end if;