Define a KFF step by step
Author:?????????????????????????Pan Tian
Creation Date:????????????04/05/2012
Last Updated:?????????????
Version:????????????????????????
Status:???????????????????????????
Contents
Define a KFF step by step??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1
BaseTable表增加一个外键列??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1
Block中创建一个Flexfield的隐藏item??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1
Block中创建一个Flexfield显示字段?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1
?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????2
When-New-Form-Instance中加入FlexField的定义????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????2
Trigger中调用FlexField标准的方法??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????3
Flexfield相关的API?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????4
FlexField的相关表??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????8
?
?
Define a KFF step by step BaseTable?表增加一个外键列 在Base Table?中定义一个字段?XXX_ID?,这个用于保存?KFF表记录的主键(对于?Base Table?就是外键列),比如对于本例,如果要增加一个?Account?的KFF?,需要在?Base Table?上增加一个?XXX_ID外键字段用于保存捕获的?CODE_COMBINATION_ID Block?中创建一个?Flexfield的隐藏?item Block中定义一个隐藏字段用于保存上边一步创建的?FK?字段,设置?canvas为?NULL?,TEXT_ITEM property class Block?中创建一个?Flexfield显示字段 创建了隐藏字段,当然要创建一个显示的字段让用户来输入,这里我们需要创建一个?non-database?字段用来展示合并的科目值,?subclass Information?继续使用TEXT_ITEM,?设置合适?canvas?来显示,LOV?设置为?'ENABLE_LIST_LAMP',?'Validate from list' is set to No ????????????????????????????????????????????????? When-New-Form-Instance?中加入FlexField?的定义 在When-New-Form-Instance?中加入?FlexField的定义,当然好的戏,代码类似于 ???????? SELECT CHART_OF_ACCOUNTS_ID INTO :PARAMETER.CHART_OF_ACCOUNTS_ID FROM ORG_ORGANIZATION_DEFINITIONS WHERE ORGANIZATION_ID = :PARAMETER.ORG_ID; FND_KEY_FLEX.DEFINE( BLOCK => 'TOMAI_MAIN_HEADER_BLK',FIELD => 'TO_ACCOUNT_PT',CODE => 'GL#',APPL_SHORT_NAME =>'SQLGL',NUM => ':PARAMETER.CHART_OF_ACCOUNTS_ID',ID => 'TO_ACCOUNT_PT_id',VRULE => 'nSUMMARY_FLAGnInAPPL=SQLGL;NAME=GL_NO_PARENT_SEGMENT_ALLOWEDnN GL_GLOBALnDETAIL_POSTING_ALLOWEDnEnAPPL=INV;NAME=INV_VRULE_POSTINGnN',REQUIRED => 'N',DINSERT => 'Y',VALIDATE => 'FULL',USEDBFLDS => 'N'); FND_KEY_FLEX.DEFINE?的用法
FND_KEY_FLEX.DEFINE( block => 'Custom block',Field => 'BTL_KFF',-- 第三步创建的显示 item ID => 'XXX_ID',-- 第二步创建的隐藏 item Appl_short_name => 'SQLGL',Code => 'GL#',--ID_FLEX_CODE Num => '101',--Chart of account Vrule => 'GL_GLOBALnDETAIL_POSTING_ALLOWED nEnAPPL=''SQLGL''; name=Parent Values are not allowednN' ); Trigger?中调用FlexField?标准的方法 Trigger包括 ??? PRE-QUERY ??? POST-QUERY ??? PRE-INSERT ??? PRE-UPDATE ??? WHEN-VALIDATE-RECORD ??? WHEN-NEW-ITEM-INSTANCE WHEN-VALIDATE-ITEM 代码类似于:
WHEN-VALIDATE-ITEM
if ( :system.mode = 'NORMAL' ) then fnd_flex.event( 'WHEN-VALIDATE-ITEM' ); end if;
WHEN-NEW-ITEM-INSTANCE
app_standard.event('WHEN-NEW-ITEM-INSTANCE'); fnd_flex.event('WHEN-NEW-ITEM-INSTANCE' );
POST-QUERY
--Loads the flexfields (in our case,it populates --the concatenated field on execute query). FND_FLEX.EVENT('POST-QUERY');
PRE-QUERY
--If you don't do this,whatever query criteria you may enter in -- the concatenated flex field,it is not taken into account. FND_FLEX.EVENT('PRE-QUERY' );
KEY-LISTVAL
APP_STANDARD.EVENT('KEY-LISTVAL'); FND_FLEX.EVENT('KEY-LISTVAL' ); 一般情况下,我们会把?fnd_flex.event这样的代码放在?Form?级别,这样我们新加的?Trigger只要不是?Override?模式,?那么?fnd_flex.event都会被执行到,当然如果你的?trigger?为override?模式或者需要比较复杂的?Flexfield?的业务逻辑,那么你就必须手工添加?fnd_flex.event?代码到你的?Trigger中。对于本例?Account?的KFF?来说,因为要校验?Account ID?是否有效,所以需要在?When-Validate-Item中加入一些其他校验
FND_FLEX.EVENT('WHEN-VALIDATE-ITEM'); IF :BLOCK.XXX_ID = -1 THEN FND_MESSAGE.SET_STRING('You Have Selected An Undefined Code Combination !'); FND_MESSAGE.SHOW; RAISE FORM_TRIGGER_FAILURE; END IF; Flexfield?相关的API
FND_KEY_FLEX.DEFINE in Developer Guide
Use FND_KEY_FLEX.DEFINE for a key flexfield on a foreign key or combinations form.
Attention: We provide combinations form syntax so you can
convert any existing non–Oracle Applications combinations
forms you may have from SQL*Forms 2.3 to Oracle Forms 4.5.
However,the API for key flexfields may change in future
versions of Oracle Applications,so we recommend that you do
not create any new key flexfields that are not provided by
Oracle Applications.
FND_KEY_FLEX.DEFINE(
/* Arguments that specify flexfield location */
BLOCK=>’block_name’,
FIELD=>’concatenated_segments_field_name’,
[DESCRIPTION=>’description_field_name’,]
[ID=>’Unique_ID_field’,]
[DATA_FIELD=>’concatenated_hidden_IDs_field’,]
/* Arguments that specify the flexfield */
APPL_SHORT_NAME=>’application_short_name’,
CODE=>’key_flexfield_code’,
NUM=>’structure_number’,
/* Other optional parameters */
[VALIDATE=>’{FOR_INSERT|FULL|PARTIAL|NONE|
PARTIAL_IF_POSSIBLE}’,]
[VDATE=>’date’,]
[DISPLAYABLE=>’{ALL | flexfield_qualifier |
segment_number}[ {ALL |
flexfield_qualifier | segment_number}]’,]
[INSERTABLE=>’{ALL | flexfield_qualifier |
segment_number}[ {ALL |
flexfield_qualifier | segment_number}]’,]
[UPDATEABLE=>’{ALL | flexfield_qualifier |
segment_number}[ {ALL |
flexfield_qualifier | segment_number}]’,]
[VRULE=>’flexfield qualifiern
segment qualifiern
{I[nclude]|E[xclude]}n
APPL=application_short_name;
NAME=Message Dictionary message namen
validation value1n
validation value2...
[ flexfield qualifiern
segment qualifiern
{I[nclude]|E[xclude]}n
APPL=application_short_name;
NAME=Message Dictionary message namen
validation value1n
validation value2...]’,]
[COPY=>’block.fieldn{ALL | flexfield
qualifier | segment_number}
[ block.fieldn{ALL | flexfield
qualifier | segment_number}]’,]
[DERIVED=>’block.fieldnSegment qualifier’,]
[DERIVE_ALWAYS=>’{Y|N}’,]
[DINSERT=>’{Y|N}’,]
[VALATT=>’block.fieldn
flexfield qualifiern
segment qualifier’,]
[TITLE =>’Title’,]
[REQUIRED=>’{Y|N}’,]
[AUTOPICK=>’{Y|N}’,]
[USEDBFLDS=>’{Y|N}’,]
[ALLOWNULLS=>’{Y|N}’,]
[DATA_SET=>’set number’,]
[COLUMN=>’{column1(n) | column1 alias(n)
[,column2(n),...] [INTO block.field]}’,]
[WHERE_CLAUSE=>’where clause’,]
[COMBQP_WHERE=>’{where clause|NONE}’,]
[WHERE_CLAUSE_MSG=>’APPL=application_short_
name;NAME=message_name’,]
[QUERY_SECURITY=>’{Y|N|}’,]
[QBE_IN=>’{Y|N}’,]
[READ_ONLY=>’{Y|N}’,]
[LONGLIST=>’{Y|N}’,]
[NO_COMBMSG=>’APPL=application_short_
name;NAME=message_name’,]
[AUTOCOMBPICK=>’{Y|N}’,]
[LOCK_FLAG=>’{Y|N}’,]
[HELP=>’APPL=application_short_name;
TARGET=target_name’]
);
You should not use a colon ( : ) in block.field references for the
VALATT,COPY,or DERIVED arguments. The arguments for these
routines go to an Oracle Application Object Library cover routine and
are not directly interpreted in PL/SQL.
fnd_flex.event
fnd_flex.event的代码位于?FNDSQF.pll procedure event(event_name varchar2) is begin fnd_flex_private.flex_debug('BEGIN FND_FLEX.EVENT('||event_name||')'); if ((event_name = 'WHEN-VALIDATE-ITEM') AND (name_in('system.mode') = 'ENTER-QUERY')) then GOTO lbl_return; end if; -- -- Synchronize call seems to solve some problems in -- event handling in Forms side. -- According to Peter this call does nothing,but let's -- call it. G.Olgun -- -- Per Peter's request commenting out the code. -- --IF (event_name = 'WHEN-NEW-ITEM-INSTANCE') THEN -- synchronize; --END IF; -- user_exit('FND FFLEX ' || event_name); if (NOT Form_Success) then fnd_flex_private.flex_failure('user_exit(FND FFLEX ' || event_name || ') is failed.'); copy(NULL,'GLOBAL.FND_FLEX_NAVIGATE'); copy(NULL,'GLOBAL.FND_FLEX_NAVIGATE_PUBLIC'); copy(NULL,'GLOBAL.FND_FLEX_READONLY'); copy(NULL,'GLOBAL.FND_FLEX_ENABLELOV'); raise FORM_TRIGGER_FAILURE; end if; -- if (event_name = 'POST-QUERY') then -- set_record_property(name_in('SYSTEM.TRIGGER_RECORD'),-- name_in('SYSTEM.TRIGGER_BLOCK'),-- STATUS,QUERY_STATUS); -- end if; fnd_flex_private.navigate_from_flex; if (event_name = 'WHEN-NEW-ITEM-INSTANCE') then fnd_flex_private.set_flex_item_properties; end if; -- -- This step was asked for by Peter Wallack to enable localizations -- This would eventually be moved to APPCORE. -- if (event_name = 'WHEN-VALIDATE-RECORD') then copy('Y','GLOBAL.APPCORE_WVR_ZOOM'); execute_trigger('ZOOM'); if not form_success then raise form_trigger_failure; end if; end if; <<lbl_return>> fnd_flex_private.flex_debug('END FND_FLEX.EVENT('||event_name||')'); RETURN; EXCEPTION WHEN OTHERS THEN fnd_flex_private.flex_exception('FND_FLEX.EVENT'); RAISE; end event; FlexField?的相关表
FND_ID_FLEXS:
This table captures the information of all the Key FlexFields. The main columns in this table are: ??? APPLICATION_ID? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |