How to Define a KFF(key flex field) Step by Step
Upcoming SlideShare
Loading in...5
×
 

How to Define a KFF(key flex field) Step by Step

on

  • 2,140 views

How to Define a KFF(key flex field) Step by Step

How to Define a KFF(key flex field) Step by Step

Statistics

Views

Total Views
2,140
Views on SlideShare
2,140
Embed Views
0

Actions

Likes
0
Downloads
32
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

How to Define a KFF(key flex field) Step by Step How to Define a KFF(key flex field) Step by Step Document Transcript

  • Define a KFF step by stepAuthor: Pan TianCreation Date: 04/05/2012Last Updated:Version:Status:
  • Change Record Date Author Version Change Reference 01-May- 12 Pan Tian Draft No previous documentContributors Name PositionReviewers Name Position ii
  • ContentsDefine 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 iii
  • Define a KFF step by stepBaseTable表增加一个外键列 在Base Table中定义一个字段XXX_ID,这个用于保存KFF表记录的主键(对于Base Table 就是外键列),比如对于本例,如果要增加一个Account的KFF,需要在Base Table上增加 一个XXX_ID外键字段用于保存捕获的CODE_COMBINATION_IDBlock中创建一个 Flexfield的隐藏item Block中定义一个隐藏字段用于保存上边一步创建的FK字段,设置canvas为 NULL,TEXT_ITEM property classBlock中创建一个 Flexfield显示字段 创建了隐藏字段,当然要创建一个显示的字段让用户来输入,这里我们需要创建一个non- database字段用来展示合并的科目值,subclass Information继续使用TEXT_ITEM,设置合 适canvas来显示,LOV设置为ENABLE_LIST_LAMP,Validate from list is set to No 1
  • 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, 2
  • 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_ALLOWEDnN0GL_ 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 ); 3
  • 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 dont 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. 4
  • 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}[0{ALL |flexfield_qualifier | segment_number}]’,][INSERTABLE=>’{ALL | flexfield_qualifier |segment_number}[0{ALL |flexfield_qualifier | segment_number}]’,][UPDATEABLE=>’{ALL | flexfield_qualifier |segment_number}[0{ALL |flexfield_qualifier | segment_number}]’,][VRULE=>’flexfield qualifiernsegment qualifiern{I[nclude]|E[xclude]}nAPPL=application_short_name;NAME=Message Dictionary message namenvalidation value1nvalidation value2...[0flexfield qualifiernsegment qualifiern{I[nclude]|E[xclude]}nAPPL=application_short_name;NAME=Message Dictionary message namenvalidation value1nvalidation value2...]’,][COPY=>’block.fieldn{ALL | flexfieldqualifier | segment_number}[0block.fieldn{ALL | flexfieldqualifier | segment_number}]’,][DERIVED=>’block.fieldnSegment qualifier’,][DERIVE_ALWAYS=>’{Y|N}’,][DINSERT=>’{Y|N}’,][VALATT=>’block.fieldnflexfield qualifiernsegment 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}’,] 5
  • [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 theVALATT, COPY, or DERIVED arguments. The arguments for theseroutines go to an Oracle Application Object Library cover routine andare not directly interpreted in PL/SQL.fnd_flex.eventfnd_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 lets -- call it. G.Olgun -- -- Per Peters request commenting out the code. -- --IF (event_name = WHEN-NEW-ITEM-INSTANCE) THEN -- synchronize; --END IF; -- 6
  • 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; 7
  • 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 ‐ Column consists of Application ID ID_FLEX_CODE ‐ Column KFF Code (like ‘GL#’, ‘AR#’ etc.) ID_FLEX_NAME - KFF Name (like ‘Accounting Flexfield’, ‘Category Flexfield’..etc.) APPLICATION_TABLE_NAME – Name of combination table (like ‘GL_CODE_COMBINATIONS’ , ‘FA_LOCATIONS’ etc.) FND_ID_FLEX_STRUCTURES: This table stores structure information about key Flexfields. Each Structure is uniquely identified by APPLICATION_ID – Module Code ID_FLEX_CODE – Code of KFF ID_FLEX_NUM – Number of a Structure FND_ID_FLEX_SEGMENTS: It captures the information of Segments. Each Segment is Uniquely identified by APPLICATION_ID – Module Code ID_FLEX_CODE – Key Flexfield code 8
  • ID_FLEX_NUM – Key flexfield structure number SEG_NUM – Segment number FLEX_VALUE_SET_ID – Flexfield value set identifierFND_FLEX_VALUE_SETS:This table captures the information of each Segment’s Value Set. Each Value Set isUniquely identified by FLEX_VALUE_SET_ID as Foreign Key ofFND_ID_FLEX_SEGMENTS Table.FND_FLEX_VALUES:This table captures the information each Value codes of a Value Set of a Segment. EachValue Code is uniquely identified by FLEX_VALUE_SET_ID FLEX_VALUE_IDFND_FLEX_VALUES_TL:This table captures the information of each Value Description of a Value Set of aSegment. Each Value Description is uniquely identified by FLEX_VALUE_ID. 9