Form 相关技巧

---------------------------------------------------------------

1.一进页面就能看到表中已生成数据,而不用按ctrl+f11进行查询的语句:

在form级的触发器when-new-form-instance中,
写如下代码:
go_block('XXXX');
execute_query;
要查询的数据块的名称

说明:
当使用基于表建立的块时,可使用块里的任何项的GO_BLOCK或者GO_ITEM找到那个块
当查询数据到一个块里去,可通过execute_query进行处理

补充:用DELETE_RECORD从块中删除当前记录,要改变数据库的记录,必须使用COMMIT_FORM

2, 什么办法可以控制form中File菜单中的Export吗?使其失效
答:
在FORM中,在FORM级的触发器EXPORT中,
将其中的代码app_standard.event('EXPORT');屏蔽掉,改为null;试一试

3当form 启动时,在pre-form触发器中instantiate你特定的菜单items
调用 app_special.instantiate包
procedure APP_SPECIAL.INSTANTIATE(
option_name varchar2, --定义tigger 名字
hint varchar2 default null,--定义菜单实体的名字,使用&来定义菜单实体的键盘快捷键
icon varchar2 default null,--
initially_enabledboolean default true,
separator varchar2 default null);--定义'LINE'为separator 
例子
app_special.instantiate(’SPECIAL1’,’&rint Order’,’PRINTORD’);


4, 在tool 菜单中的check boxes
--option_name 与trigger_name 包括关键字CHECKBOX(例如:SPECIAL3_CHECKBOX)
app_special.instantiate(’SPECIAL3_CHECKBOX’,’Spe&cial 3 Box w Line’, ’’,TRUE,’LINE’);

--调用app_special.set_checkbox 来初始化check box 的值
app_special.set_checkbox(’SPECIAL3_CHECKBOX’,’TRUE’);

--在SPECIALn_CHECKBOX函数中和相应的逻辑代码中测试check box
app_special.get_checkbox
if (app_special.get_checkbox(’SPECIAL3_CHECKBOX’)=’TRUE’) then
fnd_message.debug(’Special 3 is True!’);
else
fnd_message.debug(’Special 3 is False!’);
end if;

5, 在你在pre-form 中instantiate实体, 随意将指定的菜单实体设置为可用或不可用(基于数据块),
调用APP_SPECIAL.ENABLE
procedure APP_SPECIAL.ENABLE(option_name varchar2,
state);
在form-level 中的pre-block trigger里面,将你的special 菜单的item 定义为disable
app_special.enable(’SPECIAL1’,PROPERTY_OFF);
在form-level 中的pre-block trigger里面,将你的special 菜单的item 定义为able
app_special.enable(’SPECIAL1’,PROPERTY_on);
将所有的special 菜单设置为 disable
app_special.enable(’SPECIAL’,PROPERTY_OFF);

6, 编辑鼠标右键菜单
调用APP_POPUP.INSTANTIATE(block或者item层的PRE-POPUPMENU Trigger)
procedure APP_POPUP.INSTANTIATE(
option_name varchar2,
txt varchar2,
initially_enabled boolean default true,
separator varchar2 default null);
与app_special.instantiate类似
例如:
APP_POPUP.INSTANTIATE('POPUP1','First Entry');

7, 关于 Implementing Zoom Use the Custom Library的学习:
1. .pll文件可以用form builder 打开,修改,创建
2. .pll文件的编译方法:
f60gen module=CUTOM.PLL userid=apps/apps module_type=LIBRARY
3. 当系统不自动激活菜单上的图标时,可以在数据块的 block-level 的 when-new-block-instance trigger中
添加如下代码:
以zoom为例子:set_menu_item_property('VIEW.ZOOM',ENABLED,PROPERTY_TURE)
在form-level 的相应的trigger(比如zoom trigger)中改写下列代码:
custom.event('ZOOM')
4. fnd_function.exrcute语法:
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);
5.FND_FUNCTION.TEST(function_name IN varchar2)
测试指定的函数是否可以连接,该函数用于form 启动时测试函数的可用性,


8, 弹性域(Flexfields)的总结:

使用 FND_KEY_FLEX.DEFINE 在item handler 中设定key弹性域的定义
procedure flexfield_item_name(event varchar2)
is
begin
fnd_key_flex.define(
block=>'block_name',
field=>'concatenated_segements_field_name',
id=>'ccid_field_name',
appl_short_name=>'shortname_of_application_used_to_register_flexfield',
code=>'flexfield_code',
NUM=>'structure_number',
any_other_auguments);
)

例:
FND_KEY_FLEX.DEFINE(
BLOCK=>’LINES’,
FIELD=>’ACCTG_FLEX_VALUES’,
ID=>’GL_ACCOUNT_CC_ID’,--Your ID field is the GL_ACCOUNT_CC_ID item
APPL_SHORT_NAME=>’SQLGL’,
CODE=>’GL#’,
NUM=>’101’--可以使用GL_SET_OF_BOOKS_ID 作为structure id
);
----------------------------------------------------------------------------------
使用FND_DESCR_FLEX.DEFINE 在item handler 中设定描述性弹性域的定义
定义
FND_DESCR_FLEX.DEFINE(
BLOCK=>'BLOCK_NAME',
FIELD=>'DISPLAYED_FLEXFIELD_FIELD_NAME',
APPL_SHORT_NAME=>'SHORTNAME_OF_APPLICATION_USED_TO_REGISTER_FLEXFIELD',
DESC_FLEX_NAME=>'FLEXFIELD_NAME',
ANY_OTHER_ARGUMNTS);

FND_DESCR_FLEX.DEFINE(
BLOCK=>’ORDERS’,
FIELD=>’DESC_FLEX’,
APPL_SHORT_NAME=>’DEM’,
DESC_FLEX_NAME=>’DEM_ORDERS’);

)


9, COPY 命令
Copies a value from one item or variable into another item or global variable. 
Syntax
PROCEDURE COPY(source VARCHAR2, destination VARCHAR2)

Parameters
source: The source is a literal value.

destination: The destination can be either a text item or another global variable.

例:
COPY( 'Yes', 'GLOBAL.'||global_var_name );
将‘YES’付值给 变量global_var_name


10, message 用法总结:

1.设置信息:
--FND_MESSAGE.SET_NAME 语法:
procedure FND_MESSAGE.SET_NAME(application_shortnameIN varchar2,message_name IN varchar2);
作用:
从Message Dictionary获取一条信息
一般情况下在FORM中显示出错信息使用以下代码:
FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;
FND_MESSAGE.ERROR ;

--FND_MESSAGE.RETRIEVE
作用:
取得一条数据库中的等待信息
--FND_MESSAGE.SET_STRING (value IN varchar2)
作用:
将字符串放到消息栈中,

--FND_MESSAGE.SET_TOKEN
作用:用值替换message的信息中的变量
语法:
procedure FND_MESSAGE.SET_TOKEN(token_name IN VARCHAR2,value IN VARCHAR2
translate IN boolean default FALSE);

--在form用于显示信息的函数
1.FND_MESSAGE.ERROR
2.FND_MESSAGE.WARN
例子
Example:
FND_MESSAGE.SET_NAME(’SQLAP’,’AP_PAY_MULTI_PAY_VOID’);
REC_COUNT:= <NUMBER OF PAYMENTS>;
FND_MESSAGE.SET_TOKEN(’NUM_OF_RECS’,REC_COUNT);
IF (NOT FND_MESSAGE.WARN) THEN
Raise FORM_TRIGGER_FAILURE;
END IF;

3.FND_MESSAGE.QUESTION
语法:
FND_MESSAGE.QUESTION(
button1 IN varchar2 default ‘YES’,
button2 IN varchar2 default ‘NO’,
button3 IN varchar2 default ‘CANCEL’;
default_btn IN number default 1,
cancel_btn IN number default 3,
icon IN varchar2 default ‘question’) return number;
说明:
FND_MESSAGE.QUESTION 返回一个被选中的button的number
Example:
FND_MESSAGE.SET_NAME(’FND’,’ATCHMT-COMMIT BEFORE INVOKING’);
IF FND_MESSAGE.QUESTION
(’YES’,’CANCEL’,NULL,1,2,NULL) = 2 THEN
RAISE FORM_TRIGGER_FAILURE;
END IF;
4.FND_MESSAGE.SHOW
作用:显示信息
5.FND_MESSAGE.DEBUG
6.FND_MESSAGE.GET
作用:
取得在message中设置好的message信息


11 设置Item-level和Item-instance-level属性时需特别的注意,
Item-level属性影响所有的记录,而Item-instance-level属性只影响特定的记录(当前行)。

12fotmatting currency fields( 货币的转换和格式化)

FND_CURRENCY:The Dynamic Currency feature allows different values in arbitrary currencies to be displayed in
the same report or form, each shown with appropriate formatting.
FND_CURRENCY.GET_FORMAT_MASK(:ORDERS.CURRENCY_CODE,GET_ITEM_PROPERTY('LINES.PRICE',MAX_LENGTH));
1.取得需对应的货币
其中:GET_ITEM_PROPERTY('LINES.PRICE',MAX_LENGTH)为返回一个该item的最大长度,
FND_CURRENCY.GET_FORMAT_MASK(currency_code IN varchar2,field_length IN number)return varchar2;

2.格式化(需要的话进行汇率转换)item的货币类型
APP_ITEM_PROPERTY.SET_PROPERTY('LINES.PRICE',FORMAT_MASK,
FND_CURRENCY.GET_FORMAT_MASK(:ORDERS.CURRENCY_CODE,
GET_ITEM_PROPERTY('LINES.PRICE',MAX_LENGTH) ))
3.动态控制item的显示格式的触发范围
在Block-level的Post-query trigger和Item-level的 when-validate-item trigger调用handler,控制显示格式。


CALENDAR 日历
如何实现在form中弹出calendar并返回所选日期的功能?
1.设text item为日期型, LOV属性为:ENABLE_LIST_LAMP并且Validate from List LOV—>No
2.在该text item 的KE_LISTVAL下加入如下代码:calendar.show;
trigger属性Execution Hierarchy—>Override,fire in enter-query mode—>No。

使用APP_DATE.FND_DATE取得服务器端的时间环境

13 , Dependencies item的编程
语法:
1.APP_FIELD.SET_DEPENDENT_FIELD(EVENT,:block.master_item = CONDITION,
‘block.dependent_item’);
用途:A conditionally-dependent item changes validation when the value in the master
item changes. Specify the condition rather than the master item name.

This procedure makes an item enterable or not enterable based on whether the master item
is NULL or a specified condition is TRUE, and clears the field. The dependent item can be
a text item, check box, or poplist.
You typically call this procedure in the following triggers:
? WHEN–VALIDATE–ITEM on the master field
? WHEN–VALIDATE–ITEM on the field(s) the condition is based on or in event INIT
on the dependent field
? PRE–RECORD
? POST–QUERY (required only when the dependent item is in a
multi–record block)

:block.master_item = CONDITION包括:
--APP_FIELD.SET_DEPENDENT_FIELD(EVENT,(:block.master_item IS NOT NULL),
’block.dependent_item’);用于Multiple items may depend on a single master.

--APP_FIELD.SET_DEPENDENT_FIELD(EVENT,((:block.master_item1 IS NOT NULL) AND
(:block.master_item2 IS NOT NULL)),’block.dependent_item’);
用于Two master items may share a dependent item.

--APP_FIELD.SET_DEPENDENT_FIELD(EVENT,’block.master_item,’block.dependent_item’);
用于Cascading dependence - an item can be both master and dependent.

2.APP_FIELD.SET_EXCLUSIVE_FIELD
用途Mutually exclusive items—they look like two items, but behave as one. Use
APP_FIELD.SET_EXCLUSIVE_FIELD to code.
--APP_FIELD.SET_EXCLUSIVE_FIELD(EVENT,’block.item1’,’block.item2’,’block.item3’);
Call item handler procedures in:
– WHEN-VALIDATE-ITEM for each exclusive item
– PRE-RECORD on the items’ block (Fire in Enter-Query Mode: No)
– WHEN-CREATE-RECORD on the items’ block

3.APP_FIELD.SET_INCLUSIVE_FIELD
用途Mutually Inclusive Items—one for all and all for one!
Use APP_FIELD.SET_INCLUSIVE_FIELD to code a set of items where, if any
of the items is not null, all items are required.

--APP_FIELD.SET_INCLUSIVE_FIELD(EVENT,’block.item1’,’block.item2’);
? Call item handler procedures in:
– WHEN-VALIDATE-ITEM for each inclusive item
– PRE-RECORD on the items’ block (Fire in Enter-Query Mode: No)

4.APP_FIELD.SET_REQUIRED_FIELD
用途:Conditionally Mandatory items—use APP_FIELD.SET_REQUIRED_FIELD to
require certain items only if a certain condition is met.

--APP_FIELD.SET_REQUIRED_FIELD(EVENT,(CONDITION),’block.item’);
通常在以下的trigger中调用Dependencies控制逻辑:PRE-RECORD,when-create-record,
when-validate-item,when-checkbox-changed, when-radio-changed,when-list-changed
和‘INIT’事件。PRE-RECORD和INIT是在操作数据前初始化这些逻辑,而其他是在item发生变化后验证这些逻辑,满足条件则进行后续的动作。
------------------------------------------------------------------------------
使用APP_ITEM_PROPERTY.SET_PROPERTY代替SET_ITEM_PROPERTY设置item属性

APP_ITEM_PROPERTY.SET_PROPERTY modifies the following properties:
? DISPLAYED
? ENABLED
? ENTERABLE
? ALTERABLE (item instance level)
? ALTERABLE_PLUS (item level)
? REQUIRED
注意:
在APP_ITEM_PROPERTY.SET_PROPERTY使用 item id 或者 block.item_name
语法:
item_id := Find_item(’block_name.item_name’);
app_item_property.set_property(item_id,property_name,setting);
等同于
app_item_property.set_property(’block_name.item_name’,property_name,setting);

14 , Tab Related Code
Tab-related Variables 与Tab-related相关的变量
? :SYSTEM.TAB_NEW_PAGE
– name of the tab page the user clicked on(取得用户点击后的tab 页)
? :SYSTEM.EVENT_CANVAS
– name of canvas that owns the newly-selected tab page(取得用户新点击的画布)
? :SYSTEM.TAB_PREVIOUS_PAGE
– name of the tab page that was topmost before the user
clicked on the new one(取得在用户点击新的页面前的tab页)

Dynamically Changing Tabs
? Dynamically hide tabs only at form startup.
– set_tab_page_property(...VISIBLE)
? Dynamically enabling/disabling tabs.
– set_tab_page_property(...ENABLED...)

Tab-related Trigger
? WHEN-TAB-PAGE-CHANGED
– fires only when user clicks on a tab
– cannot be fired programmatically
– can only exist at the form level


target_canvas_name VARCHAR2(30) := :system.tab_new_page;--取得当前用户点击的tab页
curr_canvas_name VARCHAR2(30) := get_item_property(:system.cursor_item,item_canvas);--返回当前画布的名称
current_tab VARCHAR2(30) := get_canvas_property('TAB_LINES_REGIONS',topmost_tab_page);
--返回在tab画布上的顶层的tab页的名字

set_canvas_property('TAB_LINES_REGIONS', topmost_tab_page, curr_canvas_name); --将当前的画布设为可交换页顶层的tab


15, Window 与Region Behavior 编程:
WINDOW的控制:(使用app_window 包来取得标准的窗口控制动作)
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-level的pre-record和on-insert trigger,
另一类是相关联字段的when-validate-item trigger
APP_WINDOW.SET_TITLE函数用法:
APP_WINDOW.SET_TITLE('ADJ_RECEIVE',ARAMETER.ORG_CODE);
其中ADJ_RECEIVE是window 的名字,用于设置window的title

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’);
/* 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说明:
.用带有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;


转自:http://blog.163.com/xialingge2006@126/blog/static/1028229020097831826287/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值