1、第一步:使用data block wizard创建块第二步:ROW_ID项的子类名设置为ROW_ID。 其他需要显示在画布上的项设置子类, 另设置显示在STK画布上的属性:第三步:将数据块中显示在STK上的项复制到PROMT块中,并设置数据块中的trigger(模板中的FOLDER块有现成的trigger)PRE-QUERY/POST-QUERYWHEN-NEW-BLOCK-INSTANCE /WHEN-NEW-RECORD-INSTANCE 提示项的item type为display,子类为FOLDER_PROMT_MULTIROW第四步:在when-new-form-instance初始化
2、form。使用app_folder.define_folder_block如果用到了FIX画布,需要使用参数8第五步:在画布上调整布局设置块的Scrool Bar Canvas在fix画布上注意:ITEM名称画布子类FOLDER_SWITCHERFIXSWITCHERDRILLDOWN_RECORD_INDICATORFOLDER_TITLEDYNAMIC_TITLEFOLDER_OPENFOLDER_DUMMYTOOLBARORDER_BY1STKFOLDER_ORDERBY第六步:在WHEN-WINDOW-RESIZED触发器内if :system.event_window in (MAI
3、N,DOCTXN_DETAILS) then app_folder.event(WHEN-WINDOW-RESIZED);end if;2.TAB页的Folder功能原理:与无tab页不同就是创建画布时,我们会选择创建一个tab_canvas类型的画布假如你要显示的item都来自一个block,则我们只需要一个fix画布;如果画布上的item来自多个block,则需要多个fix画布。我们通过when-tab-changed触发器和show_view(hide_view)来控制画布的显示与隐藏2.1 首先要创建类型为Tab的画布,在画布下添加两个子类为Tab_page的画布,注意的是最好使得这两
4、个画布的名称和将来放在两画布上的stacked画布名称一致。如下图左2.2 画布建好以后,我们来看如何布局。首先将MAIN_TAB画布,堆叠在MAIN画布上,再将图中TAX画布(fix和stacked画布)和BASE画布(同上)堆叠在MIAN_TAB画布,尽量保持TAX和BASE重合,就是说x和y坐标相同。2.3 接下来就是在form builder中写显示和隐藏的代码FORM级的WHEN-TAB-PAGE-CHANGED以下的两个过程是为了防止bug参考(桌面ebs常用文档大全FOLDER)1.在FORM触发器内 ELSIF (event = FOLDER_RETURN_ACTION) TH
5、EN if(:global.folder_action = CONFIRM-HIDE-FIELD if :global.folder_filed = ADDITION1 THEN :global.folder_action_allowerd := FALSE; END IF; end if;2.在block触发器elsif event = WHEN-NEW-ITEM-INSTANCEthen curr_canvas_name := get_item_property(name_in(SYSTEM.CURSOR_ITEM), item_canvas); current_tab := get_ca
6、nvas_property(MAIN_TAB, topmost_tab_page); tab_canvas_name := name_in(SYSTEM.EVENT_CANVASIF curr_canvas_name IN (TAX_STKBASE_STKIF curr_canvas_name != current_tab THEN set_canvas_property(, topmost_tab_page, curr_canvas_name);ENDIF;3.说明性弹性域 第一步:在实际开发中(暂时做过的项目中),会提供给你注册的plsql块(保存在sql中),执行后,就会在ebs中注册。
7、在数据块中创建item,取名DF,类型text item,子类TEXT_ITEM_DESC_FLEX在DF项下,创建两个触发器WHEN-VALIDATE-ITEM -override代码:FND_FLEX.EVENT(WHEN-VALIDATE-ITEM)WHEN-NEW-ITEM-INSTANCE -beforeFND_FLEX.EVENT(WHEN-NEW- ITEM-INSTANCE)修改DF所在数据块的trigger,添加完成后初始化弹性域添加此代码:FND_FLEX.EVENT( .)使用fnd_descr_flex.define初始化弹性域启用弹性域1.先是查找出注册好的弹性域2.
8、进入段设置界面Open 弹性域3.然后保存4.最后保存。4.关键性弹性域下面讲解的是核算科目账户对应的键弹性域的创建方法4.1创建三个item项,设置相应属性CODE_COMBINATION:显示项(称为账户项),字段长度设置2000,显示核算科目的数字组合。 LOV为ENABLE_LIST_LAMP, 验证为NOCOMBINATION_DESC:显示项,字段长度设置2000,显示核算科目的中文描述组合GL_CCID:数据库表项,存储的是核算科目对应的ID4.2为账户项添加两个触发器 WHEN-NEW-ITEM-INSTANCE : 触发器执行层次设置为Before WHEN-VALIDATE
9、-ITEM为两个触发器添加代码: fnd_flex.event(4.3为这三个item所在的block块添加触发器 PRE-QUERY POST-QUERY PRE-INSERT PRE-UPDATE WHEN-VALIDATE-RECORD触发器代码:fnd_flex.event(PRE-INSERT4.4在pre-form触发器获取账户结构IDselect b.CHART_OF_ACCOUNTS_IDfrom gl_sets_of_books bwhere b.SET_OF_BOOKS_ID = fnd_profile.value(GL_SET_OF_BKS_ID)4.5 初始化键弹性域f
10、nd_key_flex.define(block =DETAIL, field =CODE_COMBINATION appl_short_name =SQLGL,-注册的应用简称code =GL#,-弹性域的注册代码id =GL_CCIDdescription =COMBINATION_DESCnum =:parameter.CHARTS_ACCOUNT_ID-4.4得到的账户结构ID4.6遇到的奇葩问题1).建好弹性域以后,如果我们为账户项赋了值以后,会自动获取数据库表项的值(GL_CCID),如果你有自己的函数来为数据库表项赋值(在系统自动获取之前),那就会被自动获取的值覆盖,关键是这个自
11、动获取的值还有可能是错误的,所以在PRE-INSERT触发器之前,重新赋值即可。4.单选框和复选框Value when Checked:Y Value when Unchecked:N Check Box Mapping of Other Values:Unchecked 因为复选框除了选中,被选中外,还有一个null值状态,所以要设置null状态下的值是多少。获得复选框的值:块名.复选框名 Y or N 单选框:是一个单选组,组里有单选按钮 单选组:子类-Radio Group 单选按钮:子类-Radio ButtonRadio Button Value这个属性必须有值5.手电筒窗口查询 1
12、.打开一个模板APPSTAND,将Object Groups下的QUERY_FIND对象拖到自己的form中,点击copy。将在block,canvases,windows下生成对应名称为QUERY_FIND的对象。 2. 将new 和find按钮,QUERY_FIND数据块下的key-nxtblock代码修改 New:新建的数据块名称 Find:查询的数据块名称 key-nxtblock:查询数据块的名称 3.设置query_find查询块的属性为主界面块,这样关闭query_find的时候,就会显示主界面块。 4.在主界面块内创建query_find触发器,名称不能修改,添加如下代码: A
13、pp_find.query_find(main_win,query_find_win,query_find_block);参数1:main_win查询窗口显示在哪个窗口上参数2:query_find_win -查询窗口界面对应的窗口参数3:query_find_block 查询窗口对应的块名称 5.在主界面块中的pre-query内添加查询代码 Copy ,app_find.query_range等 6.主界面块的when-new-record-instace触发器Execution Hierarchy 设置为After在其他窗口上调用出手电筒若该窗口有两个块。则在两个块上建立query_fi
14、nd触发器,代码为app_find.query_find6.菜单栏通过这种方法来设置菜单的名称(when-new-form-instance)fnd_message.set_name(SQLSZASZA_PA_010_BUDGET_CHECK)/*;消息内容:预算检查(&B)*/app_special.instantiate(SPECIAL1 fnd_message.get);app_special.disable(-使菜单灰显(失效)app_special.enable(-启用菜单7.主从块7.启用功能fnd_function.execute(function_name INVARCHAR2
15、, open_flag INVARCHAR2DEFAULTY session_flag INVARCHAR2DEFAULTSESSION other_params INVARCHAR2DEFAULTNULL, activate INVARCHAR2DEFAULTACTIVATE browser_target INVARCHAR2DEFAULTNULL);关于详细介绍请查看8.行指示器打开记录1).更改行指示器的子类,如图2.在Item触发器when-item-instance内CURRENT_RECORD_INDICATOR名称改成DRILLDOWN_RECORD_INDICATOR三.For
16、m开发中常用的技巧1.关闭窗口如何正确的关闭非主窗口(A是主窗口块,B是非主窗口块)在APP_CUSTOM.close_window这个过程内,if语句内注册window的关闭事件,代码为clear_block;go_item(A.Item_name); 第二种方法是:设置B的previous navigate block为A,建议使用在form触发器WHEN-WINDOW-RESIZED中的代码作用:folder能否随着窗口大小变化而变化。2.lov查找为item(lov)赋初值,初值在lov中存在多个。 在这中情况下,当你做其他操作时,lov会自动弹出让你选择某一个值。如果lov中数据过多
17、,需要先在查找中先输入字符,然后在匹配查找的方法: 不显示lov项可以设置显示项的宽度为0即可3.得到dml语句错误信息在on-insert触发器内,加入如下代码:exception when others then fnd_message.debug(sqlerrm);可以得到触发器的具体信息。4.clear_block 函数 一般在form的插入或更新模式下,clear_blcok会引发是否保存当前内容的系统提示,如果不希望提示,可以使用clear_block(NO_VALIDATE)5.查询函数的使用app_query.append( block_name,sql)block_name
18、-字符串sql -字符串,一条查询语句 app_find.query_range( qf_block_name.item_name1,qf_block_name2,block_item_name)参数qf_block_name.item_name1,qf_block_name2:因为该函数适用于范围查找,所以参数1表示范围开始,参数2表示范围结束block_item_name 数据块对应的item项 Copy(qf_item,block_item)类似于第二种,不是范围查找,针对某一个数据块 do_key使用如下代码,不直接调用execute_query。parameter.g_query_f
19、ind :TRUE do_key(execute_query :app_query.reset(TRACK6.设置头块和行块的增删改属性尽量不设置 insert_allowed 和update-allowed属性,insert属性一般只设置行块,头块都是可以新增的,update属性通过设置item的能否输入来实现。当查询后重新在when-new-block-instance调用一下刷新按钮以及块状态的过程。一般都会在过程中先把块的delete_allowed和insert_allowed设置为NO,然后再根据逻辑去该状态。这样就不会出错。示例代码:PROCEDURE set_repl_stat
20、us IS BEGIN sza_set_block_property(p_block_name = REPL_HEADERS p_delete_flag =NREPL_LINES p_insert_flag = IF :repl_headers.status_code IN (1NEW ELSIF :repl_headers.status_code = 4REJECT END IF; app_standard.synchronize; END set_repl_status;7.设置窗口的标题在when-new-form-instance设置app_window.set_title(RETIR
21、E_PLAN, :PARAMETER.ORG_CODE);8.跳转块或者查询块的正确方法(system.message_level)在ebs form中,消息是有等级的,为了clear_block,do_key()等时,屏蔽一些小错误,将等级下调至10. if event = WHEN-BUTTON-PRESSED then -在ebs form中 l_message_level := :system.message_level; :system.message_level := 10; go_block(approve_action clear_block;do_key(= l_messag
22、e_level; end if;9. 分段排序实现:晚于当前系统时间的item排在前面,升序。早于当前系统时间的item排在后面,升序使用union的原因: Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;Union All:对两个结果集进行并集操作,包括重复行,不进行排序;10.编译刚定义好的消息 刚定义好的消息要通过编译才能显示详细说明,不然只会显示简码。编译消息 - 应用开发员职责-其他 -请求 -运行复制按钮,选择生成消息行,(如果自己选择,则需要输入参数信息)11.提示:FND_MESSAGEQuestion的使用:, SZA_EAM_DRAW_RETUR
23、N_SAVE_TIP/用于显示在选择框的内容提示(set_string也可以)l_question_rt := fnd_message.question(YESNOCANCEL 1, 3,question if l_question_rt 1 then raise form_trigger_failure;定义变量接受返回值即可l_question_rt为number类型,根据返回值执行逻辑。例子:第二种使用方法: fnd_message.set_name(SZA_EAM_TXN_CANCEL_LINSPECIAL5, fnd_message.get);使用fnd_message.get取出栈内的消息12. 提示:set_alert_property使用set_alert_property来设置提示的信息,可以用字符串连接来输出信息,比FND_MESSAGE方便13.屏蔽错误如果碰到无法解决的错误,但是错误对程序并不影响。在ON-ERROR触发器中,用一下代码替代app_standard.event(ON-ERROR IF ERROR_CODE = 41016 THEN NULL; ELSE app_standard.event( END;14.关于list的一些函数clear_listadd_list_element配合使用在pro
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1