可以調用APP_FIELD.clear_dependent_fields和APP_FIELD.set_dependent_field來將兩個(或多個)Item建立關聯,當一個為空時,另一個不可錄入,反正,可錄入,且父Item Field變化時,子Fields清空。 ---------------------------------------------------------------------------------------------------------------------------------- APP_FIELD.clear_dependent_fields( master_field VARCHAR2, field1 VARCHAR2, field2 VARCHAR2 DEFAULT NULL, field3 VARCHAR2 DEFAULT NULL, field4 VARCHAR2 DEFAULT NULL, field5 VARCHAR2 DEFAULT NULL, field6 VARCHAR2 DEFAULT NULL, field7 VARCHAR2 DEFAULT NULL, field8 VARCHAR2 DEFAULT NULL, field9 VARCHAR2 DEFAULT NULL, field10 VARCHAR2 DEFAULT NULL) 實現:如果master_field為空,則清空后續所有fieldn. ---------------------------------------------------------------------------------------------------------------------------------- APP_FIELD.set_dependent_field( even VARCHAR2, master_field VARCHAR2, dependent_field VARCHAR2, invalidate BOOLEAN DEFAULT FALSE) 實現:如果master_field為空,則dependent_Field的ENTERABLE為PROPERTY_OFF; 反之, 如果master_field不空,則dependent_Field的ENTERABLE為PROPERTY_ON。 event可以為'..VALIDATE..','INIT','PRE-RECORD', 'WHEN-NEW-RECORD-INSTANCE','POST-QUERY'。 這個Procedure其實調用了另外一個Procedure APP_FIELD.set_dependent_field( event VARCHAR2, condition BOOLEAN, dependent_field VARCHAR2, invalidate BOOLEAN DEFAULT FALSE) 條件condition為(name_in(master_field) is not null) ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- 附Procedure原碼: PROCEDURE clear_dependent_fields(master_field VARCHAR2, field1 VARCHAR2, field2 VARCHAR2 DEFAULT NULL, field3 VARCHAR2 DEFAULT NULL, field4 VARCHAR2 DEFAULT NULL, field5 VARCHAR2 DEFAULT NULL, field6 VARCHAR2 DEFAULT NULL, field7 VARCHAR2 DEFAULT NULL, field8 VARCHAR2 DEFAULT NULL, field9 VARCHAR2 DEFAULT NULL, field10 VARCHAR2 DEFAULT NULL) IS BEGIN COPY('Entering app_field.clear_dependent_fields.','global.frd_debug'); if (name_in(master_field) is null) then clear_fields(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10); end if; COPY('Completed app_field.clear_dependent_fields.','global.frd_debug'); END clear_dependent_fields; PROCEDURE set_dependent_field(event VARCHAR2, master_field VARCHAR2, dependent_field VARCHAR2, invalidate BOOLEAN DEFAULT FALSE) IS BEGIN COPY('Entering app_field.set_dependent_field. Event is '||event||'.','global.frd_debug'); set_dependent_field(event, (name_in(master_field) is not null), dependent_field, invalidate); COPY('Completed app_field.set_dependent_field. Event is '||event||'.','global.frd_debug'); END set_dependent_field; PROCEDURE set_dependent_field(event VARCHAR2, condition BOOLEAN, dependent_field VARCHAR2, invalidate BOOLEAN DEFAULT FALSE) IS value NUMBER; itemtype VARCHAR2(32); BEGIN COPY('Entering app_field.set_dependent_field. Event is '||event||'.','global.frd_debug'); if (condition) then value := PROPERTY_ON; else value := PROPERTY_OFF; end if; if ((instr(event, 'VALIDATE') <> 0) or (event = 'INIT')) then app_item_property.set_property(dependent_field, ENTERABLE, value); itemtype := get_item_property(dependent_field, item_type); if invalidate then set_item_property(dependent_field, ITEM_IS_VALID, PROPERTY_FALSE); elsif not(itemtype = 'CHECKBOX' or (itemtype = 'LIST' and get_item_property(dependent_field, required) = 'TRUE')) then if (name_in(dependent_field) is not null) then copy('', dependent_field); end if; end if; elsif (event in ('PRE-RECORD', 'WHEN-NEW-RECORD-INSTANCE')) then app_item_property.set_property(dependent_field, ENTERABLE, value); elsif (event = 'POST-QUERY') then -- -- In R11 this set the visual attribute. Now we get the coloring -- by setting the enterable property -- app_item_property.set_property(dependent_field, ENTERABLE, value); else fnd_message.debug('DEVELOPER ERROR: Invalid arg '|| event||' to set_dependent field'); end if; COPY('Completed app_field.set_dependent_field. Event is '||event||'.','global.frd_debug'); EXCEPTION when OTHERS then app_debug.setpoint('app_field.set_dependent_field', event||', '||dependent_field); RAISE; END set_dependent_field;