1、1、所有的项都必须要继承父项 .22、form 触发器 了解 23、form 中最好使用大写命名 24、form 中的参数: 25、fnd_message.debeg .26、注意使用 block、item、form 级的触发器 27、画布: .28、手动创建 lov: .29、数据块名字不需要和 window 名称相同 .310、Form Trigger 触发 .311、fnd_message 的用法 .312、将 form 挂到 erp 方法 313、进入 form 时挑选 org_id 314、FORM 开发标准使用 FND_STANDARD.SET_WHO .315、主从 form,用
2、块中的 relations 来创建主块与副块的关系 .416、创建 form 步骤: .417、app_find 触发器的学习 418、不管是基于基表还是基于视图的 Block,都建议编写 ON-UPDATE、ON-INSERT、 ON-DELETE、ON-LOCK 触发器 519、app_item_property.set_property 520、添加日历项: .521、lov 的注意 .522、滚动条 .623、创建堆叠画布 .624、添加行指示符: .625、建立块查询步骤: .626、光标从块 A 点入块 B 时触发器执行过程: .727、创建 tab 画布步骤: 728、一个导航块
3、中必须有一个 ITEM 可 UPDATE 或 INSERT 可输入 .829、一个块名称超过 22 个字符, .830、创建文件夹步骤及注意: .831、Oracle 开发中出现 FRM-40831 错误的解决办法? .1132、JTF Grid 开发步骤 .1133、使用 view 开发 form 步骤: 1134、跳转到其他的 form,在触发器中添加 go_item( item_name)函数,自动弹出 item 所在的 canvas。 1235、RAISE FORM_TRIGGER_FAILURE;自动触发整个 form 的回滚 .1236、配置文件存放表:fnd_profile_op
4、tions、fnd_profile_option_values .121、所有的项都必须要继承父项2、 form 触发器 了解3、 form 中最好使用大写命名4、 form 中的参数:1) 全局::global.* -引用全局变量2) Form 级::PARAMETER.* -引用 form 级变量5、 fnd_message.debeg(*); -弹出窗口6、注意使用 block、item、form 级的触发器7、画布:堆叠画布、内容画布、标签画布8、手动创建 lov:1)创建 record group -填入 sql 语句点击确定2)创建一个 lov -修改标题、记录组(刚刚创建的) 、
5、修改列映射属性3)修改 ITEM 的 lov 属性9、数据块名字不需要和 window 名称相同10、Form Trigger 触发11、 fnd_message 的用法12、 将 form 挂到 erp 方法13、进入 form 时挑选 org_id在 form 中要添加 org_id,org_code,org_name,chart_of_accounts_id 参数在 pre_form 触发器中添加 fnd_org.choose_org,挑选的组织 ID-global.org_id,在将global.org_id-parameter.org_id,在块级触发器中添加 pre_insert
6、触发器,并将parameter.org_id-block_name.org_id;或者:parameter.org_id := fnd_profile.value(ORG_ID);将 org_id 显示到 window title 上,在 form 或块中添加when_new_form/block_instance 触发器,在 pl/sql 中添加app_window.set_title(window_name,:parameter.org_id);14、FORM 开发标准使用 FND_STANDARD.SET_WHO 为 form 添加块级触发器: pre_insert,pre_update
7、 触发器,在触发器中添加入,FND_STANDARD.SET_WHO由于在 erp 中新建表时必须包括: organization_id, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY, LAST_UPDATED_LOGIN 属性15、主从 form,用块中的 relations 来创建主块与副块的关系1)创建表,主表与副表(要符合 erp 规范要求)2)创建 block,主块与副块3)创建在主块中 Relations-选择要关联的 detail_block(副块) -修改 Join Condition(在数据库中的关
8、联连接)16、创建 form 步骤:1)新建一个 form,并新建 block,cavans,window,设置相关之间的关系2)添加参数:org_id,org_code,org_name,chart_of_accountS_id3)修改 pre_form 触发器: app_window.set_window_position(win block_name, FIRST_WINDOW);FND_ORG.CHOOSE_ORG;:PARAMETER.ORG_ID := :GLOBAL.ORG_ID;4)修改程序单元中的 app_custom5)为块添加 pre_insert,pre_update
9、触发器,并添加FND_STANDARD.SET_WHO;在 pre_insert 添加:CUX_DEPT_CSW.ORGANIZATION_ID := :parameter.org_id;用于传递 org_id。6)修改 form 的第一个导航块,使一打开这个 form 时鼠标跟踪到该数据块,并设置块之间的导航顺序7)在 when_new_form/block_instance 设置 form 标题app_window.set_title(window_name,:parameter.org_id);17、app_find 触发器的学习1) app_find.query_find格式:proc
10、edure APP_FIND.QUERY_FIND( lov_name varchar2);procedure APP_FIND.QUERY_FIND( block_window varchar2,find_window varchar2,find_block varchar2);DescriptionThese routines invoke either the Row-LOV or the Find Window. Call them from a user-named trigger “QUERY_FIND.“Arguments (input)lov_name The name of
11、the Row-LOVblock_window The name of the window the Find Window is invoked forfind_window The name of the Find Windowfind_block The name of the block in the Find Window2)APP_FIND.NEW格式: procedure APP_FIND.NEW(block_name varchar2);DescriptionThis routine is called by the “New“ button in a Find Window
12、to return the user to a new record in the block on which the find is based.Arguments (input)block_name The name of the block the Find Window is based on 3) APP_FIND.CLEAR格式: procedure APP_FIND.CLEAR;DescriptionThis routine is called by the “Clear“ button in a Find Window to clear the Find Window.4)
13、APP_FIND.CLEAR_DETAIL18、不管是基于基表还是基于视图的 Block,都建议编写ON-UPDATE、ON-INSERT、ON-DELETE、ON-LOCK 触发器,并且,把具体的 DML 和锁记录代码放入数据库 Package 中,然后在 Form 中调用,该 Package 以后还可以在其他地方调用。理解:对于基于非单表视图的 Block 来说,这里的 4 个触发器是必须要写的,具体代码可以直接写在触发器内,但为了模块化管理和今后维护方便,这里分为三层调用,触发器中调用 Program Unit 中的过程,Program Unit 中调用数据库 Package 中的过程。
14、19、app_item_property.set_property(Item_name,update/insert/delete_allowed,property_true) ;过程用于修改 item 属性, set_block_property(block_name,update/._allowed,property_true); SET_ITEM_INSTANCE_PROPERTY(CUX_EMP_CSW.EMP_NAME,CURRENT_RECORD,UPDATE_ALLOWED,PROPERTY_FALSE); 设置当前某列的某个属性值20、添加日历项:1)添加 key_listval
15、 触发器,代码: calendar.show(默认日期);2)修改项的格式掩码yyyy-mm-dd 时间显示格式3)修改项的 lov 属性,为 List of value 为 enable_list_lamp,Validate from list 为否21、lov 的注意1)列:指要返回的列,并在界面显示(一般全选)2)列显示:要在界面上显示的标题,并设置返回值(修改标题,设置要返回到那个item)3)项:指要在那个列上显示 lov 按钮(选要进行选择的列)22、滚动条1)块滚动条:水平与垂直其一,一般只添加垂直滚动条2)画布滚动条:因为 view 是显示在界面上的,而 canvas 是存放
16、item 的,如果 view太小不足以显示所有的 item 则需要使用 canvas 滚动条了,一般使用在堆叠 canvas 上(一般使用水平滚动条)23、创建堆叠画布时,要再 new form 触发器中添加入:show_view(canvas_name);步骤:1) 创建一个堆叠画布,设置标题、子类、显示水平滚动条、window 与主画布相同2) 设置 item 到新增加的堆叠画布上3) 调整堆叠画布,规则:1) view 在 canvas 上的坐标为: 0,0;宽度以情况而定,高度与 canvas 相同2) canvas 左右没有空白,第一个 item 的坐标为 0,0.25(用于放 pr
17、ompt)3) canvas 底部留出 0.2 的宽度用于存放滚动条24、添加行指示符:在 block 中添加一个 item,并设置为current_record_indicator25、建立块查询步骤:1)打开 appstand.fmb,并拖动 query_fnd 对象组到所需要建立块查询的 form 中,选择 copy 的方式2)删除对象组 query_fnd,此时我们的 form 中会新增加了一个window、canvas、block,分别设置它们的子类属性,并设置 block 属性的上、下导航块(上为目标块,下为 null)而主块的上、下导航为本身3)修改 clear、new、find
18、 按钮触发器中的 block_name 为要查询的块名4)为 query_find block 手动添加所需要的 item,并显示到相应的 canvas 上5)修改块触发器,为要查询的块 block 添加一个 user_name(name:query_find )的触发器,并写入代码:app_find.query_find(block_window,query_find_window,query_find_block);将block_window 与 query_find 的 window、block 进行绑定,调用 EBS 中的手电筒按钮6)为要查询的 block 添加一个 pre_quer
19、y 触发器,并写入代码:(ture 和 false 注意大小写)if :parameter.G_query_find = TRUE then copy(name_in(query_find.ORGANIZATION_ID),CUX_DEPT_CSW.ORGANIZATION_ID);copy(name_in(query_find.department_id),CUX_DEPT_CSW.DEPARTMENT_ID);app_find.query_date_range(:query_find.VALID_date_f,:query_find.VALID_date_t,CUX_DEPT_CSW.VA
20、LID_DATE);:parameter.G_query_find := FALSE;END IF;将块查询的条件传递到主块上,并执行 ctrl+F11,这样就达到了查询的目的了26、光标从块 A 点入块 B 时触发器执行过程:27、创建 tab 画布步骤:1)新建一个 tab_canvas,并创建 herders 与 lines pages(这两个 pages 是必须的),设置 herders 与 lines 的显示标签2)设置 Item 的显示 canvas 到新建立的 tab_canvas 上(设置初始化那个 page 显示)3)切换到主画布,在 view-stacked canvas
21、中选择 tab_canvas 将 tab_canvas 显示到主画布上4)控制标签 pages 的显示1、在Form级WHEN-NEW-FORM-INSTANCE中追加:SET_CANVAS_PROPERTY(TAB_CANVAS, TOPMOST_TAB_PAGE, HEADERS);2、新建Form级WHEN-TAB-PAGE-CHANGED触发器,该触发器是用鼠标点时才会触发;另外注意几个 Form 标准过程的使用:IF :system.tab_previous_page = HEADERS THENvalidate(block_scope);IF :system.MODE = ENTE
22、R-QUERY OR NOT form_success THEN-Message hereset_canvas_property(TAB_DEMO,topmost_tab_page,:system.tab_previous_page);RETURN;END IF;ELSIF :system.tab_previous_page = LINES THENvalidate(block_scope);IF :system.MODE = ENTER-QUERY OR NOT form_success THEN-Message hereset_canvas_property(TAB_DEMO,topmos
23、t_tab_page,:system.tab_previous_page);RETURN;END IF;END IF;IF :system.tab_new_page = LINES THEN-show_view(ORDER_LINES_STACKED);go_item(ORDER_LINES.ORGANIZATION_CODE);ELSIF :system.tab_new_page = HEADERS THEN-hide_view(ORDER_LINES_STACKED);go_item(ORDER_HEADERS.DESCRIPTION);END IF;28、一个导航块中必须有一个 ITEM
24、 可 UPDATE 或INSERT 可输入 ,否则会提示目标块中没有可导航的项(frm-40106 错误)29、一个块名称超过 22 个字符,会提示(frm-41079:添加组列错误)30、创建文件夹步骤及注意:注意:如果创建文件夹不显示 prompt,则在new_form_instance 触发器中添加app_folder.event(INSTANTIATE); 为文件夹添加自动伸缩的效果:在 when_window_resized 中添加IF :SYSTEM.EVENT_WINDOW IN (WINDOW_NAME) THENAPP_FOLDER.EVENT(WHEN_WINDOW_RES
25、IZED);END IF;1)打开 APPSTAND.FMB 表单,将 object group 中的 STARNDARD_FOLDER 拖动到我们新建的 form 中,选择 subclass,将 SAMPLE_FOLDER 中的所有触发器拖动到我们要建立文件夹选项的 block 上2)为我们新建的 form 导入 APPFLDR.PLL 库3)新建一个 prompt block,建完结果图,说明:ORDER_BY3 以下属性为要导航的 Item4)设置各个 Item 的属性为:Property ValueName 要导航的列Item Type(项类型) Display Item Subcla
26、ss Information 子类信息 FOLDER_PROMPT_MULTIROWCanvas 画布 FOLDER_STACK(这个属性不能设错,必须是你的 Stacked Canvas)Initial Value 初始值Brand Type、Brand Desc,Category(这个初始值就是在 Form 上面你将会看到的 prompt 值)Prompt 提示 保持为空Item Property ValueItem Type Push ButtonSubclass Information FOLDER_ORDERBYCanvas CONTEN_CANVASX Position 0Y Po
27、sition 0Width 0ORDER_BY1ORDER_BY2ORDER_BY3Height 0备注 后面的四个 0 是这是这个 Item 不需要显示出来,是因为目前我们不需要利用几个 Button.Item Property ValueItem Type Push ButtonSubclass Information FOLDER_OPENFOLDER_OPENCanvas CONTEN_CANVAS自带 Trigger WHEN-BUTTON_PRESSEDcopy(OPEN, global.folder_action);execute_trigger(folder_action);I
28、tem Property ValueItem Type Display ItemSubclass Information DYNAMIC TITLE 动态名称Canvas CONTEN_CANVASX Position 0Y Position 0Width 0FOLDER_TITLEHeight 0备注 后面的四个 0 是这是这个 Item 不需要显示出来,是因为目前我们不需要利用这个 Item.Item Property ValueItem Type Text ItemSubclass Information FOLDER_DUMMYCanvas TOOLBARX Position 0Y P
29、osition 0Width 0FOLDER_DUMMYHeight 05)修改 block 的 prompt 为空(包括主块和标签块)修改标签块的设置标签块的 Initial Value 属性:为要提示的内容6)创建 stacked canvas,并设置 block 显示到改 canvas 上,包括主块和标签块,设置stacked canvas 的属性,水平滚动条为 yes7)修改 trigger,在 when_new_form_instance 中添加:app_folder.define_folder_block(要导航的 block 名, -ObjectName 要导航的 block 名
30、, -folder_block, 标签块, -prompt_block, 新建的 stacked_canvas, -stacked_canvas, win_name, -window, NULL -disabledfunctions;);app_folder.event(INSTANTIATE); 8)在 when_window_resized 中添加IF :SYSTEM.EVENT_WINDOW IN (WINDOW_NAME) THENAPP_FOLDER.EVENT(WHEN_WINDOW_RESIZED);END IF;结束!31、Oracle 开发中出现 FRM-40831 错误的解
31、决办法?在开发 ORACLE Form 录入界面处理的过程中,出现“FRM-40831: 出现截段,域 XXX 太长”的错误,经分析处理,发现问题是由于“域 xxx”在 Form 中定义的长度与定义的数据表中的段 xxx 的长度不一致所致,经在 Form 中修改“ 域 XXX”的 maxlength 的长度与数据表中定义的 xxx 字段长度一致后,问题就解决!32、JTF Grid 开发步骤“遵循 JTF Grid 规范”换取“增删字段无需修改 Form 代码” 。33、使用 view 开发 form 步骤:1)建立 view,form(参考创建 form 步骤)并设置相关属性2)在 prog
32、ram unit 中添加 pkg,pkg 中包括 insert_row,update_row,delete_row,lock_row等过程,代码可由begin- Call the procedureoms_plsql_generator_pkg.form_view_iud_p(p_block_name = :p_block_name,p_table_name = :p_table_name,p_owner = :p_owner,p_primary_key = :p_primary_key);end; 生成3)在 view 块中加入 on_insert,on_delete,on_update,o
33、n_lock 触发器,相关代码引用新增加的 program unit 中的代码4)由于此时 view 更新、插入、删除、锁定等操作都只能关联到它对应的一个主表,而当它对应多个主表时,必须修改 program unit 中的各个过程的代码,或者为某些列(说明:为 view 来源的关联列)添加 lov 这样才能联级更新,插入等操作。34、跳转到其他的 form,在触发器中添加go_item(item_name )函数,自动弹出 item 所在的canvas。35、RAISE FORM_TRIGGER_FAILURE;自动触发整个 form的回滚36、配置文件存放表:fnd_profile_opti
34、ons、fnd_profile_option_valuesPLSQL 获取配置文件的值:FND_PROFILE.VALUE ();37、手电筒没反应:app_find.query_find(block_window,query_find_window,query_find_block)关闭不了,修改块之间的导航38、没有在界面上显示的列不能添加值列表选择39、在 form 中单击按钮让按钮变灰GO_BLOCK(PO_HEADERS);SET_BLOCK_PROPERTY(PO_HEADERS,DEFAULT_WHERE,WHERE DOCUMENT_NUM = | |:PO_HEADERS.D
35、OCUMENT_NUM | );-设置块的查询条件EXECUTE_QUERY; 这段写在按钮触发事件 然后在 block 的 post-query 写上按钮变灰就可以啦 40、form 中调用另外一个 form 函数:fnd_function.execute(function_name = OMS_SCHEDULE_COMPLETED,open_flag = Y,session_flag = SESSION,other_params = P_PL_PLAN_ID=“ | :lines.INVENTORY_ITEM_ID| “| P_PL_MONTH=“ | :headers.year_mont
36、h | “);41、调用请求集,参考命令:FND_SUBMIT.SET_REQUEST_SET42、判断 form 的状态If :System.Form_Status OMS_SCHEDULE_COMPLETED,open_flag = Y,session_flag = SESSION,other_params = P_PL_PLAN_ID=“ | :lines.INVENTORY_ITEM_ID | “| P_PL_MONTH=“ | :headers.year_month | “);47、更改 form 界面的值后,关闭窗口不想提醒是否保存信息时,可以更改 system.form_status 的值,取值为:CHANGED, NEW, QUERY 使用函数set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS);48、非必输项在做加减时必须使用 nvl 函数49、