新接触fastreport4 不知道里面的ADOQUERY怎么动态赋语句,也查了不少帖子,没什么实际性的东西,借此高手就请发挥发挥吧

解决方案 »

  1.   

    demo里面东西太浅了,很多实际应用的东西没有 比如说自带ADOQUERY的应用就没有
      

  2.   

    以前回復過的...
    使用FastReport  adoquery 創建動態報表的幾個技巧:1.已經生成的報表保存到流中,再從流中取出
        TfrxReport.PreviewPages.SaveToStream(TStream);
        TfrxReport.PreviewPages.LoadFromStream(TStream);2.把變數添加到報表中
        with frxReport1 do
        begin
          with Variables do
          begin
            Category:=Add;
            Category.Name := ' ' + '自訂變數1';        //注意!!第一個' '內是一個空格!!如果沒有空格,不能正確添加分類
            with Add do Name := ' ' + '自訂變數2';     //更簡化的格式
            AddVariable('自訂變數1', '變數11', QuotedStr('大寫金額'));
            AddVariable('自訂變數1', '變數12', QuotedStr('大寫金額'));
            AddVariable('自訂變數1', '變數13', QuotedStr('大寫金額'));
            AddVariable('自訂變數2', '變數21', 1880);
            AddVariable('自訂變數2', '變數22', QuotedStr('大寫金額'));
            AddVariable('自訂變數2', '變數23', QuotedStr('大寫金額'));
          end;
        end;
    3.動態添加資料集,要注意!!!!!
    在取報表格式之前,應該先把資料集物件放好,這樣才能保證在報表控制項在取格式檔後,
    安置報表物件時,可以拿到資料物件,如果操作順序搞反了,則報表物件就無法
    拿到資料物件,在預覽資料時,就會產生“沒有資料集”的錯誤了!!
    var
        tmpDataSet: T資料集;
        DataSource: TDataSource;
        frxDBDataSet: TfrxDBDataset;
    begin
        tmpDataSet:=T資料集.Create(Self);
        DataSource:=TDataSource.Create(Self);
        frxDBDataSet:=TfrxDBDataset.Create(Self);    DataSource.DataSet:=tmpDataSet;
        frxDBDataSet.DataSource:=DataSource;
        //frxDBDataSet.DataSet:=tmpDataSet;      //這條語句與上一條都可用,我也不知道區別在哪
        frxDBDataSet.UserName:='資料項目名稱';      //好用在於可以用中文名
        frxReport1.DataSets.Add(frxDBDataSet);-------------注意:在把報表格式LoadFromFile或LoadFromStream之前,必須完成上面這幾條語句的程式!!!!4.將報表設置資料保存到流中,只要設置TfrxDesigner.OnSaveReport就可以了,但不知道這東西怎麼和Report聯接起來的,只需要在介面上放一個控制項就OK了,怪怪的,不過挺爽
      
    5.自訂預覽窗口
        通過引用frxPreview來建立繼承類TfrxPreview,然後在繼承的類中加入自己的特性,這樣是最省事的了6.處理順序的信條(真理):假設報表範本是保存在資料庫中的
    a.必須在把報表範本提取出來前,把表物件注入資料中,否則在預覽時就知錯
    b.必須在在把報表範本提取出來後,再把動態變數加到報表中,否則看不到變數存在
    這兩個順序必須當信條來理解,至於什麼原因,偶還沒空看FastReport的來源程式咧,嘿嘿~~,這兩個處理機制可是偶經過了N多失敗之後才發現的哦7.添加自訂函數
    a.建立自己的函數,可以是類的成員函數(要注意產生實體類喲),也可以是全域函數
    b.用TfrxReport.AddFunction把函數加到註冊項中,注意,必須是函數的完整定義,比如,你的函數是:
         function MyFunction(Para0: Float): string;
     那麼AddFunction格式應該這樣:
         frxReport1.AddFunction('function MyFunction(Para0: Float): string','自訂函數','');
    c.必須在TfrxReport.OnUserFunction中對函數的返回值進行處理,否則在報表中即使寫的格式正確,也沒有返回值,這是必須注意的8.在自訂函數中使用報表中的物件
    a.建立自訂函數function TForm1.GetCrossObject(CrossObj: TfrxCustomCrossView): string;
    begin
        // 取資料物件
        Result:='行數:'+IntToStr(CrossObj.Matrix.RowCount);
    end;b.註冊函數,可以在Form1.Create時註冊哦    with frxReport1 do
        begin
          AddFunction('function GetCrossObject(CrossObj: TfrxCustomCrossView): String',
            '擴展函數', '');
        end;c.必須在TfrxReport.OnUserFunction中對函數的返回值進行處理function TForm1.frxReport1UserFunction(const MethodName: String;
        var Params: Variant): Variant;
    begin
        if UpperCase(MethodName)=UpperCase('GetCrossObject') then
          Result:=GetCrossObject(TfrxCustomCrossView(Integer(Params[0])));    //類型轉換才能編譯通過哦  
    end; 
      

  3.   

    当DEMO里面没有的时候,就说明这种用法极少用到或者在DEMO里有变通的用法。
      

  4.   

    http://blog.csdn.net/SmallHand/archive/2009/01/07/3727669.aspxhttp://blog.csdn.net/SmallHand/archive/2009/02/04/3861648.aspx
      

  5.   

    这一句:frxReport1.DataSets.Add(frxDBDataSet);