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插件是一个非常值得期待的版本。

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