Form开发技巧:Dependencies item(相依性Item)的编程
一直觉得相依性的Item的编程是Form比较好用的编程效果之一。
现在总结一下写法,另外,后面还有一个样例。根据样例,编写起来更加快捷!~
------------------------------
一。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’);
实例(引用同事已经实现的例子,这个写得不错~呵呵):
Form级Trigger:
PRE-RECORD
XYG_HEADERS_DEPENDENT.SALES_ORG_NAME('PRE-RECORD');
XYG_HEADERS_DEPENDENT.ORDER_TYPE_NAME('PRE-RECORD');
XYG_HEADERS_DEPENDENT.PARTY_NAME('PRE-RECORD');
XYG_HEADERS_DEPENDENT.ACCOUNT_NAME('PRE-RECORD');
WHEN-VALIDATE-ITEM
IF :SYSTEM.CURRENT_ITEM IN ('SALES_ORG_NAME','ORDER_TYPE_NAME','PARTY_NAME','ACCOUNT_NAME')
THEN
XYG_VALIDATE_PKG.HEADERS_DEPENDENT(:SYSTEM.CURRENT_ITEM);
END IF;
----------对应的pkg:
PACKAGE XYG_HEADERS_DEPENDENT IS
PROCEDURE SALES_ORG_NAME(EVENT VARCHAR2);
PROCEDURE ORDER_TYPE_NAME(EVENT VARCHAR2);
PROCEDURE PARTY_NAME(EVENT VARCHAR2);
PROCEDURE ACCOUNT_NAME(EVENT VARCHAR2);
END;
PACKAGE BODY XYG_HEADERS_DEPENDENT IS
PROCEDURE SALES_ORG_NAME(EVENT VARCHAR2)
IS
BEGIN
IF (EVENT = 'WHEN-VALIDATE-ITEM') THEN
ORDER_TYPE_NAME('INIT');
PARTY_NAME('INIT');
ELSIF UPPER(EVENT) IN ('PRE-RECORD', 'INIT', 'POST-QUERY') THEN
APP_FIELD.SET_DEPENDENT_FIELD( EVENT
,( :HEADERS.CONTRACT_NUMBER IS NOT NULL )
,'HEADERS.SALES_ORG_NAME'
);
ORDER_TYPE_NAME(EVENT);
PARTY_NAME(EVENT);
APP_FIELD.CLEAR_DEPENDENT_FIELDS(
'HEADERS.SALES_ORG_NAME'
,'HEADERS.SALES_ORG_ID'
);
END IF;
END SALES_ORG_NAME;
PROCEDURE ORDER_TYPE_NAME(EVENT VARCHAR2)
IS
BEGIN
IF (EVENT = 'WHEN-VALIDATE-ITEM') THEN
NULL;
ELSIF UPPER(EVENT) IN ('PRE-RECORD', 'INIT', 'POST-QUERY') THEN
APP_FIELD.SET_DEPENDENT_FIELD( EVENT
,( :HEADERS.SALES_ORG_NAME IS NOT NULL )
,'HEADERS.ORDER_TYPE_NAME'
);
APP_FIELD.CLEAR_DEPENDENT_FIELDS(
'HEADERS.ORDER_TYPE_NAME'
,'HEADERS.ORDER_TYPE_ID'
,'HEADERS.EXPORT_CODE'
,'HEADERS.CURR_CODE'
);
END IF;
END ORDER_TYPE_NAME;
PROCEDURE PARTY_NAME(EVENT VARCHAR2)
IS
BEGIN
IF (EVENT = 'WHEN-VALIDATE-ITEM') THEN
ACCOUNT_NAME('INIT');
ELSIF UPPER(EVENT) IN ('PRE-RECORD', 'INIT', 'POST-QUERY') THEN
APP_FIELD.SET_DEPENDENT_FIELD( EVENT
,( :HEADERS.SALES_ORG_NAME IS NOT NULL )
,'HEADERS.PARTY_NAME'
);
ACCOUNT_NAME(EVENT);
APP_FIELD.CLEAR_DEPENDENT_FIELDS(
'HEADERS.PARTY_NAME'
,'HEADERS.PARTY_ID'
);
END IF;
END PARTY_NAME;
PROCEDURE ACCOUNT_NAME(EVENT VARCHAR2)
IS
BEGIN
IF (EVENT = 'WHEN-VALIDATE-ITEM') THEN
NULL;
ELSIF UPPER(EVENT) IN ('PRE-RECORD', 'INIT', 'POST-QUERY') THEN
APP_FIELD.SET_DEPENDENT_FIELD( EVENT
,( :HEADERS.SALES_ORG_NAME IS NOT NULL AND :HEADERS.PARTY_NAME IS NOT NULL)
,'HEADERS.ACCOUNT_NAME'
);
APP_FIELD.CLEAR_DEPENDENT_FIELDS(
'HEADERS.ACCOUNT_NAME'
,'HEADERS.ACCOUNT_NUMBER'
,'HEADERS.CUSTOMER_ID'
);
END IF;
END ACCOUNT_NAME;
END;
---------------------------------------------------------------------------------------------------------------------
---2012.12.5
二。另外一种,基本可以实现相依性Item效果的做法:
其实相依性Item的效果就是“联动”,就是一个Item有变更(清空或者更改),另外一个(或者几个)也清空。
按照这个想法,可以用这个方法做。只使用少数几个Item的相依性实现。如果Item多的话,还是建议用标准的做法(就是上面说的办法)。
1 先建立一个非数据库的Item,作为变更的item的“对比用”。就是对比一下,Item是否有被改变。
2 当Item有默认值,或者查询的时候,同步2个Item。
POST-QUERY:
:MOVE_RETIRE.RETIRE_GROUP_CODE_N := :MOVE_RETIRE.RETIRE_GROUP_CODE;
---------
WHEN-CREATE-RECORD:
:MOVE_RETIRE.RETIRE_GROUP_CODE_N := :MOVE_CONTROL.GROUP_CODE;
3 当Item变更的时候,判断是否有变化,有变化则实现相依性的清空其关联的Item的效果:
WHEN-VALIDATE-ITEM:
--当清空的时候:
IF :MOVE_RETIRE.RETIRE_GROUP_CODE IS NULL THEN
:MOVE_RETIRE.RETIRE_CHARGE_NUMBER := NULL;
:MOVE_RETIRE.RETIRE_CHARGE_FNAME := NULL;
:MOVE_RETIRE.RETIRE_CHARGE_PID := NULL;
RETURN;
END IF;
--当有变化的时候:
IF :MOVE_RETIRE.RETIRE_GROUP_CODE <> NVL(:MOVE_RETIRE.RETIRE_GROUP_CODE_N,'NULL') THEN
:MOVE_RETIRE.RETIRE_GROUP_CODE_N := :MOVE_RETIRE.RETIRE_GROUP_CODE;
:MOVE_RETIRE.RETIRE_CHARGE_NUMBER := NULL;
:MOVE_RETIRE.RETIRE_CHARGE_FNAME := NULL;
:MOVE_RETIRE.RETIRE_CHARGE_PID := NULL;
END IF;
更多推荐
所有评论(0)