FORM开发笔记

1,

界面对行循环后在回到循环前的行

v_current_record number:=Get_Block_Property('block名称', Current_Record); --返回当前行号

go_record(v_current_record); --回到以前的当前行

2,Form中的系统变量,它存在于一个Form的整个运行时期的会话之中,变量包含了有关Form相关属性的字节信息。有些变量标明了当前状态,还有些变量包含了告诉Oracle如何进行相关操作的设定信息。当系统变量在表达式中出现时,system前要加上分号,表示为:system,多个变量之间用逗号分隔开,:system后面以圆点(.)连接变量名,例如:system.message_level = '25'这样的系统变量赋值操作。

Oracle Form系统变量中文总结如下:
变量名
变量描述
system.block_status
包含了当前块的状态,可有三个值:CHANGED,表明块中至少有一个记录被修改过;NEW,表明块中仅有未被修改过的记录;QUERY,表明块处于查询模式中。
system.coordination_operation
被用于块的同步过程,它与变量system.master_block合用。在块同步的过程中,变量system.master_block包含了主块的名字,变量system.coordination_operation包含了使触发器on_clear_details启动的主块中所发生的事件名称。
system.current_block
决定输入点的位置,当它出现在块、记录、项中时,它的值是块名。当pre_,post_form类触发器启动时,它的值为空(null)。
system.current_datetime
包含当前操作系统的日期和时间的字符值,默认格式为DD_MON_YYYY  HH24:MI:SS。
system.current_form
包含当前form的名称。
system.current_item
包含当前域的名字,当光标从一项移动到另一项时,这个值为空。
system.current_value
包含由system.current_item变量代表的项的值。
system.cursor_block
包含当前光标所停留的块的名字。
system.cursor_item
包含当前光标所停留的块和项的名字。
system.cursor_record
包含当前光标所停留的记录的名字。
system.cursor_value
包含当前光标所停留的项的数值。
system.custom_item_event
包含由VBX控制所引起的事件的名字。
system.custom_item_event_parameters
为VBX控制保持附加事件。
system.date_threshold
包含数据库数据重复查询临界值。此变量与$$DBDATE$$、$$DBDATETIME$$、$$DBTIMES$$变量一同使用,来控制form使用RDBMS同步数据库数据的频繁程度。数值的格式是:mi:ss(分:秒)。
system.effective_date
设置有效的数据库数据,数据格式为:DD_MON_YYYY.HH24:MI:SS。
system.event_window
包含最后一个由窗口事件触发器带来的操作所影响的窗口的名字。
system.form_status
包含含有光标的form的状态。其值可为以下一个或多个:CHANGED,NEW,QUERY。
system.last_query
在当前进程中包含用来添加一个form块的select语句。
system.last_record
包含一个在记录块集中表示当前记录是否是最后记录的布尔值。
system.master_block
与system.coordinations_operation变量一同使用,来决定由触发器on_clear_details启动的操作类型。
system.message_level
控制错误信息的显示,oracle错误信息被分配在0到25之间,间隔为5。小于这个值的错误信息将不被显示,这个值要由单引号括起。
system.mode
决定form是否处于normal、enter_query、query进程模式。
system.mouse_button_pressed
包含了点击鼠标的次数。左键值为1,从左键到右键值增长为1.
system.mouse_button_shift_state
标明了在点击鼠标时的按键。数值为:shift、control、alt。
system.mouse_canvas
包含了鼠标输入点所在的画布的名字。
system.mouse_form
包含了鼠标输入点所在的form的名字。
system.mouse_item
包含了鼠标输入点所在的item的名字。
system.mouse_record
包含了鼠标输入点所在位置的记录的个数。
system.mouse_record_offset
包含了鼠标输入点所在位置的可见记录的个数。
system.mouse_x_pos
包含了鼠标所在位置的x坐标位置。
system.mouse_y_pos 包含了鼠标所在位置的y坐标位置。
system.record_status
包含了鼠标所在位置的记录状态,其值为CHANGED、INSERT、NEW和QUERY。
system.suppress_working 包含一个在form执行时禁止显示working...信息的布尔值。True将防止显示;False反之。
system.trigger_block
包含了在当前触发器启动时鼠标所在块的名字。
system.trigger_item
包含了在当前触发器启动时鼠标所在块和项的名字。
system.trigger_record
包含了Form正在处理的记录个数。

界面 工具 菜单下挂 form

在 WHEN-NEW-FORM-INSTANCE 的触发器中写:

APP_SPECIAL.INSTANTIATE('SPECIAL11','批量导入');
APP_SPECIAL.INSTANTIATE('SPECIAL12','手工关闭', 'xxhanlj', TRUE, 'LINE');--
APP_SPECIAL.INSTANTIATE('SPECIAL13','零件表导入', 'xxhanljdr', TRUE, 'LINE');

然后在form的触发器中创建SPECIAL13触发器,并在其中写逻辑

FORM表单的查询方法:

1、使用:parameter.G_query_find参数;

IF (NAME_IN('PO_HEADERS.PO_HEADER_ID') IS NOT NULL) THEN 
   :parameter.G_query_find := 'TRUE'; 
   app_find.find('CUX_PO_HEADERS_ADD_MESSAGE'); 
   :parameter.G_query_find := 'FALSE'; 
ELSE 
   FND_MESSAGE.DEBUG('请先保存订单头'); 
END IF;

在CUX_PO_HEADERS_ADD_MESSAGE的PRE-BLOCK中处理 
  copy(name_in('PO_HEADERS.PO_HEADER_ID'),'CUX_PO_HEADERS_ADD_MESSAGE.PO_HEADER_ID');

在CUX_PO_HEADERS_ADD_MESSAGE的pre_query里加

app_query.reset('块名'); 

app_query.append('PO_HEADERS',' SEGMENT1 like '||chr(39)||:PARAMETER.PO_NUM||'%'||chr(39) );

2、使用Default_where属性处理 
declare 
  lv_default varchar2(2000); 
begin 
  lv_default:='.....'; 
  go_block('CUX_PO_HEADERS_ADD_MESSAGE'); 
  set_block_property('CUX_PO_HEADERS_ADD_MESSAGE',DEFAULT_WHERE,lv_default); 
  execute_query; 
end;

 一段程序:

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

-- Create override record group if not exist else clear record group
procedure initialize_override_group is
rg_name VARCHAR2(40) := 'OVERRIDE_FIELDS';
rg_id RecordGroup;
gc_id GroupColumn;

BEGIN
rg_id := FIND_GROUP( rg_name );
if id_null(rg_id) then
rg_id := create_group(rg_name);
gc_id := add_group_column(rg_id, 'ROW_ID', CHAR_COLUMN, 20);
gc_id := add_group_column(rg_id, 'FIELD_NAME', CHAR_COLUMN, 20);
gc_id := add_group_column(rg_id, 'FIELD_VALUE', CHAR_COLUMN, 80);
gc_id := add_group_column(rg_id, 'FIELD_VALUE_CODE', CHAR_COLUMN, 30);
gc_id := add_group_column(rg_id, 'LIMITING_VALUE', CHAR_COLUMN, 30);
gc_id := add_group_column(rg_id, 'REQUIRED_FLAG', CHAR_COLUMN, 1);
--Project Classifications changes
--Ansari
gc_id := add_group_column(rg_id, 'SELECT_FLAG', CHAR_COLUMN, 1);
gc_id := add_group_column(rg_id, 'code_percent', NUMBER_COLUMN);
--Project Classifications changes
--Ansari
else
delete_group_row(rg_id, ALL_ROWS);
end if;
END initialize_override_group;

rg_id RecordGroup;
rg_col1 GroupColumn;
rg_col2 GroupColumn;
rg_col3 GroupColumn;
rg_col4 GroupColumn;

rg_id := find_group('OVERRIDE_FIELDS');
row_count := get_group_row_count(rg_id);

rg_col1 := find_column('OVERRIDE_FIELDS.FIELD_NAME');
rg_col2 := find_column('OVERRIDE_FIELDS.FIELD_VALUE');
rg_col3 := find_column('OVERRIDE_FIELDS.FIELD_VALUE_CODE');
rg_col4 := find_column('OVERRIDE_FIELDS.LIMITING_VALUE');

for i in 1..row_count LOOP

if (Get_Group_Char_Cell( rg_col1, i) = 'KEY_MEMBER' and
Get_Group_Char_Cell( rg_col2, i) is not null ) then

x_field_value_id := to_number(Get_Group_Char_Cell( rg_col3, i));
x_limiting_value := Get_Group_Char_Cell( rg_col4, i);

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

form中打印报表:

先调用请求:

v_Bool := Fnd_Request.Add_Layout(Template_Appl_Name => 'CUX'
,Template_Code => 'CUXQA' || l_Program_Code-- || 'PRINT'
,Template_Language => 'zh'
,Template_Territory => 'CN'
--,Output_Format => 'PDF'
,Output_Format => p_print_type);

v_Req_Id_1 := Fnd_Request.Submit_Request('CUX'
,'CUXQA' || l_Program_Code-- || 'PRINT'
,NULL
,NULL
,FALSE
,:Cux_Qa_Report_Headers.Header_Id
,v_Work_Num
,l_Report_Date);

COMMIT;

等待请求结果:

f_Bool := Fnd_Concurrent.Wait_For_Request(v_Req_Id_1
,1
,0
,l_Phase
,l_Status
,l_Dev_Phase
,l_Dev_Status
,l_Message);

显示结果:

 Editor_Pkg.Report(Req_Id, 'Y'); -- 报表输出 要在附加数据库和PL/DQL程序库中加入FNDCONC.pll文件

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

form总调用package,网页结果

v_command := fnd_profile.VALUE ('APPS_WEB_AGENT');
v_command := v_command || '/Cinv_Print_Doc.Print_Issueord1?p_Organization_Id=' || :ORDER_HEADER.ORGANIZATION_ID;
v_command := v_command || '&p_Doc_Id=' || :ORDER_HEADER.HEADER_ID;
v_command := v_command || '&p_Doc_type=' || :ORDER_HEADER.DOC_TYPE_NAME;
--v_command := v_command || '&p_doc_num_from=' || :ORDER_HEADER.DOC_NUMBER;
--v_command := v_command || '&p_Doc_Num_To =' || :ORDER_HEADER.DOC_NUMBER;
v_command := v_command || '&p_Date_From=' || NULL;
v_command := v_command || '&p_Date_To=' || NULL;
v_command := v_command || '&p_Create_By=' || :ORDER_HEADER.CREATED_BY;
v_command := v_command || '&p_Print_Person=' || V_PRN_PERSON;
web.show_document (v_command, '_blank');

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

form中加提示消息

FND_MESSAGE.SET_STRING('请重新查询记录');
FND_MESSAGE.HINT;

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

Dependencies item(相依性Item)的编程
语法:

--建立相依字段的属性
APP_FIELD.SET_DEPENDENT_FIELD(EVENT,:block.master_item = CONDITION,‘block.dependent_item’);

注意:设定一次即可一直使用Dependencies属性。

--清除相依字段的数据

app_field.clear_dependent_fields('HEADER.REQUESTER_NAME', 'HEADER.REQUESTER_ID');

---建立Required Field

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’);

具体步骤:

1,  Pre-record的时候,最好要将所有的Dependent field初始化。有的删除,一定需要的可以建立。

2,  建立的Procedure最好要系统化,子程序化。使得相互之间可以调用。例子:见R11i test form的:dependent item sql sample.sql

3,  通常在以下的trigger中调用Dependencies控制逻辑:

PRE-RECORD,when-create-record,
when-validate-item,when-checkbox-changed, when-radio-changed,when-list-changed和‘INIT’事件。

PRE-RECORD和INIT是在操作数据前初始化这些逻辑,而其他是在item发生变化后验证这些逻辑,满足条件则进行后续的动作。

需要注意的是,设置了Dependent的关系的Item,在其主变化时候,相依的Item会自动清空。但是仅仅会清空相依的那一个字段。

如果相依的字段,还有自己相依的字段(比如Show值,但是存ID,或者Show值,另外还有描述等信息),如果想一起清空,要用:app_field.clear_dependent_fields

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

Eg:

APP_FIELD.SET_DEPENDENT_FIELD(EVENT,

:block.master_item = CONDITION,

’block.dependent_item’);

APP_FIELD.SET_DEPENDENT_FIELD(EVENT,

((:block.master_item1 IS NOT NULL) AND

(:block.master_item2 IS NOT NULL)),

’block.dependent_item’);

APP_FIELD.SET_EXCLUSIVE_FIELD(EVENT,

’block.item1’,

’block.item2’,

’block.item3’);

APP_FIELD.SET_INCLUSIVE_FIELD(EVENT,

’block.item1’,

’block.item2’);

APP_FIELD.SET_REQUIRED_FIELD(EVENT,

(CONDITION),

’block.item’);

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

原文地址:https://www.cnblogs.com/gary-bao/p/4932721.html