FORM 开发相关技巧3

来源:互联网 发布:js遍历dom树 编辑:程序博客网 时间:2024/04/20 05:52

16, 常用item 事件包括:
when_validate_item : 调用一个item的验证并且设置动态的item 属性
when_new_record_unstance :重置item属性到默认状态给一个新的纪录。
init:测试当前条件,必要时重置默认属性和动态属性
对于‘INIT’的理解:
Examine current conditions and reset defaults and dynamic attributes as necessary. Usually called by other handlers that affect this item.

17 , EBS中客户化表结构的设计原则:
1)必须包括一个主键,并建立相应的序列;
2)建立5个WHO字段,也就是
CREATED_BY NUMBER
CREATION_DATE DATE
LAST_UPDATED_BY NUMBER
LAST_UPDATE_DATE DATE
LAST_UPDATE_LOGIN NUMBER
在FORM中使用属性类:CREATION_OR_LAST_UPDATE_DATE,WHO字段并不会自动地被赋值,必须自己在FORM中编写代码来完成这项工作。
EBS中提供了一个函数FND_STANDARD.SET_WHO,大家只要在FORM的BLOCK级触发器PRE-INSERT/PRE-UPDATE中进行调用即可。
对于记录的PRE-INSERT,PRE-UPDATE Trigger中加入了fnd_standard.set_who后,
程序自动会对CREATE _BY,CREATION_DATE,LAST_UPDATE_BY,LSAT_UPDATE_DATE,LAST_UPDATE_LOGIN这5个栏位赋新的值


18, form 编程规则:
*引用字段时,使用 :BlockName.ItemName的形式;
*使用亚元直接用dual,不要用sys.dual和system.dual;
*使用object IDs获得更好的性能;
declare
x_id item;
begin
x_id := find_item(’block.item’);

end;
*总是使用显式游标;
*使用FND_MESSAGE程序显示信息
*使用FND_MESSAGE.DEBUG拉显示debugging信息,
典型用法:
ELSE
fnd_message.debug(’Invalid event passed to control.orders_lines: ’ || EVENT);
END IF;
*使用RAISE FORM_TIGGER_FAILURE来终止应用层的运行
*使用APP_EXCEPTION.RAISE_EXCEPTION 来终止数据库层的运行
*用fnd_fuction.execute代替open_form
*不要使用CALL_FORM
*用do_key(‘exit_form’)代替exit_form
To exit the Oracle Applications suite:
copy (’Y’, ’GLOBAL.APPCORE_EXIT_FLAG’);
do_key(’exit_form’);
*用do_key(‘clear_form’)代替clear_form
*用do_key('COMMIT_form')代替commit
*用do_key(‘edit_field’)代替EDIT_FIELD/EDIT_TEXTITEM

触发器编程规则
*Post-Query trigger说明:
.用带有LOVS的items使用lov来验证是否正确,当他们在无意识的情况下被要求保存changes会使用户感到混淆,
这种情况下,在你的post-query 触发器里面重置记录状态:(设置当前块的属性为查询状态)
set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS);


*必须设置为Before的trigger有WHEN-NEW-RECORD-INSTANCE, WHEN-NEW-BLOCK-INSTANCE,WHEN-NEW-ITEM-INSTANCE;
可以设置为Override的trigger有KEY-DUPREC,KEY-MENU,KEY-LISTVAL,QUERY_FIND, ACCEPT。


19, FND_Function 用法:
FND_Function.Execute 可使用
Procedure--过程
Executes the specified Form 指定的form
Only accessible from Client-side PL/SQL 可连接form的客户端的pl/sql
Should be used in place of Oracle Forms built-ins OPEN_FORM and NEW_FORM 应该在form级触发器OPEN_FORM与NEW_FORM
Usage:--使用例子

procedure FND_FUNCTION.EXECUTE
(function_name IN varchar2,
open_flag IN varchar2 default ’Y’,
session_flag IN varchar2 default ’SESSION’,
other_params IN varchar2 default NULL,
activate IN varchar2 default ’ACTIVATE’,
browser_target IN varchar2 default NULL);


20,,fnd_message.set_name用法:
一般情况下在FORM中显示出错信息使用以下代码:
FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;
FND_MESSAGE.ERROR ;

在PACKAGE中显示出错信息一般使用以下代码:
FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;
APP_EXCEPTION.RAISE_EXCEPTION ;

例 fnd_message.set_name('FND','是否删除该记录?');

fnd_message.question 用法:
例在删除某条记录之前提示是否删除该如何实现?即在删除某条记录之前提示用户是否删除,
如何用户选择删除则删除,如果选择否则不删除的实现?
1。首先新建Alter 'DELETE_ALERT',更改其属性button1为"Yes",button2为"No"
2。在Block level Trigger: key-delrec中增加如下代码即可:
declare
return_value number;
begin
set_alert_property('DELETE_ALERT',alert_message_text,'Are You Sure Delete This Record ?');
return_value := show_alert('DELETE_ALERT');
if return_value = alert_button1 then
delete_record;
end if;
end;


21,提交请示
关于fnd_request.submit_request的用法:
FND_REQUEST.SUBMIT_REQUEST 函數是用來提交一個請求的,它返回一個NUMBER值.具體調用如下
:result := fnd_request.submit_request(application CHAR, --AP模快
program CHAR, --應用程式
description CHAR, --請求說明(可選)
start_time CHAR, --RUN 時間(可選)
sub_request BOOLEAN, --立刻提交請求
argument1 CHAR, --參數1
argument2 CHAR, --參數2
argument3 CHAR, --參數3
argument4 CHAR, --參數4
argument5 CHAR, --參數5.......
argument100 CHAR);
英文說明(zt oracle) :
Parameters are as follows:

application - Short name of the application associated with the concurrent
request to be submitted.

program - Short name of the concurrent program (not the executable) for which
the request should be submitted.

description - Description of the request that is displayed in the Concurrent
Requests form (Optional.)

start_time - Time at which the request should start running, formatted as HH24:
MI or HH24:MI:SS (Optional.)

sub_request - Set to TRUE if the request is submitted from another request and
should be treated as a sub-request.

argument1...100 - Arguments for the concurrent request; up to 100
arguments are permitted. If submitted from Oracle Forms, you must specify all
100 arguments.

补充说明:
在用fnd_request.submit_request的时候,第五个参数用false,不要被参数名称误导;
这个函数有105个参数,前面五个定义请求本身,后面100个是传递给请求的具体参数,都是Char类型,
我们需要转换,默认值是chr(0),代表这个参数不用传递给调用的请求;
在Package里面调用只需要传递需要的参数个数,因为它有默认值指示结束;
在form里面则不行,要写满105个,而且我们参数结束之后要用一个chr(0)来表示结束


fnd_request.submit_request('AR',
'SVAINEX_P',
'',
'',
FALSE,
:parameter.invoice_store,
chr(0),
'','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','');

22, 程式中如何设置才能在点MENU上的FIND的图标时调出FIND WINDOW?(客制的ORACLE FORM中)?

在相应的QUERY_FIND里写的,最后调用到app_find.query_find

OA 中的查询可以通过2 种方法来实现:
l LOV 查询
l QUERY-WINDOW查询。
LOV 查询的实现比较简单,且适合单一条件的查询;相比来说QUERY-WINDOW 查
询的实现较繁琐,但它可以实现复杂的查询。
LOV 查询的实现
使用LOV 查询,需要按照以下步骤实现:
l 创建PARAMETER,用于保存查询变量
l 创建LOV,其返回值赋予上面定义的参数
l 创建BLOCK 级的PRE-QUERY,将LOV 返回的值赋予BLOCK 中的对应字段
l 创建BLOCK 级的QUERY-FIND。添加如下代码:
APP_FIND.QUERY_FIND(’<LOV Name>’) ;
QUERY-WINDOW查询的实现
使用QUERY-WINDOW 查询,需要按照以下步骤实现:
l 从APPSTAND 中拷贝QUERY-FIND 对象组,其中包括WIINDOW,BLOCK, CANVAS
l 更改WINDOW, BLOCK, CANVAS 的名字
l 更改按钮“NEW”的TRIGGER,编写如下代码:app_find.new(<块名> )
l 更改按钮“FIND”的TRIGGER,编写如下代码:app_find.find(<块名> )
l 设置导航属性。设置查询窗口的前导块为查询目标块,但查询窗口不能作为任何块的前导块或后续块
l 编辑KEY–NXTBLK,使之功能同按钮“FIND”
l 设置查询窗口名
l 创建PRE-QUERY 代码,例如填写查询值,用APP_FIND.QUERY_RANGE设置查询范围等
l 创建QUERY-FIND 代码,其中代码如下:
APP_FIND.QUERY_FIND(’<块所在窗口名>’,’<查询窗口名>’,’<块名>’);

方法2
1要建一个查询的数据块在这个数据块中,放置各个需要查询的数据项
然后,在FORM级的触发器QUERY_FIND中,屏蔽掉标准的代码,而写为:go_block('你的查询数据块名称');
这样,当用户点“手电筒”图标时,系统就会自动转到那个查询数据块的界面了。
2查询数据块应该单独放在一个画布中,并且单独放在一个WINDOWS中。
这样,就可以显示单独的查询窗口。

如果要实现"当点击那个手电筒,出现我要查询的数据的windows,当我选中后,他会自动显示在另外一张windows"
则要在查询数据块中放一个查询的按钮,在按钮中添加语句:go_block('要导向的结果数据块');
execute_query;
这样,用户输入好条件之后,点击“查询”按钮,就可以转到结果集窗口了。
两句一起写在按钮事件下。
在查询结果的数据块中,你可以在where条件那里直接引用查询数据块的各数据项的数据,
写在where条件中限制结果集。
方法3
1要建一个查询的数据块在这个数据块中,放置各个需要查询的数据项
然后,在FORM级的触发器QUERY_FIND中,屏蔽掉标准的代码,而写为如:
app_window.set_window_position('QUERY','CASCADE','MAIN' );--CASCADE',层叠的方式,就是把query窗口层叠在main之上
app_find.QUERY_FIND('MAIN','QUERY','QUERY');--APP_FIND.QUERY_FIND(’<块所在窗口名>’,’<查询窗口名>’,’<块名>’);
2查询数据块应该单独放在一个画布中,并且单独放在一个WINDOWS中。
则要在查询数据块中放一个查询的按钮,在按钮中添加语句:go_block('要导向的结果数据块');
execute_query;


原创粉丝点击