没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
下载
第5章 高级进程、触发器和跨平台设计
第4章讲述了用Oracle Developer做的许多工作,本章研究这个产品的内部工作情况,展示
一些特殊的进程,以及它们是如何工作而产生所想要的效果的。有了进程的知识,在某些细
节上,就可以了解如何使用 Oracle Developer的事件处理特点,为以后的几章中的高级教程作
准备。
注意 本章的辅导和例子给你说明如何以及在哪里的触发器上使用P L / S Q L编程,将你
自己的逻辑加到Oracle Developer的标准进程中。通常,这些标准进程就足够了。第4章
讲述了如何完全不用编码建立一个工作应用程序。第11章和第1 2 章详细地讲述P L / S Q L
编程。所以本章只是简单地提供示例的代码,而不去进一步充分讲述编程的细节。这
些示例说明如何完成触发器的基本任务,你可以用在这里和在第 11章第1 2 章学到的东
西为基础,去建立非常复杂的应用程序。
在Unified Modeling Language(UML)中,活动的框图表示进程。活动框图通过进程表示工
作的流动,很像旧的流程图。但是活动框图直接涉及对象的状态和它们之间的控制流。它们
适合于说明Oracle Developer运行时的表单、报表和图形的进程工作流。在本章的第一张图中
给出了一些例子,图中的文本足够评细地对活动图进行解释,使你能了解它。本章讲述在
Oracle Developer中跨平台开发应用程序的一些有关问题。展示了要得到最大的可移植性如何
设计表单、报表和图形。
5.1 Oracle Developer进程和触发器:它们是如何工作的
这一部分综述Oracle Developer是如何施用它的魔法的。前面几章介绍了 Oracle Developer
数据库应用程序和对象的基本概念,本章讲述这些对象如何相互作用,象一个系统那样工作。
在设计Oracle Developer应用程序中,最实际的低级设计是决定将代码放在哪里。因为你
不是根据S c r a t c h 来开发应用程序逻辑,所以必须使增加的东西适合于 Oracle Developer的逻辑。
为了做到这一点,需要知道 D e v e l o p e r在哪运行你的代码,并在执行代码之前和之后发生什么。
这一部分通过说明这些进程是什么,在这些进程内的什么地方激活触发器,清楚地告诉你在
Oracle Developer进程的什么地方可以进行干预。
Oracle Developer应用程序是事件驱动的。当程序运行时,你和运行系统相互作用引发事
件,事件又启动各种表单的进程。这些表单进程包含有预先编程的表单、报表和图形的缺省
特性。在各种内部事件发生的过程中,运行时的系统通过运行你用 P L / S Q L 写的代码来处理它
们:激活触发器。
你可以在高层次上继承设计师在这个产品中建立的一组假设和特性,而不必从头开始分
析和设计。用一组预先编程的特性开始,这是一个很高的开发起点。本章的进程描述了 O r a c l e
D e v e l o p e r 应用程序的缺省运行时的特性。了解这些进程帮助你像 Oracle Developer那样思考,
而不是根据S c r a t c h 来开发整个系统特性。如果你利用 Oracle Developer工作,而不是与它对着
干,那么,大概会成功。
5.1.1 表单进程和触发器
在Oracle Developer的三个部分中,F o r m s有最成熟的逻辑。这部分概述 F o r m s 中不同的进
程和触发器。
首先,必须了解一个基本的概念:导航和范围。
1. 导航
用户界面允许系统的用户工作。虽然这似乎是明显的,但其重要性在于了解表单开发结
构的基本原理。Oracle Developer的表单是事件驱动的,这就意味着用户通过用户界面来控制
进程,而不是应用程序来控制它。
在任何给定时间, Oracle Developer Forms的用户界面允许用户和单个对象相互作用。比
如按钮、下拉列表(菜单)或文本域。单个对象是用户界面的一部分,是用户的焦点 ( f o c u s ) 。引
用焦点的另外一种方法是引用游标的位置
—
一种虚拟的指针,它指到有这个焦点的对象。光
标是虚构的野兽,有时允许人看见它。例如,当游标出现在文本域时,它通常作为对平台输
入文本的指示器,比如 Wi n d o w s中的细直条或M a c i n t o s h中的一束射线。其他项,比如图片或
单选按钮并不明显地显示光标,所以使用“焦点”这个术语可以避免混淆。特别是术语“游
标”至少指三种不同的东西,它可以指鼠标, S Q L的游标( c u r s o r ),或独立于表单的键盘游标。
注意 “单个对象”指的是单个应用程序对象。从表单进程的角度看,用户界面,比如
窗口和菜单是不相干的,只有画布上的项目可以放置焦点。然而从用户界面的角度看,
“焦点”像对对象一样,也适用于包含应用程序焦点的窗口。所以,如果焦点在文本域,
那么,它也在包含文本域的画布的窗口上出现,而且也在应用程序的 M D I 窗口出现。
在这本书中,术语“焦点”指的是应用程序对象焦点,不是窗口的焦点。你可以从
McGraw-Hill Web站点,www.Osborne . com和这本书的例子一起下载这些进程的综合参
考材料。
用户通过从对象到对象移动焦点与应用程序交互,这个移动就是 n a v i g a t i o n ( 导航)。通过
从项到项、从记录到记录、从块到块,或从表单到表单导航,用户控制应用程序和任务。导
航事件(进入到不同的项,进入到不同的记录,进入到不同的块,进入到不同的表单 )构成了表
单应用程序的基本事件。后面部分的许多进程或者包含这些事件或者是这些事件的结果。
在Oracle Developer Forms中导航的对象按导航单元的层次排列。表单包括一系列的块,
每个块包含一组记录和一系列项。 Oracle Developer Forms的导航活动是由于用户的活动而自
动发生的导航。如果焦点在一个块的一个项上,而在这个块的另一个项上单击,那么则从项
导航到项。如果项不再同一个块上,那么必须从数据块导航到数据块。如果每个数据块有不
同的记录,那么你还必须从记录导航到记录。每一个导航事件都有不同的结果。比如某些触
发器启动(在这种情况下,分别是 W h e n - Va l i d a t e - I t e m 、W h e n - Va l i d a t e - B l o c k和W h e n - Va l i d a t e -
R e c o r d (当确认项时,当确认块时,当确认记录时 )。
对象的层次
—
项、记录、块、表单
—
导致一组进程,关系到导航的层次,比如说
Navigate to Form Level (导航到表单层)。在这些表单进程的名字中的“层” ( L e v e l ) 指的是在
对象层次结构中的导航单元:
■ Navigate to the Form Level(导航到表单层)
■ Navigate to the Block Level (导航到块层)
8 2 第二部分 Oracle Developer教程
下载
■ Navigate to the Record Level (导航到记录层)
■ Navigate to the Item Level (导航到项层)
每一个表单进程都把焦点从当前单元移到指定的目标。这个进程识别包含目标和“ e n t e r s”
的导航单元的下一个比较小的子单元,把焦点设置到那个对象上。
导航进程自动地确认当前的导航单元。例如从某一项导航到表单层,那么根据导致这个
导航的特定事件来确认这个项。某些事件导航不确认,大多数导航有确认。大多数取决于单
元
—
层,在这层上通过表单的 Validation Unit(确认单元)属性设置需要确认的表单。本章后
面的“确认”部分,讲述基本的确认进程。
虽然大多数表单导航是用户行为的结果,但进程也可以引起导航发生。例如在许多 O r a c l e
Developer Forms触发器中,可以调用内部的子程序,比如 G o _ I t e m 、G o _ B l o c k . 或G o _ R e c o r d 。
在本章的后面,“导航的处理”比较详细地讲述导航。
注意 导航是Oracle Developer的关键概念。实际上,所作的每一件事情都和导航有关。
虽然这个概念和进程其本身是相当简单的,但它们普遍存在,与许多有意思的而有时
是不可预测的方法相结合,超过任何别的东西。在 D e v e l o p e r中导航是必须在字面上和
图形表现上均要“照此办理”的,试图“对付”Developer的导航结构,总将发生问题。
2. 触发器作用域
可以按照Object Navigator的分层结构在项目层、块层或表单层定义 Oracle Developer Forms
的触发器。触发器作用域是一组激活触发器的对象,它由拥有触发器的对象和属于这个对象的
对象组成。例如,如果把一个触发器连接到一个块,那么这个块的所有项的事件都启动这个触
发器。
注意 留心的读者可能发现,最后一个段落并没有提到记录层作用域。虽然有记录导航
触发器,但并不是在记录上定义这些触发器,记录只在运行时存在,在Form Builder中
它不能作为对象得到。因此,不能把触发器连接到“记录”上。因为数据块可以看作
是记录的聚集,所以经常将面向记录的触发器连接到数据块上。这些块触发器由当前
记录
—
有焦点的记录
—
启动,因此记录触发器没有实际的作用域。
如果在一个特定的作用域内有多个触发器有相同的名字, Oracle Developer按缺省值启动
连接到层次结构中最低的那个对象的触发器。例如,如果把一个 W h e n - N e w - I t e m 触发器放在
一个项和这个项的块上,那么 Oracle Developer启动连接在项上的触发器,而不理会连接到块
上的那个触发器。可以通过改变触发器属性表中的 Execution Style(执行方式)属性改变特定触
发器的属性。缺省值为 O v e r r i d e 。还可以选择B e f o r e或A f t e r ,B e f o r e 规定触发器在任何较高级
的触发器之前启动,而 A f t e r 则是在较高层的触发器之后启动。次高层的触发器可以选择和当
前的触发器一起启动。可以在较高层的作用域层上设置这些属性,使得在这些层上的所有的
触发器可以在项目触发器之前或之后启动。
提示 利用Execution Style(执行方式)设置为Before或After使多个触发器启动,显著地增
加了模块的复杂性。除非有十分充足的理由要这样做,否则应避免它,以使模块比较
容易理解、调试和测试。
某些触发器只有在特定的层上定义它们才有意义。例如, W h e n - Va l i d a t e - R e c o r d并不适用
于单独的项,只可以在块和表单层上定义它。 S m a r t Tr i g g e r s 特性识别那些很可能为特殊对象
第5章 高级进程、触发器和跨平台设计 8 3
下载
定义的触发器。在 Object Navigator或Layout Editor上右击想定义触发器的对象,引出弹出菜
单包含一个S m a r t Tr i g g e r s 项,在这个项上单击,显示一个子菜单,列出对于这个对象最有意
义的触发器。选择适当的项,显示这个触发器的 P L / S Q L 编辑器。子菜单还包含一个 O t h e r 项,
显示标准的触发器选择对话框,可以列出所有的 Oracle Developer触发器(见图5 - 1 )。
图5-1 Oracle触发器
也可以通过属性类继承触发器,而且可以引用已经定义过的触发器。这些触发器有一个
相同的规则:仅有一个触发器执行。如果用项上的触发器取代 P r o p e r t y - C l a s s 触发器,则项触
发器执行。对象组仅能够定义表单层的触发器,块和项的触发器和它们的块和项一起产生。
注意 为了简单起见,本章的图表不展示触发器和它们的判定。但是每一个触发器都会
成功或失败,如果触发器成功,进程如流程图所示的那样继续,如果触发器失败,进
程停止,带着错误返回。
现在已经对导航建立了一个概念,而且基本了解了触发器是如何工作的,如何利用
S m a r t Tr i g g e r s ,以及如何修改触发器的缺省属性。下面该了解进程和触发器在实际的项目中
都做了些什么。
3. 事务处理
表单事务是一连串的事件、进程和触发器,最终导致将数据提交给数据库或回滚变化。
这一部分讲述事务中实际工作的基础进程。下面包括一些真实的进程。
1) 登记数据库 登记数据库的意思是通过一系列的 I N S E RT、U P D AT E和D E L E C T 语句把
表单中正在进行的各种变化写进数据库。 Oracle Developer产生这些语句作为它的缺省处理的
一部分。登记并不提交这些变化,但是它通常伴随提交或回滚作为缺省性的一部分。登记进
程的作用是启动所有有效的触发器,所以每一次对数据库的登记都使存贮的数据生效。不管
是否提交。
在缺省情况下,在数据库的一次登记后面是结束事务的提交或回滚。但是,可以利用
P O S T 内部程序来登记变化而不用提交。不用提交的登记的主要用法是,当从另外的表单打开
一个表单时,可能在第一个表单中有未提交的数据,而第二个表单的存在可能正是为了加更
多的数据到一个正在进行的事务中。
例如,可能要在一个会计事务中输入一项,这要求通过一个单独的表单在一个辅助表上
8 4 第二部分 Oracle Developer教程
下载
加一些详细的信息。在打开第二个表单时, Oracle Developer要求未完成的数据都要记入数据
库以保证数据的完整性。因此,应调用项目的 Post in the when-Va l i d a t e - I t e m触发器代码。
注意 第10章详细讨论多表单处理以及管理它的不同技术。
在详细讨论登记过程之前,对活动流程图作一简略的说明。图形中长方形是行为说明,
说明内部的行为和至少一个转移。本章的活动图全部用内部的 Oracle Developer Forms进程作
为行为说明,比如Savepoint 或Clean up cursors。箭头表示转移
—
从一个行为说明转移到另
一个行为说明或判断上。有两种特殊的转移,起源于黑圆圈的转移是一个空转移,表示图中
活动的开始。在外带一个圆圈的黑圆圈处终止的转移是一个退出转移,表示活动结束。退出
转移是“成功”还是“失败”取决于活动的结果。菱形表示判断,根据条件分支转移 (如果条
件为真,流向一个方向,如果条件为假,流向另一个方向 ),在判断处的一个转移旁边的文本
是隔离( g u a r d ) 条件。
图5 - 2 是记入进程的简化活动图。
图5-2 记入过程的简化UML活动图
现在,详细描述记入过程。首先, Oracle Developer导航到表单层,然后确认表单,如果
没有要求记入的变化,那么过程就停在这里。
然后Oracle Developer在记入之前发出一个保守点,保守点是 O r a c l e的下一个特性,它标
识事务的一个点,如果需要你可以回滚到这个点,而不必回滚整个事务,这就允许 O r a c l e
D e v e l o p e r记入多次而不用回滚所有的记入
—
只要失败的那个邮件。
第5章 高级进程、触发器和跨平台设计 8 5
下载
确认表单
保守点
启动P r e -
C o m m i t触发器
确认块
数据库操作<删除>
数据库的操作
<插入/更新>
清除内部标志
清除游标
启动P o s t - D a t a b a s e
C o m m i t触发器
提交到数据库或启
动O n - C o m m i t触发器
启动P o s t - F o r m s - 触发器
成功
成功
自上一次邮
寄后没有变化
自上一次邮
寄后发生变化
块未处理完
块处理完了
提交
不提交
被删除的记录
没被删除
的记录
没有插入或
更新的记录
有插入或
更新的记录
这不是影响
数据库的块
这是影响
数据库的块
导航列没有
确认的表单
剩余34页未读,继续阅读
资源评论
Mmnnnbb123
- 粉丝: 697
- 资源: 8万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功