熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi7中使用RAVE報表

2013-11-11 21:03:54  來源: Delphi編程 
最近剛剛做完一個項目使用到了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集成開發環境的界面包括標題欄菜單欄快捷工具欄組件欄和一些窗口
  
  ·標題欄顯示了當前的工程名位於最上部
  
  ·菜單欄一些功能可通過菜單欄的菜單命令實現
  
  ·快捷工具欄為位圖按鈕一些常用的菜單命令用這些按鈕實現
  
 

  ·報表組件欄分頁顯示各種組件(StandardReportZoomColorsLinesFillsFontsDrawingBar CodeAlignment)在利用Rave開發應用程序的過程中正確合理地使用組件非常重要用它可設計基於數據庫和文本的復雜報表
  
 

  ·左邊半部分像Delphi的object inspector工具可設置報表元件的屬性它的下部分有對應屬性的簡短提示
  
  ·正中部分為設計區域開發者可在上面添加各種設計元件如Drawing的橫線直線矩形橢圓Barcode中各種常用的條碼Standand 中的TextMemoSectionBitmapMetafile等等
  
  ·右邊為設計導航區可查看報表的各元件的更多信息如報表庫和數據顯示目錄設計時也可快速定位元件位置
  
  Rave的報表設計器組件欄的各組件
  
  Drawing (繪圖) 組件頁
  
 

  Line component 畫線組件所畫的線較靈活 可以看到其屬性入圖有顏色線寬線行等屬性設計者根據需要更改屬性改變線的長短位置選中線條後選擇一個端點則光標會變為十子型拖動即可
  
 

  Hline component 畫水平線組件
  
  Vline component 畫垂直線組件
  
  Rectangle component 畫長方形組件可以使用fill組件填充
  
  Square component 畫正方形組件可以使用fill組件填充
  
  Ellipse component 畫橢圓組件可以使用fill組件填充
  
  Circle component 畫圓形組件可以使用fill組件填充
  
  Bar Code(條形碼)組件頁
  
 

  PostNetBarCode 打印郵件標簽上包括 POSTNET 條碼
  
  IofBarCode 打印 Interleaved of 條碼
  
  CodeBarCode 打印standard and extended Code 條碼
  
  CodeBarCode 打印 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這個組件算是一個容器組件包括textMemo組件等包括的是非數據庫庫信息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中來設計連接數據庫的報表
  新建工程在窗體上放置以下組件RvProjectRvSystemRvDataSetConnectionADOConnectionADOTableDataSourceButtonDBGrid設置相應的數據庫連接可以看到在DBGrid中顯示了數據具體的設置在這裡不進行講解了請參考相應的數據庫書RvSystem的Engine為RvSystemRvProjectFile選擇保存了的為*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]} 添加數據
  數據庫的部分不進行過多地講解在窗體上放置DatabaseQueryDataSourceRvQueryConnectionDBGrid組件連接到數據庫{查詢所有[陝西]的}按鈕的事件為
  procedure TFormButtonClick(Sender: TObject);
  begin
  QuerySQLClear ;
  QuerySQLAdd(SELECT * FROM InfoTable WHERE (province =:pro) );
  QueryParamByName(pro)AsString :=陝西;
  QueryExecSQL ;
  QueryActive :=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 TFormButtonClick(Sender: TObject);
  begin
  With RvProjectProjMan do
  begin
  RvProjectOpen ;
  RvQueryConnectionExecGetCols ; //得到列名
  RvQueryConnectionExecGetRow ; //得到記錄
  RvProjectExecuteReport(Report);
  Close ;
  end;
  end;
  
  procedure TFormRvQueryConnectionGetCols(
  Connection: TRvCustomConnection);
  begin
  ConnectionWriteField(namedtString);
  ConnectionWriteField(sexdtString);
  ConnectionWriteField(agedtInteger);
  ConnectionWriteField(provincedtString);
  end;
  
  procedure TFormRvQueryConnectionGetRow(Connection: TRvCustomConnection);
  begin
  ConnectionWriteStrdata(DBGridFields[]value);
  ConnectionWriteStrdata(DBGridFields[]value);
  ConnectionWriteIntdata(DBGridFields[]value);
  ConnectionWriteStrdata(DBGridFields[]value);
  end;
  在運行程序這樣就完成了一個根據動態查詢生成的報表
  使用存儲過程的報表方法如下:
  首先你要建立你的存儲過程建立存儲如下雖然這樣的簡單的查詢用存儲過程沒有必要這裡也只是簡單的示例:
  ALTER procedure pr_test
  as
  DECLARE  @chrnSQL nvarchar()
  SELECT @chrnSQL=select * FROM InfoTable where age>
  EXEC sp_ExecuteSql @chrnSQL
  在上例的程序中增加DBGrid StoredProcDataSourceRvDataSetConnection[運行存儲過程]按鈕和[報表預覽]按鈕DataSource的dataset屬性設置為StoredProcDBGrid的DataSource設置為DataSourceStoredProc連接數據庫StoredProcName := pr_test; RvDataSetConnection的dataset屬性設置為StoredProc [運行存儲過程]按鈕的click事件為
  with StoredProc do begin
  prepare;
  StoredProcActive :=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 TFormButtonClick(Sender: TObject);
  begin
  With RvProjectProjMan do
  begin
  RvProjectOpen ;
  RvDataSetConnectionExecGetCols ; //得到列名
  RvDataSetConnectionExecGetRow ; //得到記錄
  RvProjectExecuteReport(Report);
  Close ;
  end;
  end;
  
  procedure TFormRvDataSetConnectionGetCols(
  Connection: TRvCustomConnection);
  begin
  ConnectionWriteField(namedtString); {列名}
  ConnectionWriteField(sexdtString);
  ConnectionWriteField(agedtInteger);
  ConnectionWriteField(provincedtString);
  end;
  procedure TFormRvDataSetConnectionGetRow(
  Connection: TRvCustomConnection);
  begin
  ConnectionWriteStrdata(DBGridFields[]value);
  ConnectionWriteStrdata(DBGridFields[]value);
  ConnectionWriteIntdata(DBGridFields[]value);
  ConnectionWriteStrdata(DBGridFields[]value);
  end;
  好了這篇的講解應該大家都明白和數據庫有關的報表怎麼設計了總結一下通過DBGrid數據感應組件得到查詢的結果通過和rave的連接組件(RvDataSetConnectionRvQueryConnection等)的GetCols和GetRow事件往報表當中添加數據


From:http://tw.wingwit.com/Article/program/Delphi/201311/8385.html
  • 上一篇文章: 没有了

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.