《Oracle+EBS+Form开发小技巧汇总》由会员分享,可在线阅读,更多相关《Oracle+EBS+Form开发小技巧汇总(64页珍藏版)》请在金锄头文库上搜索。
1、contentOracle EBS Form 开发小技巧汇总 .2Form 中 Block 的重新查询 .9客户化 Form 中实现行号功能 .12使用 Custom.pll 修改标准 Form 的 LOV.16实现主从关系 Form 中汇总行金额/数量 .21Oracle EBS 客户化程序中格式化金额 .25Form 中动态创建 PopList .28Oracle EBS 环境下查找数据源(Form 篇) .30解决 EBS 中混淆经营单位和库存组织问题 .39多组织访问控制(MOAC) .43序号 API .46FORM 一步步教你如何在 form 中使用 pl/sql 将数据文件上传到
2、客户表中 .56Oracle EBS Form 开发小技巧汇总09 月 20, 2009 分类: Oracle EBS 二次开发 作者: alther1986本文记录了一些在 Form 开发过程中积累下来的技巧:1. Form 中提交并发请求 2. 非数据库字段查询处理 3. 控制 Form 为只查询 4. 控制 Item 的属性 5. Trigger 的执行层次 6. 按钮处理逻辑 7. 日历相关 1, Form 中提交并发请求在提交请求之前,首先需要验证块,如果某些必填项没有填的话当然不能提交请求。?Copy to clipboardView Code PLSQL 1234567APP_S
3、TANDARD.APP_VALIDATE(BLOCK_SCOPE); IF (not FORM_SUCCESS) THENRaise form_trigger_failure ;END IF; IF :SYSTEM.FORM_STATUS = CHANGED THENDO_KEY(COMMIT_FORM);END IF;第二个 IF 语句判断系统状态,如果用户更新了一行记录,之后没有保存提交请求,那么需要在提交之前进行保存,因为可能使用的请求中使用到了该 item 所对应的后台字段,那么保存这一步就很重要了。调用请求的例子:?Copy to clipboardView Code PLSQL 1
4、 l_request_id := fnd_request.submit_request23456789101112131415161718192021222324( XXPO,XXPO_JIT_BATCHES_RPT_SECOND,FALSE,:SUBJOBS.SUB_JOB_BATCH,CHR(0)-CHR( 0)表示参数结束NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
5、NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
6、NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);-如果请求提交出错将会返回 0 if l_request_id 0 thenif NOT app_form.quietcommit thenfnd_message.debug(conc request submited failed); raise FORM_TRIGGER_FAILURE;end if;fnd_message.set_name(FND, CONC-SUBMITTED REQUEST);fnd_message.set_token(REQUEST_ID, to_char
7、(l_request_id);fnd_message.show;end if;请求运行结束以后,可能还需要对 Block 进行重新查询,这个由具体情况而定。并发请求中有一个 Start_Time 的参数,可以设置成何时提交该请求。具体请参考User guide 里面对 fnd_request.submit_request 的描述。2,对于非数据库字段的查询在 Form 中在查询的记录不希望某些记录显示出来,例如不需要供应商 A 被显示出来,假设供应商 A 是数据库项,可以使用set_block_property(block_name,DEFAULT_WHERE, VENDOR_NAME | A
8、)但是建议不要使用上述方法,因为 Block 的 Default where 一旦被设置了以后,并不是只有本次生效,而是一直生效,也就是当下一次使用 Ctrl + F11 来进行查询的时候,实际上,查询语句的 where 条件就一直加入了我们手动加进去的查询语句。所以建议使用 app_query.append 来添加复杂的查询语句。我们的重点是对非数据字段的查询,也就是如果供应商为非数据库项,那么如果在查询窗口中刚好对供应商有这个查询条件,该如何去做?由于供应商字段为非数据库项,那么只能在 post-query 中去判断,例如在 post-query 中写道:If Vendor_name =
9、A thenRaise form_trigger_failure; End if;那么供应商 A 将不会被显示出来。由于 Post-query 是在查询出每条记录时都执行的,所以 raise form_trigger_failure 并不影响只是阻止了本触发器,但是并不是阻止了所有的。最后要说明的一点是建议还是不要采用这样的方式,因为这是效率最低的判断,如果可以使用数据库项进行查询,就尽量不要使用这个方法。3,控制 Form 只查询在定义 Function 的时候,如果在参数中加入 QUERY_ONLY=YES,那么 Form 就只能查询,在 Form 中调用FND_FUNCTION.EXEC
10、UTE( FUNCTION_NAME = XXPOFJCT,OTHER_PARAMS = QUERY_ONLY=YES);那么新加出来的 form 就是只查询状态。这个 QUERY_ONLY 参数是系统自带的一个参数,但是实际上,它也是在 Form 的查询中,进行了对 QUERY_ONLY 参数的判断。所以需要特别注意的就是,当使用了这个参数后,客户化的 Form 在控制块查询时,是需要进行 QUERY_ONLY 参数判断的。?Copy to clipboardView Code PLSQL 12345if name_in(parameter.query_only) Y and :block.
11、item = TTTT thenset_block_property(block,update_allowed,property_true);elseset_block_property(block,update_allowed,property_false);end if;对于上例中对块进行控制的语句,如果没有加入对 QUERY_ONLY 的判断,那么对具有只查询功能的 Function 来说,QUERY_ONLY 这个就等于没有作用了,因为在这里,其他条件可能使得这个 Form 也是可以进行修改的。4,控制 Item 的属性凡是需要改变 item 属性,都使用 app_item_prope
12、rty.set_property( )代替set_item_property。假设通过某个 item 的值来决定另外一个 item 的属性,例如名为 status 的 item 值决定了名为 quantity 的 item 是否可以更改,首先,第一个触发器是 POST-QUERY,当查询出记录出,根据 status 的值来决定 quantity,当对某条记录进行更改的时候,需要对该记录进行重新判断(如果修改的 status 就可能需要做出改变),所以第二个触发器为 ON-UPDATE(或者 POST-UPDATE 目前找不出区别来),第三个触发器为 WHEN-NEW-RECORD-INSTAN
13、CE,当新建记录时,可能 Item 的默认值已经确定了,那么就需要对其进行判断(这个只是可能,根据具体事件进行处理)?Copy to clipboardView Code PLSQL 1234567891011121314151617181920212223PACKAGE BODY JOBS_PKG ISprocedure control_item_propertyisbeginif :JOBS.JOB_STATUS = NEW thenapp_item_property.set_property(JOBS.REQUIRED_QUANTITY,alterable,PROPERTY_ON);el
14、seapp_item_property.set_property(JOBS.REQUIRED_QUANTITY,alterable,PROPERTY_OFF);end if;end control_item_property;procedure block_event(event varchar2)isbeginif event = WHEN-NEW-RECORD-INSTANCE thencontrol_item_property;elsif event = POST-QUERY then - post-insertcontrol_item_property;elsif event = POST-UPDATE thencontrol_item_property;elseapp_exception.invalid_argument(JOBS_PKG.BLOCK_EVENT,Event,event);end if;end block_event;END JOBS_PKG;24255, Trigger 的执行层次执行层次属性可以指定,当上一级有同样名称的 trigger 时,当前的 trigger 代码如何执行。有以下三种