一般情况下二次开发form中_第1页
一般情况下二次开发form中_第2页
一般情况下二次开发form中_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一般情况下二次开发form中(不论是基于表还是基于视图的数据块),不需要复写ON-LOCK触发器,系统会自动 处理的很好,那么,出于对form开发更为深入的探索,我决定还是仔细研究研究这个触发器的功用,触发时间, 以有相应的 pl/sql 处理过程等。以此可以作为研究其它触发器的一个范例,找到一个学习研究的方法。form端的ON-LOCK触发器用于获取oracle数据表的行级排他锁,当ON-LOCK触发器fire时,他会试图去获 得这个锁,如果这时没有其它session获得这个锁,或者说其它session己经释放这个锁,那么我们的form会很顺 利的获得。否则会抛出 app_exception

2、s.recordock_exception异常。一般我们会写一个loop .end loop;块出来, 再定义一个计数器counter计录循环次数,把它作为参数传入到app_exception.recordock_error(counter);处理过程 中。这时,当这个counter为2,4,6,8这样的偶数时,在form中会弹出message,用于用户选择是否继续试图获得lock, 或中止 procedure 的执行。因为在 app_exception.recordock_error()过程的最后,会 raise 一个 form_trigger_failure 的异常。哪么 on-lock

3、触发器在什么时候触发呢,帮助中说:“Fires whenever Form Builder would normally attempt to lock a row, such as when an operator presses a key to modify data in an item. The trigger fires between the keypress and the display of the modified data. ”就在当我们进入到form,查询到记录之后,然后,当我们在某一个item中输入内容与这个内容display到显 示屏之间那不知多么短的时间内, i

4、t fires!现在我们来看看比较完整的处理代码,为了简便期间,我对代码进行了简化:procedure lock_row ascounter NUMBER;cursor C isselectl_id,out_date,back_date,customer,from cdm_loanwhere rowid = :loan.row_idfor update of l_id nowait;-for update of vtable.columons, vtable.columons nowait;这里of只在多表链接查询时才有用,意为锁定指定 列所对应的表,会根据where条件来获得该表的某一行的锁

5、,nowait表示如果获取不了锁,那么直接返回错误.recinfo C%rowtype;beginfnd_message.debug(lock_row is begin);counter := 0;-循环记数器(变量)loopbegincounter := counter+1;open C;fetch C into recinfo;if (C%NOTFOUND) thenclose C;fnd_message.set_name(FND,FORM_RECORD_DELETED);fnd_message.error;raise form_trigger_failure;end if;close C

6、;if (-检查固定列,数据库中一般为非空字段,form中对应的item的require属性一般为yes,同时,block的query data source columns中相应列的mandatory属性要勾上(recinfo.l_id = :loan.l_id)AND (recinfo.status = :loan.s_id)-检查非固定列,数据库中一般指为充许空字段,form中对应的item的require属性一般为no,block的query data source columns中相应列的mandatory属性要去掉勾AND (recinfo.out_date = :loan.out

7、_date)OR (recinfo.out_date is null)AND (:loan.out_date is null)AND (recinfo.back_date = :loan.back_date)OR (recinfo.back_date is null)AND (:loan.back_date is null)AND (recinfo.customer = :loan.customer)OR (recinfo.customer is null)AND (:loan.customer is null)thenreturn;-满足条件后退出循环else-当 form 中的值同数据库中

8、的值不匹配时的处理fnd_message.set_name(FND, FORM_RECORD_CHANGED);fnd_message.error;raise form_trigger_failure;end if;exception-当不能获取锁时,的异常代码,该异常由系统自动抛出when app_exceptions.record_lock_exception thenapp_exception.record_lock_error(counter);end;end loop;end lock_row;这里要明白几点:1、我们调用此ON-LOCK触发器代码时,相应表中的某行即被锁定,众所周知

9、,oracle数据库执行for update时, 即获得锁,如果不commit或rollback或断掉session,这个锁是不会被主动释放的。但是在form中,我们只要保 存这条记录时,或关掉form窗口,就会释放锁,不论你是否在ON-UPDATE中真正的执行了 update语句,系统 都会通过自动给你执行一个 commit 来实现。2、 loop .end loop中的begin .end有什么用? 这个begin.end是无奈之举,因为如果没有begin .end的话,我 们就不能在procedure中的一个特定的范围内处理异常(exceptions语句),这样的结果会出现一旦loop中某一个 记录出了问题,那么整个 procedure 都会中止,当遇到海量数据的处理时,非常不便。因为没有异常处理代码的 异常会被传入上一级。3、程序要保证在获取锁的时刻form界面上的值要和数据库中值相匹配,才行。如果有不匹配的情况就会强制让 你重新查询,再来修改,在修改保存前,你都拥这个锁。当第一次进入form时,查询后,在某一个item上输入内

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论