UniGUI使用報表Grid++Repor的方法之二(動態調用)

UniGui中使用Grid++Report報表控件主要是通過TUniHTMLFrame控件中嵌入HTML代碼來進行調用,我們可以直接在delphi中動態修改這個HTML代碼來實現不同數據源及報表模板的報表打印與展示。下面是這是TUniHTMLFrame控件中的HTML屬性的代碼:

<HTML>
	<HEAD>
		<TITLE>Web報表(B/S報表)演示 - 最簡單例子,用插件在網頁中展現報表,實際應用採用 simple_UseCreateControl.htm 的方式更簡便</TITLE>
		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    </HEAD>
	<BODY style="margin:0" style="margin:0">
	<OBJECT classid="CLSID:E060AFE6-5EFF-4830-B7F0-093ECC08EF37" 
            codebase="../griectl.cab#Version=5.6.12.325" width="100%" height="100%" 
            id="ReportViewer" VIEWASTEXT>
            <param name="ReportURL" value="####">    <!--報表模板標記,在程序代碼中替換-->
            <param name="DataURL" value="****">      <!--報表數據URL的文件標記,在程序代碼中替換-->
	</OBJECT>
   	<script>
		document.getElementById('ReportViewer').ResizeColumnToFit();
		document.getElementById('ReportViewer').UpdateViewer();
	</script>
	</BODY>
</HTML>

注意其中的"#####"及"*****"我們在下面的代碼中要動態替換掉這兩個地方實現報表模板及數據的動態顯示:

下面是Main.pas的代碼,很簡單:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
  uniGUIClasses, uniGUIForm, uniGUIBaseClasses, uniPanel, uniURLFrame,
  uniHTMLFrame, uniButton,System.StrUtils;

type
  TMainForm = class(TUniForm)
    UniPanel1: TUniPanel;
    UniHTMLFrame1: TUniHTMLFrame;
    procedure UniFormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  uniGUIVars, MainModule, UntCommon, ServerModule;

function MainForm: TMainForm;
begin
  Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;

procedure TMainForm.UniFormCreate(Sender: TObject);
var
 s,f:string;
 t:TStringList;
begin
  t:=nil;
   //創建時修改Html文件中的ReportUrl,和DataURL的參數。
   //s爲打印的Html模板
  s :=  StringReplace(UniHTMLFrame1.HTML.Text,'####','files/simple.txt',[rfReplaceAll]);
  f:=   UniServerModule.LocalCacheURL+ 'simple.xml';   //定義報表數據URL的文件路徑及文件名
  s :=  StringReplace(s,'****',f,[rfReplaceAll]);      //替換報表數據dataUrl爲定義的文件名
  UniHTMLFrame1.HTML.Text :=s; //重新給UniHTMLFrame的html屬性賦值
  try
    t := TStringList.Create;
    s := DataSetToXml(UniMainModule.UniQuery1);   //轉換DataSet數據到XML
    t.Add(s);
    t.SaveToFile(f,TEncoding.UTF8);  //創建 報表數據文件文件並寫入服務器硬盤,供報表調用
  finally
    t.Free;
  end;

end;

initialization
  RegisterMainFormClass(TMainForm);

end.

DataSetToXml命令是用於將dataset的數據轉化爲一個Grid++Report報表插件需求的xml數據格式,Grid++report報表插件的數據xml格式要求可以到Grid++Report的網站查詢:http://www.rubylong.cn下面是DataSetToxml函數所有的UntCommon.pas單元的代碼:

unit UntCommon;

interface

uses
   Data.db,System.SysUtils,System.StrUtils;

function  DataSetToXml(ADataset:tdataset):string;
function  SetLeftStr(Astring:string ):string;
function  SetRightStr(Astring:string ):string;

implementation



//這裏生成一個符合Grid++Report約定的xml數據文件。
function DataSetToXml(ADataset: tdataset): string;
var
  FieldCount:Integer;
  I: Integer;
begin
  Result :='<xml>' +#13#10 ;
  ADataset.DisableControls;
  ADataset.First;
  while not ADataset.Eof do
  begin
    Result := Result +'<row> ';
    for I := 0 to ADataset.FieldCount-1 do
    begin
      with ADataset.Fields[i] do
      case DataType of
       ftString:
       begin
          Result := Result + SetLeftStr(FieldName)+AsString+ SetRightStr(FieldName);
       end;
       ftSmallint,ftInteger,ftWord:
       begin
         Result := Result+ SetLeftStr(FieldName) +inttostr(AsInteger)+ SetRightStr(FieldName);
       end;
       ftBoolean:
       begin
         Result := Result + SetLeftStr(FieldName)+booltostr(asboolean)+ SetRightStr(FieldName);
       end;
       ftFloat,ftCurrency:
       begin
         Result := Result+SetLeftStr(FieldName)+FloatTostr(AsFloat)+ SetRightStr(FieldName);
       end;
       ftDate:
       begin
          Result := Result+SetLeftStr(FieldName)+DateToStr(AsDateTime)+ SetRightStr(FieldName);
       end;
       ftDateTime:
       begin
         Result := Result+SetLeftStr(FieldName)+DateTimeToStr(AsDateTime)+ SetRightStr(FieldName);
       end;
       ftAutoInc:
       begin
          Result := Result + SetLeftStr(FieldName)+inttostr(AsInteger)+ SetRightStr(FieldName);
       end;
       ftMemo:
       begin
         Result := Result+ SetLeftStr(FieldName)+AsString+ SetRightStr(FieldName);
       end;
      end;

    end;

    Result := Result +'</row> '+#13#10  ;
    ADataset.Next;
  end;

  ADataset.EnableControls;
  Result :=Result +'</xml>';

end;

function SetLeftStr(Astring: string): string;
begin
  Result :='<'+astring+'>';
end;

function SetRightStr(Astring: string): string;
begin
    Result :='</'+astring+'>';
end;

end.

下面是在IE瀏覽器中正常運行時的截圖:


目前Grid++Report還不能跨IE\谷歌\firefox瀏覽器使用,需要跨平臺的朋友可以暫時無視。據說Grid++Report目前正在開發firefox的插件,以grid++report的一貫風格來講,新舊版本的兼容性做的好,如果grid++report from firefox插件能推出來,舊項目的代碼應該不會有太多修改,所以grid++report from firefox插件是一個非常值得期待的版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章