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-RECORDwhen-create-record
when-validate-itemwhen-checkbox-changed when-radio-changedwhen-list-changed‘INIT’事件。

PRE-RECORDINIT是在操作数据前初始化这些逻辑,而其他是在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’);

 

实例(引用同事已经实现的例子,这个写得不错~呵呵):

FormTrigger

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有默认值,或者查询的时候,同步2Item

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值