最近剛剛做完一個項目
使用到了RAVE進行報表設計
在使用中也查閱了很多資料
但總覺得網上的資料過於分散
而且都不是很全面
所以決定將如何在Delphi
中使用RAVE報表寫成幾篇文章
由於本人從小語文學得不好
不是寫作高手
這次也是第一次寫這樣的文章
希望看到這篇文章的網友能多提意見
歡迎大家指教
可以給我留言
言歸正傳
在我們要給用戶編寫的軟件中往往需要生成各種各樣的報表
報表是數據庫中數據的最終表現形式
在Delphi
以前
編寫報表都在使用Qusoft公司的Quick report
而且在Delphi中集成了Quick report
在Borland Delphi?
Studio 集成開發環境(IDE)的控件面板中取消了Quick report項
取而代之以Nevrona公司Rave Reports項
且在Tools中有Rave Designer
打開Rave Designer
我們可以如圖所示的一個報表設計界面
開發人員可以開發出符合用戶要求的報表來
而且這個報表的設計
使用與Delphi集成開發環境幾乎是完全的一樣
這可能是Rave與其它的報表組件最大的外觀上的不同
我在使用中下載了Rave Reports v
你可以在或者下載
在寫這篇文章時
上已經發布了Rave Reports
不過文章還是以Rave Reports v
為准
打開Delphi
可以控件面板看到如圖
Delphi
下的Rave
打開Tools中的Rave
看到的報表設計界面如圖
Rave
的報表設計界面
首先
介紹一下Rave的報表設計器的各組件和相關的屬性
Rave Designer集成開發環境的界面包括標題欄
菜單欄
快捷工具欄
組件欄和一些窗口
·標題欄顯示了當前的工程名
位於最上部
·菜單欄
一些功能可通過菜單欄的菜單命令實現
·快捷工具欄為位圖按鈕
一些常用的菜單命令用這些按鈕實現
·報表組件欄分頁顯示各種組件(Standard
Report
Zoom
Colors
Lines
Fills
Fonts
Drawing
Bar Code
Alignment)
在利用Rave開發應用程序的過程中
正確
合理地使用組件非常重要
用它可設計基於數據庫和文本的復雜報表
·左邊半部分像Delphi的object inspector工具
可設置報表元件的屬性
它的下部分有對應屬性的簡短提示
·正中部分為設計區域
開發者可在上面添加各種設計元件
如Drawing的橫線
直線
矩形
橢圓
Barcode中各種常用的條碼
Standand 中的Text
Memo
Section
Bitmap
Metafile等等
·右邊為設計導航區
可查看報表的各元件的更多信息
如報表庫和數據顯示目錄
設計時也可快速定位元件位置
Rave的報表設計器
組件欄的各組件
Drawing (繪圖) 組件頁
Line component
畫線組件
所畫的線較靈活
可以看到其屬性入圖
有顏色
線寬
線行等屬性
設計者根據需要更改屬性
改變線的長短位置
選中線條後
選擇一個端點則光標會變為十子型
拖動即可
Hline component
畫水平線組件
Vline component
畫垂直線組件
Rectangle component
畫長方形組件
可以使用fill組件填充
Square component
畫正方形組件
可以使用fill組件填充
Ellipse component
畫橢圓組件
可以使用fill組件填充
Circle component
畫圓形組件
可以使用fill組件填充
Bar Code(條形碼)組件頁
PostNetBarCode
打印郵件標簽上包括 POSTNET 條碼
I
of
BarCode
打印 Interleaved
of
條碼
Code
BarCode
打印standard and extended Code
條碼
Code
BarCode
打印 A
B and C Code
條碼
UPCBarCode
打印 UPC
條碼
EANBarCode
打印 EAN
條碼
Standard(標准)組件頁
Text
這個組件是在報表上固定的文字
例如報表的標題等
可以設置字體的大小
顏色
Rotation屬性可以使要顯示的字為任意角度
Memo
Memo組件提供了多行文本的文字
與delphi中的相似
屬性很多
但我們應用的不多
可以使用text屬性添加文本
Section
這個組件是其他組件的容器
將其他組件固定在此組件中
Bitmap
這個組件是在報表中放置bmp文件 (*
bmp)
FileLink屬性連接bmp文件
MetaFile
這個組件在報表中放置meta文件 (*
wmf)
FileLink屬性連接meta文件
FontMaster
這個組件控制報表中的任何的text字的屬性
在要使用該字體的text組件或memo組件的fontmirrot屬性選擇FontMaster
PageNumInit :報表顯示頁碼的初始頁碼
如圖的InitValue的值為
則報表的初始頁為
頁碼從5開始
Report(報表)組件頁
如果報表需要的是數據庫的數據
則這個組件頁中的組件使用比較頻繁
DataText
用來顯示數據庫中內容比較短的信息
要用它顯示相應的數據庫字段信息
則要使用到DataField 和DataView兩個屬性
用來連接數據庫和字段
DataText用來設計主從報表時
LookupDataView是相應的數據連接
LookupDisplay是顯示內容
LookupField是主報表相應的數字段進行關聯的字段的內容
也就是主數據字段進行連接的字段
LookupInvalid是控制相應錯誤產生後的情況
DataMemo
在Memo的基礎上支持了數據庫的字段顯示
使用DataField 和DataView兩個屬性
用來連接數據庫和字段
除了輸出相應的文本內容外
還可以輸出RTF格式
顯示RTF格式
需要設置ContainsRTF屬性為True
CalcTex
這個組件用來統計報表字段的最大值
最小值
總和
統計值等內容直接使用
只需要通過CalcType屬性來設置
CalcType屬性包括了ctAverage(求平均值)
CtCount(求個數)
ctMax(求最大值)
ctMin(求最小值)
ctSum(求累加和)
DataMirror Section
和Section組件相似
Region
如果要進行報表的打印
Region組件規定了打印區域
可以設置Columns來分欄
Band
這個組件算是一個容器組件
包括text
Memo組件等
包括的是非數據庫庫信息
Band組件要放置在Region中
選擇BandStyle屬性後
出現如下圖的屬性對話框
左邊為報表中Band的列表
右面的PrintLocation包括
Body Header(頁眉)
Group Header(組眉)
Row Header(行眉)
Detail(表體)
Row Footer(行腳)
Group Footer(組腳) 和Body Footer(頁腳)
BandStyle屬性可以多選
Print Occurrence屬性包括
First(首頁打印)
New Page(打印新一頁)
New Column(新分欄)
選擇First(首頁打印)也就是Band包括的內容只在第一頁打印
選擇New Page(打印新一頁)
Band包括的內容必須在新的一頁打印
選擇New Column(新分欄)
Band包括的內容必須在新的分欄中打印
DesignerHide屬性當一個報表有多個Band時選擇查找Band變得比較麻煩設置DesignerHide屬性為True時沒有選擇到的Band內容被隱藏
GroupDataView 和GroupKey屬性如果想要以相應的數據結果作為報表分組的依據那麼就必須設置這兩個屬性GroupDataView是相應的數據源GroupKey是數據源的索引分組是靠GroupKey中的值進行分組的
DataBand是直接作用於數據庫且可以在其中擺放相應數據庫報表組件這樣通過它就可以讓相應的報表具有數據庫書庫打印功能其中DataView屬性是設置相應的數據源GroupDataView是相應的報表中的分組數據源
DataCycle與DataBand相似的地方在於循環的顯示數據DataBand是數據庫內容的循環打印而DataCycle不需要使用Region它打印的區域為頁面每頁只能打印一個組件設計好的內容使用DataBand是根據Region的范圍來分頁而DataCycle則是每一頁只現實一條信息根據數據的多少分頁
CalcOp該組件提供了報表相應的計算功能具體的使用會在以後講解
CalcTotal與CalcOp結合使用來完成日常報表的統計功能
隔了好長時間終於有時間繼續向大家介紹RAVE了這次主要介紹Delphi下的Rave組件打開Delphi看到的rave頁如下
Delphi下的Rave
包括有RvProjectRvSystemRvNDRWriterRvCustomConnectionRvDataSetConnectionRvTableConnectionRvQueryConnectionRvRenderPreviewRvRenderPrinterRvRenderPDFRvRenderHTMLRvRenderRTFRvRenderText這幾個組件
lRvProject組件
在使用rave報表中這個組件是最為重要的一個是使用頻率最高的一個組件開發人員可以通過這個報表完成報表的打印文件的生成輸出土過此事可以使用設計狀態也可以通過它來點用相應的報表設計器
屬性
DLLFile:發行報表時需要的dll文件在以後用戶不需要單獨發行相應的動態鏈庫文件了
Engine: 指定相應報表生成的目的地一般的情況下是RvSystem也就是說它可以打印打印預覽生成打印文件當然也可以選擇RvNDRWriter組件那麼報表輸出的結果是RTFHTMLPDFTXT其中的一種
LoadDesigner: 允許用戶調用報表設計器如果它的值為true那麼最終用戶就可以調用報表設計器如果它的值為False那麼最終用戶就沒有權力調用報表設計器
ProjectFile:相應報表項目文件指定詳細目錄路徑
StoreRAV:要將報表文件嵌入到exe文件中在這裡就要填入相應的報表項目文件
主要方法
SelectReport方法:
Function SelectReport(ReportName:String; FullName:Boolean):Boolean;
ReportName是相應的報表名稱FullName則表示是否以報表的全程作為報表的名稱
Execute方法
打印選擇的相應報表文件報表時被SelectReport選擇的
RvProjectExecute;
ExecuteReport方法
RvProjectExecuteReport(ReportName:String);
ReportName是相應的報表的名稱
Open方法
RvProjectOpen; 打開相應的報表以共操作
Close方法
RvProjectClose; 關閉一個報表的操作
l RvSystem組件
打印或者預覽報表時進行打印參數設置的使用時與RvProject結合
屬性
DefaultDest:指定打印的方式
rdPreview:預覽
rdFile:文件
rdPrinter:打印機
RulerType:相應的標尺單位
rtNone:沒有標尺
rtHorizCm:橫向標尺單位為厘米
rtVertCm:縱向標尺單位為厘米
rtBothCm:先是所有的標尺單位為厘米
rtHorizIn: 橫向標尺單位為英寸
rtVertIn: 縱向標尺單位為英寸
rtBothIn:所有標尺單位為英寸
SystemFiler:報表打印文件參數的設置如果DefaultDest屬性為rbFile則需要設置這裡的屬性值
SystemOptions:所有報表輸出設置屬性
SystemPreview:報表預覽參數的設置如果DefaultDest屬性為rdPreview則需要設置這裡的屬性值
SystemPrinter:報表打印參數的設置如果DefaultDest屬性為rdPrinter 則需要設置這裡的屬性值
SystemSetup:是對是否允許打印是否允許打印機設置等參數的設置
TitlePreview:更改報表預覽的窗體的名稱例如可以將Report Preview改為報表預覽
TitleSetup:更改報表輸出窗體的名稱例如可以將Output Options改為輸出設置
TitleStatus:報表狀態窗體名稱例如可以將Report Status改為報表狀態
主要方法
OverridePreview方法OverrideSetup方法OverrideStatus方法
這三個方法可以對報表設置打印設置報表預覽窗體進行覆蓋在後面會介紹如何通過這幾個方法是窗體為中文
l NDRWriter組件
使用該組件實現自定義報表預覽
l RvDataSetConnection組件RvTableConnection組件 RvQueryConnection組件
使用這三個組件實現數據庫的連接
l RvRenderPDF組件 RvRenderHTML組件 RvRenderRTF組件RvRenderText組件
報表生成相應文件的組件可讓報表生成相應的pdfhtmlrtftext文件但生成文件對中文不支持會出現亂碼
前面兩篇向大家介紹了RAVE的組件從今天開始向大家介紹如何建立報表首先要感謝li jack等各位朋友給我發的電子郵件鼓勵我繼續寫下去今天也查了一下RAVE一詞的意思
RAVE在辭典上的翻譯為咆哮 raveup喧鬧的宴會 狂歡聚會我們經常也聽到銳舞派對也就是RAVE PARTY
要對Rave文化追根溯源其實不太容易並非是因為其無從追溯恰恰相反正因為它涵蓋的面太廣根基太深所以反而讓人有些無從入手從遠的來說Rave與各塊大陸上土著部落的祭典儀式有著相當的淵源因為這些祭典通常也是通過音樂與緊密的鼓點而使人進入某種超驗狀態從近的來說Rave又與年 代的嬉皮文化與迷幻實驗有著密不可分的關系兩代年輕人除了裝扮不同許多心理狀態與行為方式其實都有值得注意的相似之處
真正當代的將新式音樂與舞曲相結合的Rave運動起源於英國多年前Rave首先出現在曼徹斯特和伊比沙島(英國著名度假勝地)年末及年初兩個並無關系的團體Schoom和Genesis P開始在英國組織徹夜的舞會前者是以house音樂為主而後者以hardcore為主與此同時Rave在德國登陸在柏林等大城市很受歡迎很快Rave在英德兩地吸引了數以萬計的青少年更吸引了許多來自美國的DJ
現在Rave已經是歐美日甚至港台最時興最UNDERGROUND的一種青少年娛樂形式Rave文化從一開始便被打上了高科技的烙印從急速瘋狂的前衛電子舞曲新奇剌激的影像視覺到Sharp得眼花缭亂的裝束Rave與ELife已經成為科技對青年文化影響的見證
當然我也不知道為什麼Nevrona公司把這個報表組件叫做rave也許和銳舞有著一定的關系吧就像java咖啡
言歸正傳我們開始建立一張簡單的報表打開Delphi 新建一個工程打開Tools下的Rave Designer在Rave 設計器的page中拖放Text我們在text屬性中寫入文字內容例如我的第一張報表 通過Font屬性更改字體和字的大小顏色等拖放Memo組件在text屬性中輸入文字可以看到一個多行的文本拖放Bitmap組件在FileLink屬性中選取插入圖片的位置就可以看到在報表中顯示了一張圖片
點擊[Execute Report]或者F則查看到運行後報表
上一篇向大家介紹了建立一張簡單報表的過程這篇文章向大家介紹rave報表代碼編程實例窗體上放置組件RvSystem Button即可
具體代碼如下
##################################################################################
unit Unit;
interface
uses
Windows Messages SysUtils Variants Classes Graphics Controls Forms
Dialogs StdCtrls RpDefine RpBase RpSystem;
type
TForm = class(TForm)
RvSystem: TRvSystem;
Button: TButton;
procedure RvSystemPrint(Sender: TObject);
procedure ButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form: TForm;
implementation
{$R *dfm}
procedure TFormRvSystemPrint(Sender: TObject);
var
I: integer;
S: string[];
S: string[];
Bitmap: TBitmap;
PolyLineArr: array[] of TPoint;
begin
with Sender as TBaseReport do begin
{ 打印表頭和表尾 }
SectionTop := ; //頂端
SetFont(黑體); //設置字體
Underline := true; //下劃線
Home;
YPos := ;
FontRotation :=;//旋轉角度
PrintCenter(我的報表PageWidth / );
SetFont(宋體);
SectionBottom := ;
PrintFooter(第 + IntToStr(CurrentPage) + 頁pjLeft); //頁碼
PrintFooter(日期: +DateToStr(Date)+ pjRight); //日期
SectionBottom := ;
YPos := ;
SetFont(宋體);
SetTopOfPage;
Home;
{ 打印列標題 }
ClearTabs;
SetPen(clBlackpsSolidpmCopy); { 設置畫筆為一個點寬 }
SetTab(pjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
Bold := true;
Tab(NANA); { 畫出具有粗邊框的表格 }
Print(Name);
Tab(NANANA);
Print(Number);
Tab(NANANA);
Print(Amount );
Tab(NANA);
Println(Amount );
Bold := false;
{ 打印具有邊框的數據 }
ClearTabs;
SetTab(pjLeftBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjRightBOXLINEALL);
SetTab(NApjRightBOXLINEALL);
for I := to do begin
Str(I * ::S);
Str(I * ::S);
Print(#LastName + IntToStr(I) + );
SetFont(Times New Roman);
Print(FirstName M);
SetFont(Times New Roman);
Println(# + IntToStr(I) + #$ + S + #$ + S);
end; { for }
{ 打印具有陰影的數據 }
ClearTabs;
SetTab(pjLeftBOXLINENONE);
SetTab(NApjCenterBOXLINENONE);
SetTab(NApjRightBOXLINENONE);
SetTab(NApjRightBOXLINENONE);
for I := to do begin
If Odd(I) then begin
TabShade := ;
end else begin
TabShade := ;
end; { else }
Str(I * ::S);
Str(I * ::S);
Print(#LastName + IntToStr(I) + );
SetFont(Times New Roman);
Print(FirstName M);
SetFont(Times New Roman);
Println(# + IntToStr(I) + #$ + S + #$ + S);
end; { for }
ClearTabs;
{ 分欄報表 }
ClearTabs;
SetTopOfPage;
SectionBottom := ;
Home;
SetFont(宋體);
Bold := true;
Underline := true;
Print( 分欄報表 (LinesLeft/ColumnLinesLeft/LineNum/ColumnNum));
SetTopOfPage; { Set top of page to current YPos }
Bold := false;
Underline := false;
Italic := false;
Home; { Goto home position }
SetColumns(); { Create columns with between each }
while ColumnLinesLeft > do begin
Println(IntToStr(LinesLeft) + / + IntToStr(ColumnLinesLeft) + / +
IntToStr(LineNum) + / + IntToStr(ColumnNum));
end; { while }
{ 具有邊框的分欄報表 }
ClearTabs;
SetTopOfPage;
SectionBottom := ;
Home;
SetFont(Times New Roman);
Bold := true;
Italic := true;
Print(Boxed Columns);
SetTopOfPage; { Set top of page to current YPos }
Bold := false;
Italic := false;
Home; { Goto home position }
ClearTabs;
SetPen(clBlackpsSolidpmCopy);
SetTab(pjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetTab(NApjCenterBOXLINEALL);
SetColumns(); { Create columns with between each }
while ColumnLinesLeft > do begin
if LineNum = then begin
TabShade := ;
Println(#LL#CLL#L##C#); { 打印標題欄 }
end else begin
TabShade := ;
Println(# + IntToStr(LinesLeft) + # + IntToStr(ColumnLinesLeft) +
# + IntToStr(LineNum) + # + IntToStr(ColumnNum));
end; { else }
end; { while }
SetColumns();
{ 在指定位置繪出文本 }
NewPage;
OriginX := ; { Set origin to normal }
OriginY := ;
GotoXY();
Print(Text @ );
GotoXY();
Println(Text @ );
GotoXY();
Println(Text @ );
GotoXY();
Println(Text @ );
{*** 圖形 圖片***}
NewPage;
ResetSection;
SetFont(Arial);
Underline := true;
Home;
PrintCenter(Graphics Page DemoPageWidth / );
SetFont(Times New Roman);
SectionBottom := ; { Temporarily move the section bottom down }
PrintFooter(Page + IntToStr(CurrentPage)pjLeft);
PrintFooter(Date //pjRight);
SectionBottom := ; { Reset section bottom }
OriginX := ;
OriginY := ;
SetFont(Arial);
{ 半圓 弧線}
SetPen(clBlackpsSolidpmCopy); { Set pen to black /ths wide }
YPos := ;
PrintCenter(Arc() and Chord());
Arc();
SetBrush(clBlackbsClearnil);
Chord();
{ 餅圖 }
YPos := ;
PrintCenter(Pie());
以access數據庫為例
先新建一個數據庫
建立一張表包括的字段為
{[name]
[sex]
[age]
[province]}
添加數據
當然不要太少了
首先
我們不考慮Delphi程序的調用
打開rave新建一個report
.[File]àNew Data Objectà選擇Use Connection String
選擇[Microsoft Jet
OLE DB Provider]
選擇保存的數據庫的位置並測試連接成功
[ok]後
看到報表設計導航區的Data View Dictionary增加了Database
.[File]àNew Data Object Driver Data View 選擇Database
[Finish] 彈出Query Advenced Designr
將Query Advenced Designr的Tables欄的數據表拖放到layout中à[ok]à看到報表設計導航區的Data View Dictionary增加了DriveDataView
擴展後可以看到數據字段
.選[Tools]àReport WizardsàSingle Table 選DriveDataView
選擇數據庫字段Report Title改為
個人情況報表
好了之後
可以看到在page中生成了報表
.按[F
]或者快捷按鈕[Execute Report]
你就可以看到連接到數據庫的報表了
rave報表根據數據量的多少自動分頁
根據需要更改格式
再預覽
直到是你所想要的報表格式
這時候就很簡單的完成了一張報表
當然有些人也許很看到這樣設計出來的報表的標題在報表的第一頁顯示了後
在其他頁並沒有顯示
怎麼樣讓標題在每一頁顯示呢?
選到TitleBand
在設置BandStyle在Print Occurrence把New page打勾選中
這樣在預覽你就會發現
這時生成的報表每一頁都會有標題
當然
我們的報表時用程序調用的
那麼我們在delphi中來設計連接數據庫的報表
新建工程
在窗體上放置以下組件
RvProject
RvSystem
RvDataSetConnection
ADOConnection
ADOTable
DataSource
Button
DBGrid
設置相應的數據庫連接可以看到在DBGrid中顯示了數據
具體的設置在這裡不進行講解了
請參考相應的數據庫書
RvSystem
的Engine為RvSystem
RvProjectFile選擇保存了的為*
Rav文件
RvDataSetConnection
的DataSet屬性設置為
ADOTable
打開Rave設計器打開*Rav文件
[File]àNew Data ObjectàDirect Data Viewà選擇RvDataSetConnection[Finish]看到報表設計導航區的Data View Dictionary增加了DataView擴展後可以看到數據字段
利用前例步驟同樣的方法進行報表的可視化設計在可視化設計時注意看生成的簡單數據庫代碼的組成部分注意TitleBandDataBand Band的屬性設置當然我們也可以不用Report Wizards自動生成也可以自己來根據需要直接做報表步驟是
)添加組件頁的Region組件來描述報表的范圍
)添加BandBand DataBand組件設置相應的BandStyle 和Dataview屬性
)在DataBand中添加DataText選擇其Dataview屬性和DataFile屬性
)預覽即可如果不能正常顯示注意查看屬性的設置尤其是Dataview屬性同時可以與Report Wizards自動生成的報表進行對比
添加如下代碼
procedure TFormButtonClick(Sender: TObject);
begin
RvProjectOpen ;
RvProjectExecuteReport(Report);
RvProjectClose ;
end;
運行後點擊[確定]按鈕既顯示報表設置窗體確定後可以看到你想要得窗體
關於和數據庫連接報表的一些問題
)上面的例子是直接從數據庫輸出的報表如果要輸出的報表是根據用戶的條件輸出怎麼辦?
如果是要根據用戶的條件輸出相應的報表使用Query組件當然要是涉及到存儲過程的操作也是一樣的阿選擇相應的數據庫訪問組件將RvDataSetConnection的Dataset屬性連接到數據庫訪問組件即可
)我在數據庫表中的字段是中文的在Rave中連接數據庫DataView不能顯示我的字段並且提示DataView已經存在! 怎麼辦?
出現這樣的問題主要是DataView的name屬性不支持中文名而不能根據數據段名來命名你將DataView更改為相應的英文名更改Fieldname為響應的字段中文刷新DataView還會有提示同樣更改name和Fieldname屬性直到你要的字段都更改好為止
)默認的報表時豎排的怎麼樣才能將頁面設置為橫向的?
關於頁面的設置請注意熟悉RvSystem的屬性
RvSystemSystemPrinterOrientation :=poLandScape; //頁面為橫向的
RvSystemSystemPreviewFormState := wsMaximized; //預覽窗體最大化
RvSystemSystemPreviewMarginPercent :=; //報表頁面據預覽窗體的邊距
當然還有很多的設置TitleSetupTitleStatusTitlePreview屬性可以將你的報表設置報表預覽的窗體的標題改為你想要的當然我們最基本的是要改為中文的阿關於怎麼讓你的報表預覽報表設置窗體為中文的我在後面會專門介紹
在Delphi
中使用RAVE報表(五)中講解了和數據庫連接的報表
有朋友提出了問題
所以在用一篇文章講解使用Query動態查詢和存儲過程連接數據庫的報表
因為要使用到存儲過程
我們使用SQL_Server
數據庫
建立數據庫Infotest
建立數據表InfoTable 字段為: {[name]
[sex]
[age]
[province]}
添加數據
數據庫的部分不進行過多地講解
在窗體上放置Database
Query
DataSource
RvQueryConnection
DBGrid組件
連接到數據庫
{查詢所有[陝西]的}按鈕的事件為
procedure TForm
Button
Click(Sender: TObject);
begin
Query
SQL
Clear ;
Query
SQL
Add(
SELECT * FROM InfoTable WHERE (province =:pro)
);
Query
ParamByName(
pro
)
AsString :=
陝西
;
Query
ExecSQL ;
Query
Active :=True;
end;
運行點擊後
可以查看到DBGrid顯示了查看的結果
這樣完成了第一步
動態查詢的過程
將程序運行
[查詢]
然後打開Rave
記住不要關掉查詢的程序
[File]=〉New Data Object=〉Direct Data View=〉選擇RvQueryConnection
=〉 [Finish]=〉看到報表設計導航區的Data View Dictionary增加了DataView
擴展後可以看到數據字段
選[Tools]=〉Report Wizards=〉Single Table=〉選DataView
選擇數據庫字段=〉Report Title改為
個人情況報表
好了之後
可以看到在page中生成了報表
然後
保存*
rav文件關閉程序
添加[報表預覽]按鈕事件
以及RvQueryConnection
的GetCols和GetRow事件
procedure TForm
Button
Click(Sender: TObject);
begin
With RvProject
ProjMan do
begin
RvProject
Open ;
RvQueryConnection
ExecGetCols ; //得到列名
RvQueryConnection
ExecGetRow ; //得到記錄
RvProject
ExecuteReport(
Report
);
Close ;
end;
end;
procedure TForm
RvQueryConnection
GetCols(
Connection: TRvCustomConnection);
begin
Connection
WriteField(
name
dtString
);
Connection
WriteField(
sex
dtString
);
Connection
WriteField(
age
dtInteger
);
Connection
WriteField(
province
dtString
);
end;
procedure TForm
RvQueryConnection
GetRow(Connection: TRvCustomConnection);
begin
Connection
WriteStrdata(
DBGrid
Fields[
]
value);
Connection
WriteStrdata(
DBGrid
Fields[
]
value);
Connection
WriteIntdata(
DBGrid
Fields[
]
value);
Connection
WriteStrdata(
DBGrid
Fields[
]
value);
end;
在運行程序
這樣就完成了一個根據動態查詢生成的報表
使用存儲過程的報表方法如下:
首先你要建立你的存儲過程
建立存儲如下
雖然這樣的簡單的查詢用存儲過程沒有必要
這裡也只是簡單的示例:
ALTER procedure pr_test
as
DECLARE @chrnSQL nvarchar(
)
SELECT @chrnSQL=
select * FROM InfoTable where age>
EXEC sp_ExecuteSql @chrnSQL
在上例的程序中
增加DBGrid
StoredProc
DataSource
RvDataSetConnection
[運行存儲過程]按鈕
和[報表預覽]按鈕
DataSource
的dataset屬性設置為StoredProc
DBGrid
的DataSource設置為DataSource
StoredProc
連接數據庫
StoredProcName :=
pr_test
; RvDataSetConnection
的dataset屬性設置為StoredProc
[運行存儲過程]按鈕的click事件為
with StoredProc
do begin
prepare;
StoredProc
Active :=True;
end;
運行程序
看到DBGrid
顯示了存儲過程查詢的結果
將程序運行
[運行存儲過程]
然後打開Rave
記住不要關掉查詢的程序
然後
用和上例相同的方法
添加如下代碼
[File]=〉New Data Object=〉Direct Data View=〉選擇RvDataSetConnection
=〉 [Finish]=〉看到報表設計導航區的Data View Dictionary增加了DataView
擴展後可以看到數據字段
選[Tools]àReport WizardsàSingle Tableà 選DataView
選擇數據庫字段àReport Title改為
個人情況報表
好了之後
可以看到在page中生成了報表
保存文件
關閉程序
添加[報表預覽]按鈕事件
以及RvDataSetConnection
的GetCols和GetRow事件
procedure TForm
Button
Click(Sender: TObject);
begin
With RvProject
ProjMan do
begin
RvProject
Open ;
RvDataSetConnection
ExecGetCols ; //得到列名
RvDataSetConnection
ExecGetRow ; //得到記錄
RvProject
ExecuteReport(
Report
);
Close ;
end;
end;
procedure TForm
RvDataSetConnection
GetCols(
Connection: TRvCustomConnection);
begin
Connection
WriteField(
name
dtString
); {列名}
Connection
WriteField(
sex
dtString
);
Connection
WriteField(
age
dtInteger
);
Connection
WriteField(
province
dtString
);
end;
procedure TForm
RvDataSetConnection
GetRow(
Connection: TRvCustomConnection);
begin
Connection
WriteStrdata(
DBGrid
Fields[
]
value);
Connection
WriteStrdata(
DBGrid
Fields[
]
value);
Connection
WriteIntdata(
DBGrid
Fields[
]
value);
Connection
WriteStrdata(
DBGrid
Fields[
]
value);
end;
好了
這篇的講解應該大家都明白和數據庫有關的報表怎麼設計了
總結一下
通過DBGrid數據感應組件得到查詢的結果
通過和rave的連接組件(RvDataSetConnection
RvQueryConnection等)的GetCols和GetRow事件往報表當中添加數據
From:http://tw.wingwit.com/Article/program/Delphi/201311/8385.html