EBS Form开发中复写on-lock触发器

一般情况下二次开发form中(不论是基于表还是基于视图的数据块),不需要复写ON-LOCK触发器,系统会自动处理的很好,那么,出于对form开发更为深入的探索,我决定还是仔细研究研究这个触发器的功用,触发时间,以有相应的pl/sql处理过程等。以此可以作为研究其它触发器的一个范例,找到一个学习研究的方法。

   form端的ON-LOCK触发器用于获取oracle数据表的行级排他锁,当ON-LOCK 触发器fire时,他会试图去获得这个锁,如果这时没有其它session获得这个锁,或者说其它session己经释放这个锁,那么我们的form会很顺利的获得。否则会抛出  app_exceptions.record_lock_exception异常。一般我们会写一个loop ..end loop;块出来,再定义一个计数器counter计录循环次数,把它作为参数传入到app_exception.record_lock_error(counter);处理过程中。这时,当这个counter为2,4,6,8这样的偶数时,在form中会弹出message,用于用户选择是否继续试图获得lock,或中止procedure的执行。因为在app_exception.record_lock_error()过程的最后,会raise一个form_trigger_failure的异常。

   哪么on-lock触发器在什么时候触发呢,帮助中说:“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到显示屏之间那不知多么短的时间内,it fires!

现在我们来看看比较完整的处理代码,为了简便期间,我对代码进行了简化:

  procedure lock_row as

  counter NUMBER;

  cursor C is

   select

    l_id,

    out_date,

    back_date,

    customer,

       from cdm_loan

   where rowid = :loan.row_id

   for update of l_id nowait;              

 ---for update of <table.columons>, <table.columons> nowait;这里"of"只在多表链接查询时才有用,意为锁定指定  列所对应的表,会根据where条件来获得该表的某一行的锁  ,nowait 表示如果获取不了锁,那么直接返 回错误.

recinfo C%rowtype;   

  begin

   fnd_message.debug('lock_row is begin');

   counter := 0;   --循环记数器(变量)

   loop

    begin

     counter := counter+1;

     open C;

     fetch C into recinfo;

     if (C%NOTFOUND) then   

      close C;

      fnd_message.set_name('FND','FORM_RECORD_DELETED');

      fnd_message.error;

      raise form_trigger_failure;

     end if;

      close C;

     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_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)))       

                      )

        then

     return;---满足条件后退出循环

     else--当form中的值同数据库中的值不匹配时的处理  

        fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');

        fnd_message.error;

        raise form_trigger_failure;

    end if;

     exception   ---当不能获取锁时,的异常代码,该异常由系统自动抛出      

        when app_exceptions.record_lock_exception then

              app_exception.record_lock_error(counter);  

     end;

       end loop; 

  end lock_row;

  这里要明白几点:

1、我们调用此ON-LOCK触发器代码时,相应表中的某行即被锁定,众所周知,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上输入内容,触发on-lock,这时,眼睛看着界面上item的内容明明改变,但是却成功通过了on-lock中数据一致性的验证,这是为什么呢,因为界面上的内容还没有被保存到相应item的实际value中,要通过保存记录,才会更新界面内容。要明白这一点,可以通过不在on-update中写更新代码来搞清楚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EBS Form开发手册是指Oracle E-Business Suite(EBSForm开发的详细指南和教程。Oracle EBS是一套集成的企业资源规划(ERP)软件解决方案,它提供了许多标准的应用程序模块,用于不同的业务领域,例如财务、供应链、人力资源等。 FormEBS用于开发用户界面的工具之一,它可以创建交互式的数据输入和显示窗体。Form开发手册提供了详细的说明和示例,帮助开发人员理解和使用Form开发工具的各种功能。 在EBS Form开发手册,你可以学习到如何创建自定义的数据输入和显示窗体,如何利用Form Builder工具进行界面设计和布局,以及如何添加和管理字段、按钮、菜单等控件。手册还解释了各种Form开发的常用概念和技术,例如表单对象、触发器、继承、模块间通信等。 此外,手册还介绍了如何处理Form的验证、处理用户输入、数据保存和查询等操作。它还提供了一些最佳实践和技巧,以帮助开发人员编写高效、可靠和易于维护的Form代码。 总之,EBS Form开发手册是EBS开发人员学习和参考的重要资源。通过学习这份手册,开发人员可以深入了解Form开发工具的使用方法和技巧,从而更好地设计和开发EBS应用程序界面。 ### 回答2: EBS(Elastic Block Store)是亚马逊云计算平台提供的一种云存储服务,EBS Form是用于开发和管理EBS卷的专用工具。EBS Form开发手册为使用EBS Form开发人员提供了详细的操作指南和技术参考。 EBS Form开发手册首先介绍了EBS Form的基本概念和主要特性。它解释了如何使用EBS Form创建、修改和删除EBS卷,描述了EBS卷的各种属性和功能选项,并提供了实际案例和最佳实践,以帮助开发人员更好地理解和应用EBS Form。 手册还包括了EBS Form的安装配置和环境设置的详细说明。它介绍了EBS Form客户端的安装过程,以及如何配置和连接到云存储服务。开发人员可以按照手册提供的步骤和示例,快速搭建EBS Form开发环境,开始使用EBS Form进行云存储的开发工作。 此外,手册还提供了EBS Form的API文档和开发接口说明,以及与其他云服务的集成方法和建议。开发人员可以通过手册了解如何调用EBS Form的API进行卷的管理和操作,并了解如何将EBS Form与其他云计算服务(如Amazon EC2)进行集成,实现更多复杂的应用场景和业务需求。 综上所述,EBS Form开发手册是一本面向开发人员的指南,它详细介绍了EBS Form的功能和用法,提供了丰富的实例和技术参考,帮助开发人员更好地理解和应用EBS Form。通过熟练使用EBS Form开发人员可以更高效地开发和管理云存储服务,满足不同应用场景的需求。 ### 回答3: ebs form开发手册是一本针对EBS(Enterprise Business Suite)系统的表单开发的指南。EBS是由Oracle开发的一套集成的企业级管理软件,涵盖了各个方面的业务功能,如人力资源管理、财务管理、供应链管理等。 该开发手册提供了详细的指导和说明,帮助开发人员了解和掌握EBS系统的表单开发。它包含了各个阶段的开发过程,从需求分析、设计、开发、测试到部署和维护。通过遵循这个手册,开发人员可以按照规范的流程正确地开发表单,确保系统的稳定性和可靠性。 在这个开发手册开发人员将学习使用EBS系统的表单开发工具和技术,如Oracle Forms和Oracle PL/SQL。他们将了解如何创建表单界面、定义数据字段、实现业务逻辑、编写触发器和事件等。此外,手册还介绍了与表单开发相关的最佳实践和常用的技巧,帮助开发人员提高开发效率和质量。 EBS表单开发手册还提供了丰富的示例和案例,让开发人员能够更好地理解和应用所学知识。通过实际练习和实践,开发人员可以更好地掌握EBS表单开发的技巧和方法,为企业提供定制化的解决方案。 总之,EBS表单开发手册是一本详尽的指南,帮助开发人员了解和掌握EBS系统的表单开发。通过遵循手册的指导,开发人员可以正确地开发表单,并提供高质量的解决方案,以满足企业的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值