FORM开发相关技术(三)

来源:互联网 发布:驱动精灵mac 编辑:程序博客网 时间:2024/03/28 22:29

 

1.打开windows
--
修改PER-FORM触发器中调用第一个
form
--
修改app_custo.open_window中调用windows的名字,打开窗口

(用键盘切换当前Block或用button打开窗体时,需使用APP_CUSTOM.OPEN_WINDOW函数,语法为APP_CUSTOM.OPEN_WINDOW‘block_name’
APP_CUSTOM.OPEN_WINDOW
中又会调用app_window.set_window_position。如果是Master-Detail Block需要建立coordination关系的,在APP_CUSTOM.OPEN_WINDOW('LINES')时,调用 APP_WINDOW.SET_COORDINATION
--
对于每一个window而言,
--
app_window.set_coordination 来设置必要的关系(
procedure APP_WINDOW.SET_COORDINATION(event varchar2,coordination varchar2,relation_name varchar2);
--
其中event
The name of the trigger event (either WHEN-CHECKBOX-CHANGED,WHEN-WINDOW-CLOSED, or OPEN-WINDOW)
--coordination
IMMEDIATE or DEFERRED. Defaults to IMMEDIATE
--relation_name
Name of the relation, which is listed in the Oracle Forms Designer under the Block object in the
Relation object

--
设置窗体的位子使用app_window.set_window_position(位子包括(CASCADE, RIGHT, BELOW, OVERLAP or CENTER).
--COORDINATION
,重设
2.
关闭windows
--
与打开form相对,用APP_CUSTOM.CLOSE_WINDOW函数调用windows的名字关闭窗口

--
对于每一个窗口,用app_window.set_coordination 来设置必要的关系
--
当第一个窗口关闭时,使用APP_WINDOW.CLOSE_FIRST_WINDOW关闭form
--
避免关闭查询中的
windows
--
将光标从一个关闭的窗口移到前一个数据库上

--
hide_window隐藏制定窗口,
3.
设置window title
--
app_windows.set_title来设置context-dependent 信息

--
PRE-RECORD中调用title
当用键盘切换当前Block或用button打开窗体时,需使用APP_CUSTOM.OPEN_WINDOW函数

可以使用下面的procedure
PROCEDURE LINES(EVENT VARCHAR2) IS
BEGIN
IF (EVENT IN ('WHEN-BUTTON-PRESSED', 'KEY-NXTBLK'))
THEN APP_CUSTOM.OPEN_WINDOW('LINES');
ELSE
FND_MESSAGE.DEBUG('Invalid event passed to orders.lines: '|| EVENT);
END IF;
END LINES;
修改APP_CUSTOM.OPEN_WINDOW函数,打开windows的规则:

1.
设置windows位置;用app_window.set_window_position('你要打开的界面','打开模式--CASCADE, RIGHT, BELOW, OVERLAP or CENTER','前一个页面')

2 重置master-detail 关系(如有需要的话);如果是Master-Detail Block,则需要建立coordination关系,
APP_WINDOW.SET_COORDINATION(event varchar2,coordination varchar2,relation_name varchar2);

APP_WINDOW.SET_COORDINATION('OPEN-WINDOW'--
触发事件(包括‘WHEN–CHECKBOX–CHANGED,
WHEN–WINDOW–CLOSED, or OPEN–WINDOW)’),:control.orders_lines--
需要调用coordination的数据块(IMMEDIATE or DEFERRED. Defaults to IMMEDIATE,'ORDERS_LINES'--主从关系的名字
Name of the relation,);
3
导航到window中的一个block
go_block('block')
4
必要时需要设置窗体属性 SET_WINDOW_PROPERTY('LINES',VISIBLE,PROPERTY_TRUE);

对于APP_WINDOW.SET_COORDINATION的进一步理解:(用于主从关系中)
This call sets the deferred coordination attribute of a relation to ON or
OFF based on the state of the coordination check box. The check box is
either ”DEFERRED” or ”IMMEDIATE.”For a closed window, the relation is always ”DEFERRED.”
When coordination is set to ”DEFERRED,” AutoQuery is turned on.

coordination check box选中与否决定其取值是‘IMMEDIATE’ 还是‘DEFERRED’。如果coordination check box选中的话,
即使焦点在Master window时,Detail window中数据会于Master window同步;如果coordination check box没有选中,
Detail window
的内容不会于Master window同步,直到焦点落在Detail window时,系统才会执行查询更新数据。
这个过程自己试验一下会非常的清楚。
使用coordination check box 必须在其WHEN-CHECKBOX-CHANGED trigger中重置Master-Detail windows的同步关系。

设置上下文相关联的windows的标题:
动态设置相关联的窗体标题依靠APP_WINDOW.SET_TITLE函数,
注意在两类trigger中需要调用它。一类是Block-levelpre-recordon-insert trigger
另一类是相关联字段的when-validate-item trigger
APP_WINDOW.SET_TITLE
函数用法:

APP_WINDOW.SET_TITLE('ADJ_RECEIVE',ARAMETER.ORG_CODE);
其中ADJ_RECEIVEwindow 的名字,用于设置windowtitle

4.常用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.

5. EBS中客户化表结构的设计原则:
1)
必须包括一个主键,并建立相应的序列;
2)
建立5WHO字段,也就是
CREATED_BY NUMBER
CREATION_DATE DATE
LAST_UPDATED_BY NUMBER
LAST_UPDATE_DATE DATE
LAST_UPDATE_LOGIN NUMBER
FORM中使用属性类:CREATION_OR_LAST_UPDATE_DATEWHO字段并不会自动地被赋值,必须自己在FORM中编写代码来完成这项工作。
EBS
中提供了一个函数FND_STANDARD.SET_WHO,大家只要在FORMBLOCK级触发器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_LOGIN5个栏位赋新的值
6.form
编程规则:
*
引用字段时,使用 :BlockName.ItemName的形式;
*
使用亚元直接用dual,不要用sys.dualsystem.dual
*
使用object IDs获得更好的性能;
declare
x_id item;
begin
x_id := find_item(’block.item’);
/* your code here */
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
说明:
.
用带有LOVSitems使用lov来验证是否正确,当他们在无意识的情况下被要求保存changes会使用户感到混淆,
这种情况下,在你的post-query 触发器里面重置记录状态 :(设置当前块的属性为查询状态)
set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS);
*
必须设置为BeforetriggerWHEN-NEW-RECORD-INSTANCE WHEN-NEW-BLOCK-INSTANCEWHEN-NEW-ITEM-INSTANCE

可以设置为OverridetriggerKEY-DUPRECKEY-MENUKEY-LISTVALQUERY_FIND ACCEPT
7.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);
8.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;
9.
提交请示
关于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),
    
'','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','');

10. 程式中如何设置才能在点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;

 

原创粉丝点击