您的位置:首页 > 其它

FORM 开发相关技巧3

2013-11-07 13:25 337 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息