Oracle EBS Form开发小技巧汇总

摘要:
APP_标准。APP_验证;IFTHENRaiseform_trigger_故障;ENDIF;IF:系统。FORM_STATUS='CHANGED'THENDO_KEY;ENDIF;APP_标准。APP_验证;IFTHENRaiseform_trigger_故障;ENDIF;IF:系统。FORM_STATUS='CHANGED'THENDO_KEY;ENDIF;第二个IF语句判断系统状态。如果用户更新了一行记录,但没有保存提交请求,则需要在提交前保存该请求。由于在可能使用的请求中使用了与项目对应的背景字段,因此保存此步骤非常重要。呼叫请求示例:[c-harp]viewplaincopyprint?l_request_id:=fnd请求。submit_请求;--如果请求提交不正确,则返回0ifl _ request_ id˃0notapp_ form.quietcommittenfnd_ message。调试;raiseFORM_触发器故障;endif;fnd_消息。集合名称;fnd_消息。set_ token;fnd_消息。显示endif;请求运行后,您可能需要根据具体情况重新查询块。

本文记录了一些在Form开发过程中积累下来的技巧:

  1. Form中提交并发请求
  2. 非数据库字段查询处理
  3. 控制Form为只查询
  4. 控制Item的属性
  5. Trigger的执行层次
  6. 按钮处理逻辑
  7. 日历相关

1,Form中提交并发请求

在提交请求之前,首先需要验证块,如果某些必填项没有填的话当然不能提交请求。

  1. APP_STANDARD.APP_VALIDATE(BLOCK_SCOPE);    
  2. IF (not FORM_SUCCESS) THEN  
  3.   Raise form_trigger_failure ;  
  4. END IF;          
  5. IF :SYSTEM.FORM_STATUS = 'CHANGED' THEN  
  6.   DO_KEY('COMMIT_FORM');  
  7. END IF;   

第二个IF语句判断系统状态,如果用户更新了一行记录,之后没有保存提交请求,那么需要在提交之前进行保存,因为可能使用的请求中使用到了该item所对应的后台字段,那么保存这一步就很重要了。

调用请求的例子:

  1. l_request_id := fnd_request.submit_request  
  2.        ( 'XXPO','XXPO_JIT_BATCHES_RPT_SECOND','','',FALSE,  
  3.          :SUBJOBS.SUB_JOB_BATCH,CHR(0)--CHR(0)表示参数结束  
  4.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  5.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  6.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  7.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  8.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  9.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  10.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  11.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  12.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  13.          NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);  
  14. --如果请求提交出错将会返回0                      
  15. if l_request_id > 0 then  
  16.   if NOT app_form.quietcommit then  
  17.     fnd_message.debug('conc request submited failed');          
  18.     raise FORM_TRIGGER_FAILURE;  
  19.   end if;  
  20.   fnd_message.set_name('FND''CONC-SUBMITTED REQUEST');  
  21.   fnd_message.set_token('REQUEST_ID', to_char(l_request_id));  
  22.   fnd_message.show;  
  23. end if;  
  24. 请求运行结束以后,可能还需要对Block进行重新查询,这个由具体情况而定。  

并发请求中有一个Start_Time的参数,可以设置成何时提交该请求。具体请参考User guide里面对fnd_request.submit_request的描述。

2,对于非数据库字段的查询

在Form中在查询的记录不希望某些记录显示出来,例如不需要供应商A被显示出来,假设供应商A是数据库项,可以使用

set_block_property(‘block_name’,

                    DEFAULT_WHERE,

                    ‘VENDOR_NAME <>’ || ‘A’)

但是建议不要使用上述方法,因为Block的Default where一旦被设置了以后,并不是只有本次生效,而是一直生效,也就是当下一次使用Ctrl + F11来进行查询的时候,实际上,查询语句的where条件就一直加入了我们手动加进去的查询语句。所以建议使用app_query.append来添加复杂的查询语句。

我们的重点是对非数据字段的查询,也就是如果供应商为非数据库项,那么如果在查询窗口中刚好对供应商有这个查询条件,该如何去做?

由于供应商字段为非数据库项,那么只能在post-query中去判断,例如在post-query中写道:

If Vendor_name = ‘A’ then

  Raise form_trigger_failure;

End if;

那么供应商A将不会被显示出来。由于Post-query是在查询出每条记录时都执行的,所以raise form_trigger_failure并不影响只是阻止了本触发器,但是并不是阻止了所有的。

最后要说明的一点是建议还是不要采用这样的方式,因为这是效率最低的判断,如果可以使用数据库项进行查询,就尽量不要使用这个方法。

  1. if name_in('parameter.query_only') <> 'Y' and :block.item = 'TTTT' then  
  2.   set_block_property('block',update_allowed,property_true);  
  3. else  
  4.   set_block_property('block',update_allowed,property_false);  
  5. end if;   

对于上例中对块进行控制的语句,如果没有加入对QUERY_ONLY的判断,那么对具有只查询功能的Function来说,QUERY_ONLY这个就等于没有作用了,因为在这里,其他条件可能使得这个Form也是可以进行修改的。

4,控制Item的属性

凡是需要改变item属性,都使用app_item_property.set_property( )代替set_item_property。

假设通过某个item的值来决定另外一个item的属性,例如名为status的item值决定了名为quantity的item是否可以更改,首先,第一个触发器是POST-QUERY,当查询出记录出,根据status的值来决定quantity,当对某条记录进行更改的时候,需要对该记录进行重新判断(如果修改的status就可能需要做出改变),所以第二个触发器为ON-UPDATE(或者POST-UPDATE目前找不出区别来),第三个触发器为WHEN-NEW-RECORD-INSTANCE,当新建记录时,可能Item的默认值已经确定了,那么就需要对其进行判断(这个只是可能,根据具体事件进行处理)

  1. PACKAGE BODY JOBS_PKG IS  
  2.   procedure control_item_property  
  3.   is  
  4.   begin  
  5.     if :JOBS.JOB_STATUS = 'NEW' then  
  6.       app_item_property.set_property('JOBS.REQUIRED_QUANTITY',alterable,PROPERTY_ON);  
  7.     else  
  8.       app_item_property.set_property('JOBS.REQUIRED_QUANTITY',alterable,PROPERTY_OFF);  
  9.     end if;  
  10.   end control_item_property;  
  11.    
  12.   procedure block_event(event varchar2)  
  13.   is  
  14.   begin  
  15.     if event = 'WHEN-NEW-RECORD-INSTANCE' then  
  16.       control_item_property;  
  17.     elsif event = 'POST-QUERY' then -- post-insert  
  18.       control_item_property;  
  19.     elsif event = 'POST-UPDATE' then  
  20.       control_item_property;  
  21.     else  
  22.       app_exception.invalid_argument('JOBS_PKG.BLOCK_EVENT','Event',event);  
  23.     end if;  
  24.   end block_event;  
  25. END JOBS_PKG;  

 

5,Trigger的执行层次

执行层次属性可以指定,当上一级有同样名称的trigger时,当前的trigger代码如何执行。

有以下三种设置:

Override(忽略):本trigger会执行。上一级的同名trigger会被忽略(不执行)。

Before(之前):本trigger会在上一级同名的trigger之前执行。

After(之后):本trigger会在上一级同名的trigger之后执行。

一般来说,WHEN-NEW-BLOCK-INSTANCE,WHEN-NEW-RECORD-INSTANCE,WHEN-NEW-ITEM-INSTANCE,都需要把执行层次设置为before

6,按钮处理逻辑

点击按钮之前最好先检查一下系统的状态,可能用户在修改了某一些东西后直接点按钮,我们要帮他保存

另外在查询模式下不允许用户点按钮

  1. app_standard.app_validate(block_scope);  
  2.    
  3. if(not form_success) then  
  4.   raise form_trigger_failure;  
  5. end if;  
  6.    
  7. if :system.form_status = 'CHANGED' then  
  8.   if not app_form.quietcommit then  
  9.     raise form_trigger_failure;  
  10.   end if;  
  11. end if;  
  12.    

 

  1. calendar.setup( 'Manafacturing Holidays',  
  2.                  null ,  
  3.                  null ,  
  4.                  'select action_date LOW_DATE, action_date HIGH_DATE'||  
  5.                  ' from org_holidays where date_type = "HOLIDAY" ');   

更多细节可以参看developer guide P164-P168

免责声明:文章转载自《Oracle EBS Form开发小技巧汇总》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇echarts 设置折线颜色和小圆点颜色OpenCV 2.4.9 学习笔记(4)—— 像素类型与Templates的限制使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle查询用户权限角色(dba_sys_privs) (转)

Oracle查询用户权限 (转自:CSDN) 数据字典 1、动态数据字典是以v$xxx开始的数据字典,在数据库中约有150个左右,这些数据字典反映数据库动态运行状况,在不同时间查询会得到不同的结果。 2、DBA数据字典是以DBA_xxx表示,该数据字典存储数据库结构,查询DBA数据字典可以反映数据库结构设置,管理磁盘空间和表空间、事务与回退段、用户与表空间...

WebLogic浅析

WebLogic安装 官网下载安装过程没啥特别的,不多说了自己去看吧! WebLogic简介   WebLogic是美国Oracle公司出品的一个Application Server,确切的说是一个基于JavaEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和...

数据库辅助工具SqlDbx

SqlDbx 是简单易用的数据库设备,SQL编辑,SQL查询工具。语句规则突出,智能化,自动完成,等等特色功能多多。支持Oracle,Sybase ASE, IBM,DB2/UDB, MicrosoftSQL Server,MySQL 和ODBC数据源。 可以看到库中有多少表、多少存储过程、多少触发器、多少视图、多少函数,可以直接看到每个表的数据行数,可以...

【12c】Oracle Restart中的SRVCTL命令详解

SRVCTL,服务控制实用工具(Service Control Utility),可用于对Oracle Restart和Oracle RAC的配置和管理,本篇主要介绍SRVCTL命令在Oracle Restart中的应用,其中,详细介绍config、status命令,并列出其它命令的用法。 1 srvctl命令语法 Usage: srvctl <co...

ArcGis连接oracle、oracle配置

服务器:Oracle11g(我是默认路径安装,自定义路径没成功,不知道为什么) 客户端:arcgis desktop 10.2、oracle 11g 32位客户端 客户端:arcgis server 10.2、oracle 11g 64位客户端 1、服务器上安装oracle 11g,客户端安装arcgis desktop 10.2对应oracle 11g...

关于oracle 数据库效率的优化

最近项目快要快要结束了,我们最终还是要面对我们一直存在的问题,就是数据库查询编码的问题,但是通过各个方面观察我们发现数据库仅仅200w条数据查询议一天的数据也就仅仅不到两万条数据没结果查了将近两分钟,这按章正常状态来讲那是不可能出现的情况,但是经过很久的观察我们还是找到了原因,那就是我们在做sql语句编写的时候那是不合理的 接下来我就给大家罗列一下相关情况...