ORACLE报表触发器

http://www.cnblogs.com/quanweiru/archive/2012/09/26/2704308.html

触发器
一、报表触发器(report trigger)
报表触发器主要用于完成如设置报表格式,执行报表初始化等工作。事实上,报表

触发器实质上是显示返回TRUE或FALSE的PL/SQL函数。这些函数在运行和格式化报表时被

执行。报表触发器包括After Parameter Form、After Report、Before Parameter Form

、Before Report、Between Pages五个触发器。

测试过程:
(1):After Parameter Form触发器
说明:
该触发器在显示参数表格后触发,它用来存取、校验和修改报表中的参数值(如果出现

错误,则返回到参数表格)。该触发器不能存取数据模型中的列。

注意事项:
1.该触发器定义在报表级,如果出现错误,则返回到参数表格。

2.如果参数表格被屏蔽掉不显示,该触发器仍然被触发。

举例:
对于某个显示作者信息的报表auths_report,要求根据报表运行时用户输入的一个参

数值动态建立一个where子句,从而有条件地显示某一个作者的信息。此时,就可以通在

AfterParameterForm触发器中编写代码。在该报表中存在两个参数,一个参数是where_claus,

它是一个词法引用参数。另一个参数是p_code,它是一个联编参数。where_claus参数

用于根据报表运行时,用户输入的P_code参数值来构造where_claus参数的值。

该报表的查询语句如下:select seqno,author_code,name,salary from auths &where_clause

在After Parameter Form触发器中编写的代码如下:

function AfterPForm return boolean is
begin
--如果输入的参数为空,则查询所有作者的信息。
if :p_code is null then
:where_clause:='';
else
-将输入的p_code参数与whereauthor_code拼串构造一个where子句赋值给参数where_cla.
:where_clause:='where author_code='||upper(:p_code);
end if;
return (TRUE);
end; 
报表运行时,当用户输入参数值后,将显示某一作者的信息。

***我自己的测试如下:

第一步:建好学生信息列表报表:
该报表的查询语句如下:
SELECT ALL STUDENTS.ID, STUDENTS.NAME, STUDENTS.ADDRESS, STUDENTS.SEX
FROM STUDENTS &where_clause

第二步:在对象导航器中添加一个参数p_id,并设置属性为number类型与ID同类型。
在AFTER PARAMETER FORM触发器中编写的代码如下:
function AfterPForm return boolean is
begin
--如果输入的参数为空,则查询所有学生的信息。
if :p_id is null then
:where_clause:='';
else
--将输入的p_id参数与where id 拼串构造一个where子句赋值给参数where_clause.
:where_clause:='where id='||upper(:p_id);
end if;
return (TRUE);
end;
说明,根据p_id号可以按条件id号查询。

(2)Before Parameter Form触发器

第一步建好一个学生信息报表:
该报表的查询语句如下:
SELECT ALL STUDENTS.ID, STUDENTS.NAME, STUDENTS.ADDRESS, STUDENTS.SEX
FROM STUDENTS &where_clause

第二步:在对象导航器中添加一个参数p_id,并设置属性为number类型与ID同类型。

第三步:在AFTER PARAMETER FORM触发器中编写的代码如下:
function AfterPForm return boolean is
begin
--如果输入的参数为空,则查询所有学生的信息。
if :p_id is null then
:where_clause:='';
else
--将输入的p_id参数与where id 拼串构造一个where子句赋值给参数where_clause.
:where_clause:='where id='||upper(:p_id);
end if;
return (TRUE);
end;
说明:Before parameter Form触发器与After parameter Form触发器的主要区别在于代

码的触发时机不同。将代码放在Before parameter Form触发器中,这段代码在显示参数

表格前触发,放在After parameter Form触发器中,代码在显示参数表格后触发。他们都

用于根据用户输入的参数动态地构造一个where子句。

(3)Before Report触发器

注意:该触发器定义在报表级。

第一步建好一个定单信息报表
第二步在报表触发器里选择Before Report,单击右建选择pl/sql编辑器
function BeforeReport return boolean is
begin
if ((upper(:MODE)!='character')and (upper(:DESFORMAT)='HTML')) then
SRW.ATTR.MASK:=SRW.BEFPAGE_ESCAPE_ATTR+SRW.AFTPAGE_ESCAPE_ATTR;
--指定报表的"页之前值类型"属性为文本类型
SRW.ATTR.BEFPAGE_ESCAPE_TYPE:=SRW.TEXT_ESCAPE;
--为报表的"页之前值"属性赋值一个文本字符串
SRW.ATTR.BEFPAGE_ESCAPE_VALUE:='<html><h3>我在测试BeforeReport触发器,现在我是在WEB浏览器上浏览报表</h3>';
SRW.ATTR.AFTPAGE_ESCAPE_TYPE:=SRW.TEXT_ESCAPE;
--保留缺省的"页之后值"属性值
SRW.ATTR.AFTPAGE_ESCAPE_VALUE:='</body></html>';
SRW.SET_ATTR(SRW.REPORT_ID,SRW.ATTR);
END IF;
return (TRUE);
end;
说明:它完成的功能是,首先检测报表运行的系统参数,如果当前报表的模式不是"字符

模式"且输出格式是否为"html",则给报表的"页之前值"和"页之后值"属性赋值。

当该报表在WEB浏览器上输出时,在报表页之前将显示在BeforeReport触发器中指定的文

本字符串。

(4)After Report触发器
该触发器在输出报表(如输出到打印机)或退出报表预览后触发。

(5)Between Pages
说明:该触发器在每一报表页格式化前(第一页除外)触发,且只能在第一次进入报表页

时被触发。它可以用来对每一报表页进行格式化设置。

二、数据触发器(DATA TRIGGER)
数据触发器主要用于过滤数据、验证系统或用户自定义参数、操纵公式或占位列数

据。这类触发器包括组过滤器(Group filter)、Formula和验证(Validation)三个触发器。

(1)组过滤器
说明:组过滤器是一个pl/sql函数,该函数用于确定在报表组中要包含的记录。只有当组

的"组过滤器类型"属性设为"pl/sql"时,才能编写该触发器。该函数必须返回true或false。

如果返回true,则表示在报表中显示此记录;如果显示false,则表示不显示此记录。

注意事项:
该触发器定义在报表组上。
该触发器不能定义在交叉组(cross-prodeucr)上.

举例:测试过程:
第一步:在对象导航器中,打开"数据模型",选定组G_id,单击右建,选属性监察器。

"过滤器类型"选择:"pl/sql".然后在"pl/sql过滤器"项上单击打开组过滤器,编写代码:

如下:

某个用于显示学生信息的报表,该报表中包含的数据库列有:学生地址address,学号id,

姓名name,性别sex。假如想在报表中显示性别"女"的学生信息,则可以在组过滤器中编

写如下代码:
function G_IDGroupFilter return boolean is
begin
if :sex='女' then
return(true);
else
return (false);
end if;
end;
组过滤器在限制报表中的显示的记录数时非常有用。类似地,用户可以在报表中定义一个

计数器和一个数值型的参数,然后将用户输入的参数值与计数器中的值比较,当满足一定

条件时,在报表中显示一定数量的记录。

(2)Formula
说明:
formula是一个用于操纵公式列或占位列的PL/SQL函数,该函数必须返回值给公式列。

对于一个NUMBER类型的列,该函数只能返回NUMBER类型的值;对于DATE类型的列,只能

返回DATE类型的值;对于CHARACTER类型的列,可返回CHARACTER、VARCHAR、VARCHAR2类

型的值。

(3)验证触发器(Validation trigger)
说明:
验证触发器是定义在系统参数或用户定义参数上,用于验证参数初始值的PL/SQL函数。

当在命令行中指定参数值并在参数表格中接受此参数值时,该函数被执行。该函数必须

返回TRUE或FALSE。

注意事项:
该触发器定义在参数上。如果返回值为FALSE,则光标停留在参数表格中,用户可以

在该参数表格中输入不同参数值或退出参数表格。

举例:
在某个报表中包含了一些位图对象。为了在报表输出时,这些位图对象能够显示出来,

则可以定义验证触发器以测试系统参数MODE的值。如果报表的输出模式为字符模式(character),

则不输出报表。代码如下:
function MODEValidTrigger return boolean is
begin
--如果当前报表的输出模式为"字符"模式,则不输出报表。
if :mode='character' then
return(false);
else
return(true);
end if;
end;

三、布局触发器(Layout Trigger)
布局触发器主要用于定义按下报表中的按钮时执行的操作以及动态改变报表对象的显

示格式。这类触发器包括格式触发器(Format trigger)和动作触发器(Action trigger)两个触发器。

(1)格式触发器:
说明:格式触发器是一个返回值为true或false的 PL/SQL函数。在对报表进行格式化前,

系统会自动调用与报表对象相关的格式触发器。使用该触发器可以动态改变报表对象的显

示格式属性。

注意:格式触发器定义在布局模型编辑器中的显示的对象上。

举例如下:对定单报表的F_PRICE域定义了格式触发器
function F_PRICEFormatTrigger return boolean is
tmp number;
begin
if :price<2.00 then
--将定单表中价格每斤超过两元的降将10%
tmp:=:price*.9;
srw.set_field_num(0,tmp);
end if;
return (TRUE);
end;

(2)动作触发器(Action trigger)
说明:
动作触发器(Action trigger)是一个PL/SQL过程,在报表运行过程中,当用户按下报

表中的一个按钮时,执行该过程。该触发器可以用来动态地调用另一个报表或执行其它的

PL/SQL程序块。

注意事项:
该触发器定义在按钮上。在动态预览器中单击按钮时,该触发器不能被触发,只

有在运行态预览器(RUNTIME PREVIEWER)中单击按钮才能触发此触发器。

不能用PL/SQL解译器调试动作触发器。要调试该触发器,可以将其代码放入报表

触发器中测试。

原文地址:https://www.cnblogs.com/xiaoL/p/3480752.html