本文轉自:http://blog.csdn.net/deepsea_allen/article/details/53900284
第三章 創建一個分組報表
1. 建立數據模型
數據模型用於定義一個報表中使用的數據及數據結構,這些數據可以是數據庫表中的原始數據,也可以是經過加工后的數據,如工資的總和等。從數據庫中檢索出的數據是否在報表輸出中顯示,也是在數據模型中定義的。
數據模型由五部分對象組成:查詢(Queries)、組(Groups)、列(Columns)、連接(Links)和參數(Parameter)。
1) 建立查詢
查詢實際上就是一條SQL SELECT語句,決定了從數據庫中指定的表或視圖中取哪些行和列。查詢所取得的數據可被用於計算、排序、集合運算等,並可以在報表輸出時顯示。
Ø 報表中的查詢可分為兩種:內部查詢和外部查詢。兩者的區別在於外部查詢可以被其他報表多次引用,而內部查詢不能被其他報表參考引用,只能被其所屬的報表引用。
Ø 根據報表中查詢的個數可以將報表分為單查詢報表和多查詢報表。
單查詢報表:只有一個查詢的報表稱為單查詢報表。單查詢報表的常見格式有列表式(Tabular)、標簽式(Mailing Label)、信封式(Form Letter)以及分組式。單查詢報表雖然只有一個查詢,但可以多次顯示查詢數據,並且可以用不同的格式顯示。
多查詢報表:含有多個查詢的報表稱為多查詢報表。多個查詢相互之單可以有關聯,稱為相關的多查詢報表;也可以沒有關聯,稱為不相關的多查詢報表。
l 相關的多查詢報表:多個查詢之間相互關聯,一般用於主從式報表,也就是說,報表的一部分數據決定了報表的另一部分數據。取出前一部分數據的查詢稱為主查詢,取出后一部分的查詢稱為從查詢,主查詢的每一條記錄查詢都將引起從查詢的執行,從查詢只檢索與主查詢匹配的那些記錄。兩個查詢之間通過定義數據連接產生聯系。
l 不相關的多查詢報表:多個查詢之間沒有關聯,Oracle Reports將獨立地為每一個查詢獲取數據,顯示出來的是一系列不相關的數據。
查詢之間運行的先后次序由數據模型中的查詢次序決定。在數據模型中,查詢次序是先上后下,先左后右,所以放在左上角的查詢最先執行。
示例:為避免數據冗余,我們這里將訂單頭和行分別建立兩個查詢:
a) 在對象管理器中選中報表,右擊打開“報表編輯器”,然后點擊打開“數據模型”。
b) 點擊SQL查詢創建兩個查詢。
c) 修改Q1->Q_header,G_order_number->G_header;
Q2->Q_line,G_line_num->G_line
2) 建立數據連接
數據連接用於建立兩個查詢數據之間的關系。在數據模型編輯器中,兩個查詢之間的連線即表示了一個數據連接。
工作原理:數據連接通過主鍵和外部鍵定義了兩個查詢之間的主/從關系。主/從關系中父查詢的每一條記錄的產生都會引起子查詢的執行,子查詢只檢索滿足在連接中指定的條件的記錄。
通常情況下,兩個查詢之間的連接是等值連接,但也可以采用SQL語句(如WHERE、HAVING、START WITH等)建立非等值連接。
當一個帶有數據連接的報表執行時,該數據連接就被轉換成一個SQL子句,並添加到子查詢的后面。子查詢根據父查詢的主鏈值執行查詢。
建立方法:一種是手動建立的數據連接,一種是自動建立的數據連接。
手動連接的步驟:在數據模型編輯器中選擇:“數據連接”小圖標;
單擊父查詢的主鏈列或外部鍵列,並拖動鼠標到子查詢的主鏈或外部鍵列,使它們之間建立一條連線。注意,連線總是從父查詢到子查詢的;
自動連接的步驟:在數據模型編輯器中選擇:“數據連接”小圖標;
單擊父查詢,並拖動鼠標到子查詢上,系統會自動顯示父查詢和子查詢之間是依據哪個列建立連接的;
示例:點擊數據連接,創建從Q_header (header_id)到Q_line(header_id1)的數據連接。
3) 建立組
組對象主要有兩個功能:
Ø 將一個查詢的數據分成幾個集合,每個集合稱為組。例如,將“EMP”表按“DEPTNO”分組,結果顯示如下:
Ø 過濾查詢數據,通過組可以對查詢的結果進行過濾。
在Oracle Reports中將組分為缺省組和用戶定義組兩類:
Ø 在缺省的情況下,Oracle Reports為數據模型中的每一個查詢產生一個組,取名取成查詢的名稱。查詢名稱以“Q_”開頭,而組名以“G_”開頭。例如,查詢名稱為“Q_header”,則Oracle Reports為其產生的缺省組名為“Q_header”。
Ø 用戶定義組可用於以下三種情況:分組報表;矩陣報表;子匯總。
組過濾器允許有條件的選擇由查詢檢索出來的數據,通過組過濾器過濾查詢結果。
有兩種類型的組過濾器:Oracle Reports封裝過濾器和用戶定義過濾器。
Ø Oracle Reports封裝過濾器允許指定在一個組中希望檢索的記錄數,在報表開發過程中可以使用封裝過濾器來限制數據。Oracle Reports軟件包中有兩個封裝過濾器:First Filter,只顯示組內前n條記錄;Last Filter,只顯示組內后n條記錄。
Ø 用戶定義過濾器:用戶可以定義自己的過濾器來限制在特定條件下的記錄的檢索。用戶定義的過濾器是通過編寫PL/SQL代碼建立的。
數據模型中組的層次決定了在缺省布局對話框中組的次序,同時也決定了在缺省布局中組的次序,但這不是最終的報表格式,因為可以對缺省的顯示格式進行修改。
在數據模型編輯器中若沒有數據連接,則組的層次是由組在數據模型編輯器中的位置從左至右,從上至下決定的。在數據模型編輯器中若有數據連接,則組的層次可以由數據連接描述。通過對象導航器可以清晰地看到組的層次:
4) 定義列
報表的列表示報表的數據。在定義了從數據庫檢索數據的查詢后,可能需要進一步調整報表,增加更多的列,而這些列可以用作報表的數據,執行總計匯總等功能。
Oracle Reports中的列可以分為兩類,缺省列和用戶定義列。
Ø 缺省列
Oracle Reports為查詢SELECT語句中的每一項都建立一個列,因為它們直接對應從數據庫中檢索出來的各個列,所以缺省列也叫數據庫列。
Oracle Reports除了支持典型的數據類型的列(如字符型、數值型、日期型)以外,還支持圖型列。圖型列的值可能是:
直接存儲在數據庫中的圖型:這種列的數據類型通常是RAW或LONG RAW。在這種情況下,需在列的屬性選項板中指明圖形格式。
文件名或者是圖型的URL:這種列的數據類型通常是REF,列中的值對應於用指針指向一個存在操作系統中的文件,報表輸出時會根據指針將文件內容輸出,在這種情況下,需在列的屬性選項板中將“Read from File”設置為“Yes”並輸入文件名。文件名前可以帶有路徑,若文件名前沒有帶有路徑,則Oracle Reports會按照其路徑搜索順序查找文件。可以通過Report Builder的環境變量REPORT30_PATH來設置搜索路徑。注意,若列的屬性選項板中“Read from File”被置為“No”並且輸入了文件名,則報表最后輸出的只會是文件名,而不會是文件內容。
Oracle Reports支持多種圖形格式,包括BMP、CALS、CGM、GIF、JFIF、PCD、PCX、PICT、RAS、TIFF等。
Ø 用戶定義列
用戶可在特定的組內或報表一級建立列。在特定的組內建立的列稱為組一級的列,該列與組內的其他列有相同的顯示頻度。而報表一級的列只在整個報表中顯示一次。用戶定義列分為三種類型:公式列、占位列和匯總列。
a) 公式列,公式列是對其他列執行一個用戶定義的計算。建立公式列的方法是用PL/SQL語句寫一個函數,從一個或多個列中計算結果,該列的缺省名為“CF_n”。
示例:在G_line組中定義一個的公式列newAmount,來顯示Amount *1.06的值。
在數據模型編輯器中單擊:“公式列”小圖標。如果要在組中建一個公式列,則在畫布的組區域內單擊一下鼠標左鍵,如果要建一個報表一級的公式列,則在畫布的空白區域內單擊一下鼠標左鍵,會生成一個公式列對象;
雙擊該公式列對象,彈出其屬性選項板;
點擊屬性選項板中的“PL/SQL公式”項,彈出“程序單元編輯器”;
在“程序單元編輯器”中為公式項用PL/SQL語句書寫一個計算公式並編譯通過。
b) 占位列,占位列的值和數據類型是通過PL/SQL語句設置的,該列的缺省名為“CP_n”。當需要有選擇地設置一個列的值時(例如,在每次出現第n個記錄時,或每次出現包含有特殊值的記錄時)占位列非常有用。
可以在以下幾個地方設置占位列的值:
在Before Reports的報表觸發器中(如果占位列是一個報表級的列);
在報表級的公式列中(如果占位列是一個報表級的列);
在占位列組或占位列組下面的公式中(為組中的每一條記錄設一次值)。
占位列的用途:
在公式列的PL/SQL代碼中計算出的一些值可以分配給不同的占位列;
利用占位列保存中間值。例如,存儲當前檢索出的最高工資對應的記錄。
c) 匯總列,匯總列是對其他列的數據執行計算。Oracle Reports為匯總列提供的計算函數有:總和、平均值、最小值、最大值、計數、第一個、最后一個、%(總計)、標准差、方差。
示例:在G_header組中添加CS_countAmount,來計算訂單行的總金額;
在Report級別添加CS_total,來計算訂單的總數量;
在數據模型編輯器中單擊“匯總列”小圖標,如果要在組中建立一個匯總列,則在組中你希望該列所在的位置上單擊一下鼠標左鍵,如果要建一個報表一級的匯總列,則在畫布的空白區域內單擊一下鼠標左鍵,會生成一個匯總列;
雙擊該匯總列對象,彈出其屬性選項板;
從屬性選項板中的“匯總”項下的“功能”子項的下拉列表中選擇所需的計算公式;在“源”子項中選擇要匯總的列名;
在“重設於”子項中選擇匯總的頻度,即是就整個報表做一次匯總還是每一頁做一次匯總,或者每一組做一次匯總;
當“功能”子項被選為“%(總計)”時,“計算於”項有用,其值為計算“%(總計)”的匯總列時的組名。該項只對“%(總計)”有用。
5) 參數
參數是報表變量,在報表運行過程中,用戶可以為其指定不同的值。參數主要用於在運行過程中修改SELECT語句和設置PL/SQL變量。Oracle Reports中的參數分為兩類:系統參數和用戶參數。
Ø 系統參數
系統參數又稱缺省參數。Oracle Reports允許為每一個報表修改標准的運行設置,系統參數共有7個。
系統參數 |
功能 |
取值 |
省缺值 |
COPIES |
報表輸出到打印機的份數 |
任何整數 |
1 |
DESFORMAT |
輸出設備的格式,如:打印機 |
Dflt、Pslan80 |
Dflt |
DESNAME |
輸出設備的名字,如:文件名、打印機名 |
|
|
DESTYPE |
輸出結果送到什么地方,如屏幕、文件、郵件、打印機等 |
File、Mail、Screen、Printer |
Screen |
MODE |
報表運行的模式,如:字符界面、圖形界面等 |
Bitmap、Character |
Default |
ORIENTATION |
打印報表輸出時的打印方向,如:Landscape、Portrait |
Landscape、Portrait |
Landscape、Portrait |
PRINTJOB |
當運行一個報表時是否顯示“PRINT JOB”對話框 |
YES、NO |
YES |
Ø 用戶參數
用戶參數是用戶建立的一個對象,該對象用於保存在運行時用戶可以改變的值。在一個查詢的任何地方都可以引用用戶的參數,用戶參數主要用於以下幾個方面:
l 在SELECT語名的WHERE子句中用參數替代常數作限制值。
l 用參數替代SELECT語句的任何部分,包括選擇列、表,甚至整個SELECT語句。
l 在SELECT列表中用參數替換一個單列或一個表達式。
引用參數的方法主要有兩種:連接引用和置換引用。
a) 連接引用
連接引用主要用於替換SQL語句和PL/SQL塊中的一個值或表達式。
使用連接引用的方法是在要引用的參數前加上“:”號。
連接引用的使用受以下限制:不能在SELECT語句中替換列名;不能在FROM從句中使用連接引用;不能替代保留的單詞和子句。
示例:將查詢Q_header的where條件中寫死的條件:
oh.order_numberbetween 29480and29485
修改為:oh.order_numberbetween:p_order_fromand:p_order_to
保存修改后,Oracle Report會自動加入這兩個用戶參數。
b) 置換引用
置換引用可以用參數替代SELECT語句的任何部分,如替換列名、FROM子句、WHERE子句、GROUP BY子句、ORDER BY子句、HAVING子句、CONNECT BY子句、START WITH子句等。
使用置換引用的方法是在要引用的參數前加上“&”符號。
注意:不能在PL/SQL中使用置換引用,但可以在PL/SQL中使用連接引用。
和連接引用不同的是,對於置換引用的參數,用戶必須事先在對象導航器中建立,並且在屬性選項板中為其輸入初始化值,Oracle Reports不會缺省地建立該參數。
舉例:使用置換引用替代列名和FROM子句。
SELECT &P_ENAME NAME, &P_EMPNO ENO
FROM &P_EMP;
這樣可以動態地根據運行時輸入的參數值,決定從哪個表檢索那些列。
使用置換引用替換WHERE子句
SELECT * FROM EMP &P_WHERE;
在運行時可任意指定WHERE子句,根據不同的限制條件檢索所需數據。
值列表,為參數值建立值列表,這樣,在運行時用戶就可以從該值列表中選擇一個有效值。可以限制用戶只能選擇值列表中的值,也可以允許用戶輸入其他的值。
對於連接引用的參數,值列表可以是一個不能修改的靜態的值列表,也可以是在運行時從數據庫中動態地選擇值的動態值列表。
對於置換引用的參數,值列表只能是靜態的。
2. 設計布局
布局的功能是定義報表的格式,包括數據文本及圖形的位置和顯示格式。
在布局模型編輯器中將報表布局分為三個區域:表頭區域、表尾區域和主體區域,每個區域又分為主體和頁邊距。
Ø 表頭區域 在報表每一頁的開頭顯示一次,表頭區域可以包含文本、圖形、數據及其運算。
Ø 表尾區域 在報表每一頁的結尾處顯示一次,表尾區域可以包含文本、圖形、數據及運算。
Ø 主體區域 出現在表頭和表尾之間,是報表的主要部分。當第一次進入一個新報表的布局模型編輯窗口時,所處的位置就對應着報表的主體區域。主體區域包含報表的主要文本、圖形、數據及其運算。
基本布局對象:
在布局模型編輯器中,是通過定義和修改布局對象來實現的,Oracle Reports中的基本布局對象有框架(Frames)、重復框架(Repeating Frames)、域(Fields)、圖文(Boilerplate)、定位(Anchors)、按鈕(Buttons)、OLE2對象、Oracle Graphics對象。
1) 框架
框架用來圍繞其它布局對象。一個框架可以包含任何布局對象,包括其它的框架。框架的打印次數與它所圍繞的對象的打印次數一樣,框架與記錄無關。
框架的主要用途:
l 把對象組織在一起,以保證在打印時它們之間的相對位置;
l 避免覆蓋其他對象和被其他對象覆蓋;
l 將報表划分為幾個部分。例如,在每一頁的頂部采用列表式的報表格式,而在底部采用鉅陣式的報表格式;
l 確保一些對象總是在相同的頁中。
框架分為兩種類型:缺省框架和用戶定義框架。
缺省框架,當接受缺省的布局模型時,Oracle Reports會自動生成包含對象的框架。缺省框架的命名形式為“M_n”。缺省框架又可分為兩種:垂直可變的組框架和固定尺寸的框架。例如,當創建最初缺省的布局模型時,Oracle Reports產生一個圍繞整個布局模型的組框架,這個組框架在垂直方向上是可伸縮的。而固定尺寸的框架通常是圍繞圖文對象(Boilerplate)建立的,例如列的標題。
用戶定義框架,用戶定義的框架是在布局模型編輯器中通過“框架”工具建立的。
框架的重要屬性:
l 在這之前分頁(Page Break Before):指示在打印該對象前進行換頁。
l 在這之后分頁(Page Break After):指示在打印完該對象后進行換頁,在其后面的對象都將移到下一頁打印。
l 頁保護(Page Protect):指示對象內的所有對象盡可能地打印在一個頁內,如果一個頁容納不下的話,在開始打印該對象時會先換頁。
l 垂直縮放值(Vertical Elasticity):指示對象的垂直大小是否可以改變,有:收縮、擴展、固定、可變。
l 水平縮放值(Horizontal Elasticity):指示對象的水平大小是否可以改變,有:收縮、擴展、固定、可變。
l 打印對象在(Print Object On):指示對象在報表的打印頻率,有:全部頁、除首頁外的全部、除尾頁外的全部、缺省、第一頁、最后一頁。
l 基於以下環境打印(Base Print On):指示對象是以定位對象還是以包含對象為基准進行打印。
l 跟隨定位對象(Keep With Anthoring Object):指示對象是否跟隨定位對象打印在同一個邏輯頁中。
2) 重復框架
重復框架主要用於顯示由一個組檢索出來的多行數據的對象。一個重復框架可以包含任何布局對象,也可以包括其它的重復框架。重復框架是與記錄相關的,它為一個組的每一條記錄及其所關聯的數據模型對象都打印一次。使用重復框架可以控制記錄層的顯示和格式,比如:記錄的打印方向、記錄的空隙、邊框線、顏色、字體等。重復框架的箭頭方向指明了重復框架重復的方向。
嵌套的重復框架常常用於建立主/從表和分組表。
重復框架分為兩種類型,缺省的重復框架和用戶定義的重復框架。
缺省的重復框架,當接受缺省的布局模型時,Oracle Reports會自動地為數據模型中的每一個組生成一個重復框架,並且為組中的每一列都對應安排一個域,放在重復框架內。
用戶定義的重復框架,用戶定義的重復框架是在布局模型編輯器中通過“重復框架”工具建立的。
重復框架的幾個重要屬性:
l 源(Source):每一個重復框架必須有一個源(組)作為其數據來源,在重復框架中每一條源數據顯示一次;
l 打印方向(Print Drection):重復框架中記錄的打印方向,有:橫向、縱向、橫向/縱向、縱向/橫向;
l 每頁的最大記錄數(Maximum Record per Page):在邏輯頁上顯示的重復框架記錄的最大數目,可以通過該屬性改善報表的可看性。例如,希望在每個邏輯頁上只顯示三條記錄,則將該屬性設置為3。該屬性的取值可以為正整數和空,若為空,則盡可能在一個邏輯頁上顯示最大數目的記錄。
l 最小孤立記錄數(Minimum Widow Records):必須在一張邏輯頁上顯示的最少記錄數。若從邏輯頁的指定位置開始放不下此屬性中給出的記錄數,則將從下一張邏輯頁開始顯示。。例如下圖,有兩個獨立的重復框架按縱向打印,第二個重復框架位於第一頁的底部,但第一頁上僅有打印兩條記錄的空間了,為了使報表看起來更美觀,我們希望第二個重復框架換記錄能從第二頁開始打印,這時就需要將“最小孤立記錄數”設置為3。
l 列模式(Column Mode):用於控制如何為重復框架中的記錄提取數據和格式化數據。這個屬性有兩個選項:“是”和“否”。若選“是”,則允許在上一個重復框架的記錄沒有打完之前就打印下一個重復框架的記錄。例如,若設置“列模式”為是,則雖然記錄2直到第二頁才打完,但記錄3卻可以開始在第一頁上打印了。若設置:“列模式”為“否”,則記錄3只能等到記錄2打印完后,才開始在第二頁上打印。
l 水平框架間隔:重復框架記錄間的水平間隔。當打印方向為“縱向”或“縱向/橫向”時,該屬性的設置無效。
l 垂直框架間隔:重復框架記錄間的垂直距離。當打印方向為“橫向”或“橫向/縱向”時,該屬性的設置無效。
3) 域
域是用來放置參數、列、頁號、當前日期等值的地方。例如一個參數或列沒有對應的域,那么它的值不會在報表輸出時顯示。當生成一個缺省布局模型時,Oracle Reports會自動地為每一個列建立一個域,並將這些域排放在重復框架中。
域有兩種類型:缺省域和用戶定義域。
缺省域,當接愛缺省的布局模型時,Oracle Reports會自動地為每一列產生一個域,並將這些域排放在重復框架中。每一個域的屬性都是缺省生成的,但是可以修改。
用戶定義域,用戶可以根據需要定義一些域來顯示諸如頁號、日期等信息。
用戶定義的域是在布局模型編輯器中通過“域”工具建立的。
域的數據來源有三種:數據模型的中的一個列或參數、系統變量和系統參數。
系統變量包括:當前日期(¤t date)、頁碼(&logical page number)、面板數值(&panel number)、物理頁碼(&physucal page number)、總記頁(&total logical pages)、總記面版(&total panel)、總計物理頁(&total physical pages)
域的屬性:
l 源(Source):域值的來源。
l 源數據來源(Source Data Type):源的數據類型,此屬性為只讀。
l 可視的(Visible):若設置為“否”,則表示該域不被格式化。這一屬性公用於那些在圖文對象中引用的域,通常用於格式信件式報表。若想引用一個“可視的”屬性設置為“否”的域,可以在圖文對象中輸入“&fieldname”。
l 格式掩碼(Format Mask):定義以何種格式顯示在域中的日期和數值。有值列表可供選擇,但是字符型的域沒有該屬性。
l 編頁碼(Page Numbering):當域的源列是頁碼、物理頁碼、總記頁、總記物理頁之一時,可以使用該屬性來定義如何計算頁號。點擊:編頁碼按鈕,出現“編頁碼”對話框。
4) 圖文
圖文是一個查詢獲取不到但又要在報表中輸出的對象,如文本、線條、圖形等。可以使用圖文對象來改變報表的外觀,例如建立報表的頁頭、增加圖形等。
圖文有兩種類型:缺省的圖文和用戶定義的圖文。
缺省的圖文,當接受缺省的布局模型時,Oracle Reports會自動地為每個域生成一個列標題。對於某些報表類型,Oracle Reports會在列標題下加一條下划線。
用戶定義的圖文,一種是通過圖文工具新建的一個圖文,一種是從外部文件輸入的圖文。
從外部文件輸入圖文,可以用“導入”工具或者使用“鏈接文件”工具來鏈接一個文件。
鏈接一個文件,只是建立了一個指針,指向要連接的文件,並不將文件的內容輸入到圖文對象中,所以在每一次運行報表時,都動態地將文件內容輸入到圖文對象中,因此,圖文對象中的內容是動態的,會隨着文件內容的改變而改變,采用這種方式,能保證報表的輸出總是反映最新的內容,這種方式是在布局模型編輯中通過“鏈接文件”工具建立的。
5) 定位
定位是用於確定報表輸出時子對象相對於其父對象的水平和垂直位置。由於在運行報表時,有些布局尺寸會發生變化,所以需要用定位來定義一個對象相對於另一個對象的位置。
例如,對於一個水平方向大小可變的重復框架,希望它里面的一個域總是位於重復框架水平方向的中間位置,同時又希望該域與重復框架的頂部保持固定距離,由於重復框架是水平方向大小可變的,因此其將來實際輸出時的水平尺寸是不可預知的,所以需要定義一個定位來實現以上目的,如下圖所示。
用定位連接的兩個對象之間的相對位置關系是基於數據取出數據之后的對象的實際尺寸,而不是對象在布局模型編輯器中的尺寸。布局模型編輯器中對象間相對位置實際上反映了報表輸出對象的位置。
定位分為兩種類型:隱式定位和顯示定位。
隱式定位,Oracle Reports會自動地為每個沒有顯示定位的布局對象生成一個隱式定位,以防止該對象被其他對象覆蓋。隱式定位節約了用於定義每個對象的位置的時間。
在對象導航器中,若采用“對象類型視圖”,則看不到隱式定位,但可以看到顯示定位。若采用“所有權視圖”,則缺省情況下看不到定位的,要想看到定位,須打開“工具”菜單中的“選項”->“導航器”,彈出“對象導航器選擇”對話框,在“布局”欄中選中“定位信息”,則會在導航器中顯示所有的定位信息,包括隱式定位和顯示定位。
但隱式定位在布局模型編輯器中總是不可見的。
顯示定位,顯示定位是在布局模型編輯器中通過“定位”工具建立的,通過顯示定位可以強制性地將某些對象放在一起。當一個對象在水平或垂直的大小可能會隨着許多記錄的增減而改變時,或者在決定一個對象相對於重復框架的相對位置時,顯示定位尤其有用。
3. 設計報表布局的注意事項
1) 設計布局前的參數設置
點擊菜單“工具”->“選項”->“標尺”
2) 在數據模型和布局模型的編輯頁面中的,可以點擊菜單“視圖”來選擇是否顯示標尺,網格等輔助設計的面板,尤其是“工具面板”一定要選擇顯示。
3) 最外層固定框的屬性“打印對象在”必須設置為“第一頁”。
4) 表頭的“打印對象在”必須設置為“全部頁”。
5) 要實現自動分頁,必須將最外層的固定框或循環框“打印對象在”設置為“第一頁”。
6) 可以在循環框外面加一個固定框,並將固定框的屬性更改為“可變”,固定框的輸出會緊接着循環框的位置。
4. 參數表格
當運行一個報表時,Oracle Reports會彈出一個窗口,稱為參數表。可以在此窗口中輸入參數值,從而屏蔽原有的缺省值。
如果沒有建立報表參數表格,在運行時,Oracle Reports將會自動建立一個參數表格以供用戶輸入參數,但當報表運行完后,這個參數表格的內容就會自動地被刪除。
Oracle Reports提供缺省的參數表格樣式,可以采用缺省的參數表格,也可以在缺省參數表格的基礎上進行修改,或者建立用戶自已定義的參數表格。
建立缺省的參數表格:
點擊菜單“工具”->“參數表單創建器”
修改“標題”、“提示行”和“狀態行”的內容,它們將顯示在運行參數表的頂端;
根據需要選中要在運行參數表中出現的參數,被選中參數的背景色為黑色,如上圖中,參數“P_ORDER_FROM”被選中,則該參數將會出現在運行參數表中,用戶可以為它輸入新值,而不使用其缺省值。注意,這里未被選中的參數不會出現在缺省的參數表格中。
建立用戶自定義的參數表格:
雙擊對象導航器中的“頁面參數表單”
在這里,只能建立兩種對象:域對象和圖文對象。
Ø 域對象:域對象是用來放置參數值的地方。如果某一參數沒有定義與其相應的域對象,則在運行參數表上不會顯示該參數。缺省情況下,Oracle Reports會為每一個參數建立一個域對象。也可以通過使用“報表編輯器-參數表格”中的“域”工具建立一個域,然后將一個已有的系統參數或用戶定義參數分配到該域。
Ø 圖文對象:圖文對象的作用和在布局模型中的作用一樣。缺省情況下,Oracle Reports會生成運行參數表的“標題”、“提示行”和“狀態行”圖文對象,並為每個域建立一個標簽圖文對象。也可以通過使用“報表編輯器-參數表格”中的“圖文”工具建立額外的圖文對象以增強運行參數表的可觀性。
5. Oracle Reports觸發器
在Oracle Reports中,觸發器可分為三類:
Ø 報表觸發器:共有5個報表觸發器,分別在運行報表的不同階段被觸發。
Ø 數據模型觸發器:包括公式列觸發器、組過濾觸發器、參數驗證觸發器。其中,公式列觸發器在每次處理列時被觸發,組過濾觸發器可以由組中的每一條記錄觸發,參數驗證觸發器在顯示參數表格和用戶離開參數域時被觸發。
Ø 布局格式觸發器:在處理布局對象時觸發。
1) 報表觸發器,是用戶在運行報表和設置報表格式時,在指定時刻執行的PL/SQL函數。這些報表觸發器允許用戶執行以下操作:調整報表格式、執行初始化任務、訪問數據庫。
系統定義了五個報表觸發器,用戶可以修改觸發器的內容,但不能創建新的報表觸發器。
Before Parameter Form
在顯示運行參數表之前被觸發,即使參數表被隱藏起來不顯示,此觸發器仍然可以被觸發。它用於存取並修改參數值、PL/SQL全局變量和報表組列值。通常利用此觸發器來檢驗命令行參數。
After Parameter Form
在顯示運行參數表之后觸發,即使參數表被隱藏起來不顯示,此觸發器仍然可以被觸發。該觸發器用於存取、校驗和修改參數值。如果在運行中出現錯誤,則返回到運行參數表。該觸發器不能存取數據模型中的列。
Before Reoprt
該觸發器在分析查詢語法和檢索數據之后、運行報表之前被觸發,用於執行初始化處理各種參數。
Between Pages
除去第一頁以外,該觸發器在每一頁報表被格式化之前被觸發,用於頁的格式化設置。在預覽器中,此觸發器只在第一次進入該頁時被觸發,如果后續再進入該頁,則此觸發器不再被觸發。
After Report
該觸發器在退出預覽器后或將報表輸出到目的地(如:文件、打印機或Oracle*Mail用戶標識)以后初觸發,用於清除對參數的初始化處理,如刪除臨時表。無論報表是否成功執行,此觸發器一直是處於激活狀態。
2) 數據模型觸發器
公式列觸發器,是指在公式列中編寫一個PL/SQL函數,該列又可以構造其他對象,如占位列或公式列本身。
公式列中的代碼必須返回給公式列,此列可以是一個“虛”列,既在報表的布局模型中不被顯示出來。
例:
目的:希望當員工工資大於3000時,獎金顯示的是工資乘以0.1,否則獎金顯示出的是工資乘以0.5,並給出提示。
實現方法:使用公式列構成兩個占位列“BONUS”和“BONUS_CHAR”,根據不同條件給這兩個列賦值。
- FUNCTION SET_BONUS RETURN CHAR IS
- BEGIN
- IF :SAL > 3000 THEN
- :BONUS := :SAL * 0.1;
- :BONUS_CHAR := 'ten percent';
- ELSE
- :BONUS := :SAL * 0.1;
- :BONUS_CHAR := 'ten percent';
- END IF;
- RETURN '';
- END;
FUNCTION SET_BONUS RETURN CHAR IS BEGIN IF :SAL > 3000 THEN :BONUS := :SAL * 0.1; :BONUS_CHAR := 'ten percent'; ELSE :BONUS := :SAL * 0.1; :BONUS_CHAR := 'ten percent'; END IF; RETURN ''; END;
由於該公式列是一個虛列,因此函數返回一個空字符串。
組過濾器,組過濾器用於限制出現在報表中的記錄的行數。組過濾器對數據的限制是在檢索數據之后,在顯示數據之前,所有使用組過濾器並不能減少由查詢語句檢索出來的數據總量,若想減少由查詢語句檢索出來的數據,可以在查詢語句中使用WHERE子句進行限制。
Oracle Reports提供了兩個組過濾器:前幾個(First)和后幾個(Last)。用戶還可以編寫自己的組過濾器。
組過濾器只能由兩個返回值:
Ø TRUE:表示提取組中指定的數據。
Ø FALSE:表示不提取組中指定的數據。
另外,組過濾器不能用於交叉分組。
驗證觸發器,用戶可以在系統參數和用戶自定義的參數中編寫驗證觸發器,用於檢測輸入到運行參數表中的參數值,如果參數不正確,則停止報表運行。
驗證觸發器必須返回一個布爾值(TRUE或FALSE)。若返回為FALSE,則光標會停留在參數中,用戶可以輸入不同的值或則退出報表的運行。
示例:驗證用戶輸入的訂單號范圍是否合理
- FUNCTION P_ORDER_TOValidTrigger return boolean IS
- BEGIN
- IF :P_ORDER_TO < :P_ORDER_FROM THEN
- RETURN (FALSE);
- ELSE
- RETURN (TRUE);
- END IF;
- END;
FUNCTION P_ORDER_TOValidTrigger return boolean IS BEGIN IF :P_ORDER_TO < :P_ORDER_FROM THEN RETURN (FALSE); ELSE RETURN (TRUE); END IF; END;
3) 布局格式觸發器
大多數的布局對象都含有一個布局格式觸發器,它是布局對象的一個公共屬性。布局格式觸發器存在於以下對象中:框架、重復框、域和圖文對象。
布局格式觸發器允許用戶在報表運行時根據一定條件動態地修改布局對象的顯示或隱藏。
4) 動作觸發器
動作觸發器是在預覽器中選中一個按鈕時執行的PL/SQL過程。該觸發器可以動態地調用另一個報表或執行PL/SQL程序。在動作觸發器中輸入的PL/SQL過程,可參考Oracle Reports中的封裝函數、過程和異常處理。
6. Oracle Reports中的PL/SQL
用戶可以將PL/SQL用於Oracle Reports對象中以增加報表功能。
1) 在PL/SQL中引用報表對象
在PL/SQL中引用報表對象有兩種方法:
變量值引用,通過在Oracle Reports對象前加一個“:”號來引用Oracle Reports對象值。
例如,要使ORDER_NUM列的值為1000,則輸入:ORDER_NUM:= 1000
變量名引用,通過用單引號括起Oracle Reports對象來引用對象的名稱。
例如,要使變量FIELDNAME等於F_NAME域的名稱,FIELDNAME := ‘F_NAME’
2) Oracle Reports中的PL/SQL塊
Oracle Reports中能使用以下9種方法的PL/SQL結構塊:
PL/SQL程序庫(external libraries)、附件的程序庫(attached libraries)
程序單元(report program units)、報表觸發器(report triggers)
組過濾器(group filters)、公式(formula)、驗證觸發器(validation triggers)
格式觸發器(format triggers)、動作觸發器(action triggers)
PL/SQL:PL/SQL程序庫、程序單元;
Trigger&Filters:重復框、框架、域、圖文、參數、組、報表觸發器;
Formula:公式列;
Button Triggers:按鈕;
3) Oracle Reports中的PL/SQL異常處理
通常有三種類型的異常處理:
Ø 用戶定義的異常處理,具體方法參考PL/SQL技術文檔。
Ø 標准封裝的異常處理,是Oracle系統預先定義的例外,同參考PL/SQL技術文檔。
Ø Oracle Reports特有封裝的異常處理,Oracle Reports特有的例外定義在SRW包中,具體有:
SRW.CONTEXT_FAILURE SRW.RUN_REPORT_FAILURE
SRW.DO_SQL_FAILURESRW.RUN_REPORT_BATCHNO
SRW.INTEGER_ERROR SRW.TRUNCATED_VALUE
SRW.MAXROW_INERRSRW.UNKNOW_QUERY
SRW.MAXROW_UNSETSRW.UNKNOW_USER_EXIT
SRW.NULL_ARGUMENTS SRW.USER_EXIT_FAILURE
SRW.PROGRAM_ABORT
異常處理的使用規則:
Ø 如果用戶沒有處理一個異常,那么Oracle Reports會替用戶去處理它,既在異常處理被激活時,Oracle Reports將產生一個錯誤,終止報表的執行。
Ø 用戶必須在當前PL/SQL域中測試結構塊的失敗情況。
例如,如果用戶給公式列編寫了PL/SQL代碼,那么該公式列必須測試它自己的失敗情況,其他對象甚至另一個公式列是不能對它的失敗進行測試。
4) SRW包
為了方便用戶使用,Oracle Reports提供了一個封裝的包,稱為SRW。它是一組PL/SQL結構塊的集合,包含了許多可在庫和報表中引用的函數、過程和異常處理。用戶可以在庫或報表中參考引用它們。
當用戶在PL/SQL結構塊中參考SWR包時,必須加上前綴SRW,例如SRW.DO_SQL。
SRW包的用途有:控制報表的運行、在運行時輸出信息、初始化域對象、執行DDL語句(建立/刪除臨時表)、調用用戶接口、動態地設置布局對象屬性、如字體和填充模式等。
可以在報表中的任何PL/SQL語句中引用SRW包的任何部分,但是,SRW包中的內容只能在Oracle Reports中被引用,不能在其他工具(如Oracle Forms)中被引用。
SRW包由下列結構塊組成:
SRW.BREAK SRW.CONTEXT_FAILURE
SRW.DO_SQL SRW.DO_SQL_FAILURE
SRW.GETERR_RUN SRW.GET_PAGE_NUM
SRW.INTEGER_ERROR SRW.MAXROW_INERR
SRW.MAXROW_UNSETSRW.MESSAGE
SRW. NULL_ARGUMENTS SRW.PROGRAM_ABORT
SRW.REFERENCE SRW.RUN_REPORT
SRW.SET_ATTR SRW.RUN_REPORT_FAILURE
SRW.RUN_REPORT_BATCHNO SRW.SET_FIELD_CHAR
SRW.SET_FIELD_DATE SRW.SET_FIELD_NUM
SRW.SET_MAXROW SRW.TRACE_ADD_OPTION
SRW.TRACE_END SRW.TRACE_REM_OPTION
SRW.TRACE_START SRW.TRUNCATED_VALUE
SRW.UNKNOWN_QUERY SRW.UNKNOWN_USER_EXIT
SRW.USER_EXIT SRW.USER_EXIT20
SRW.USER_EXIT_FAILURE
7. 程序單元和附加的程序庫
1) 程序單元(Program Units)
程序單元是指從當前報表中的任何PL/SQL庫中參考引用的包、函數和過程。程序單元不能被其他程序參考。若想創建一個能被多個程序參考引用的包、函數或過程,需要創建一個PL/SQL程序庫。
2) 附加的程序庫(Attached Libraries)
對於一些比較通用的函數和過程,或者邏輯比較復雜的函數和過程,我們可以把它們集合在一起寫成一個PL/SQL程序庫。一個PL/SQL程序庫就是一個PLL庫文件。
在報表中,我們可以采用附加的程序庫的方式來引用它。對於附加程序庫,用戶可以在報表中調用它的包、函數和過程。
Ø 建立PL/SQL程序庫
PL/SQL程序庫,即PLL文件,需要在Reports Builder中去建立。
詳細的建立過程如下:
a) 在對象導航器中選擇“PL/SQL庫”節點,然后單擊工具欄上的“創建”工具,則在“PL/SQL庫”節點下會出現一個新的庫結點,該節點下有兩個子節點:“程序單元”子節點和“附加的庫”子節點。
b) 選中“程序單元”子結點,然后單擊工具欄上的“創建”工具,彈出“新建程序單元對話框。
c) 在對話框中輸入過程、函數、包說明或包主體的名稱,接受對話框,則彈出“程序單元編輯器”窗口。
d) 輸入PL/SQL過程、函數、包的代碼,編譯后關閉“程序單元編輯器”窗口。
e) 點擊保存按鈕,保存庫文件到指定的目錄中。
Ø 連接PL/SQL程序庫
建立好PL/SQL程序庫后,庫中的所有函數、過程都可以在任何Oracle產品中被引用。但在引用前,須將庫連接到引用它的報表上。
連接步驟如下:
a) 在對象導航器中選擇“附加的庫(Attached Libraries)”節點,然后單擊工具欄上的“創建”工具,則彈出“附加程序庫(Attach library)”對話框。
b) 先在對話框中輸入PL/SQL庫的名稱,或者點擊“瀏覽”來選擇要附加的PL/SQL程序庫文件。然后再單擊“附加”按鈕來連接該PL/SQL程序庫。
c) 系統會提示“附加的程序庫的名稱包含不可移植的目錄設置,要刪除此路徑嗎?”,一般我們會選擇“Yes”,這樣附加的庫文件和路徑無關,只要把庫文件放在REPORTS60_PATH所指定的路徑下系統就可以找到。如果選“No”,則附加的庫文件帶有絕對路徑,庫文件的位置不能改變,不利於報表安裝。
將建立好的PL/SQL程序庫附加在報表上后,程序庫庫中的所有函數、過程、包就可以在報表的任何地方被調用。