UniGui中使用Grid++Report报表控件子报表获取数据的方法

原创 2015年11月20日 16:55:27
Grid++Report是为优秀的报表控件,子报表是其重要功能之一,但Grid++Report提供的网页报表示范主要是以页面为主的,UniGui在Delphi中以快速编写web管理软件著称,但由于资料文档很少,经过摸索,Grid++Report的子报表要在uniGUi中正确获取子报表数据,只能通过Ajax数据回调的方式进行,在uniGUi中对前端Ajax的响应,就要是通过控件的AjaxEvent事件来处理。报表模板的展示部分的HTML代码要放在UniURLFrame控件的HTML属性中。

AjaxEvent事件函数如下:

FormAjaxEvent(Sender: TComponent; EventName: string;  Params: TStrings);

EventName代表浏览器前端传入的事件名称

Params 浏览器前端传入的参数



UniURLFrame中的网页代码:

其中:

{xmlTop10Product}
{xmlProductList}
{xmlTop10Customer}
{xmlCustomer}

这几个地方需要在服务端运行时替换为UniGui可以识别的回调URL地址。

<span style="font-family: Arial, Helvetica, sans-serif;"><head></span>
<title>Web报表(B/S报表)演示 - 子报表,子报表模板集成定义</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<script src="files/CreateControl.js" type="text/javascript"></script>
	<script type="text/javascript">

var CustomerReport;
var ProductReport;
var Top10CustomerReport;
var Top10ProductReport;

//在网页初始加载时向报表提供数据
function window_onload() {
    CustomerReport = ReportViewer.Report.ControlByName("srCustomerList").AsSubReport.Report;
   ProductReport = ReportViewer.Report.ControlByName("srProductList").AsSubReport.Report;
    Top10CustomerReport = ReportViewer.Report.ControlByName("srTop10Customer").AsSubReport.Report;
    Top10ProductReport = ReportViewer.Report.ControlByName("srTop10Product").AsSubReport.Report;
    
    //关联事件
    CustomerReport.OnInitialize = OnCustomerInitialize;
    ProductReport.OnInitialize = OnProductInitialize;
    Top10CustomerReport.OnInitialize = OnTop10CustomerInitialize;
    Top10ProductReport.OnInitialize = OnTop10ProductInitialize;
    
	//开启报表生成进度条显示
//	ReportViewer.Report.ShowProgressUI = true;
	
    //启动运行
    ReportViewer.Start();
}

function OnCustomerInitialize()
{
    //载入子报表数据
	CustomerReport.LoadDataFromURL("{xmlCustomer}");
}

function OnProductInitialize()
{
    //载入子报表数据
	ProductReport.LoadDataFromURL("{xmlProductList}");
}

function OnTop10CustomerInitialize()
{
    //载入子报表数据
	Top10CustomerReport.LoadDataFromURL("{xmlTop10Customer}");
}

function OnTop10ProductInitialize()
{
    //载入子报表数据
	Top10ProductReport.LoadDataFromURL("{xmlTop10Product}");
}
	</script>

    <style type="text/css">
        html,body {
            margin:0;
            height:100%;
        }
    </style>
</head>
<body style="margin:0" onload="window_onload()">
    <script type="text/javascript"> 
	    CreatePrintViewerEx("100%", "100%", "files/4a.grf", "", false, "");
    </script>
</body>

Delphi中Main单元的代码:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
  uniGUIClasses, uniGUIRegClasses, uniGUIForm, Data.DB, Datasnap.DBClient,
  uniToolBar, uniGUIBaseClasses, uniPanel, uniHTMLFrame, uniURLFrame;

type
  TMainForm = class(TUniForm)
    UniToolBar1: TUniToolBar;
    btnClose: TUniToolButton;
    cdsCDS1: TClientDataSet;
    UniURLFrame1: TUniURLFrame;
    procedure UniFormCreate(Sender: TObject);
    procedure UniFormAjaxEvent(Sender: TComponent; EventName: string;
      Params: TStrings);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private declarations }
  public
    procedure ReplaceTags;
    { Public declarations }
  end;

function MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  uniGUIVars, MainModule, uniGUIApplication;

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


procedure TMainForm.btnCloseClick(Sender: TObject);
begin
  UniMainModule.Terminate;
end;

procedure TMainForm.ReplaceTags;
var
  S, Sc : string;
begin
  S:=UniURLFrame1.HTML.Text;

  Sc:=UniSession.CallbackUrl('subReportData', Self, ['RES', 'xmlCustomer']);
  S:=StringReplace(S, '{xmlCustomer}', Sc, []);

  Sc:=UniSession.CallbackUrl('subReportData', Self, ['RES', 'xmlProductList']);
  S:=StringReplace(S, '{xmlProductList}', Sc, []);

  Sc:=UniSession.CallbackUrl('subReportData', Self, ['RES', 'xmlTop10Product']);
  S:=StringReplace(S, '{xmlTop10Product}', Sc, []);


  Sc:=UniSession.CallbackUrl('subReportData', Self, ['RES', 'xmlTop10Customer']);
  S:=StringReplace(S, '{xmlTop10Customer}', Sc, []);


  UniURLFrame1.HTML.Text:=S;


end;

procedure TMainForm.UniFormAjaxEvent(Sender: TComponent; EventName: string;
  Params: TStrings);
var
  st:TStringList;
begin
  if EventName='subReportData' then   //定义的子报表数据回调事件
  begin
     if Params.Values['RES']='xmlCustomer' then  //根据Res参数判断是哪一个子报表请求数据
     begin
        try

          st := TStringList.Create;
          st.LoadFromFile(ExtractFilePath(Application.ExeName)+'data\xmlCustomer.xml');
          UniSession.AResponse.ContentText := st.Text;
        finally
          st.Free;
        end;
     end;

     if Params.Values['RES']='xmlProductList' then
     begin
        try
          st := TStringList.Create;
          st.LoadFromFile(ExtractFilePath(Application.ExeName)+'data\xmlProductList.xml');
          UniSession.AResponse.ContentText := st.Text;
        finally
          st.Free;
        end;
     end;

     if Params.Values['RES']='xmlTop10Product' then
     begin
        try
          st := TStringList.Create;
          st.LoadFromFile(ExtractFilePath(Application.ExeName)+'data\xmlTop10Product.xml');
          UniSession.AResponse.ContentText := st.Text;
        finally
          st.Free;
        end;
     end;


     if Params.Values['RES']='xmlTop10Customer' then
     begin
        try
          st := TStringList.Create;
          st.LoadFromFile(ExtractFilePath(Application.ExeName)+'data\xmlTop10Customer.xml');//可以修改为实时生成的报表支持的xml格式的文本也行
          UniSession.AResponse.ContentText := st.Text;
        finally
          st.Free;
        end;
     end;

  end;



end;

procedure TMainForm.UniFormCreate(Sender: TObject);
begin
  Self.ReplaceTags;
end;

initialization
  RegisterAppFormClass(TMainForm);

end.


锐浪报表显示(含子报表)

到时候直接赋值给 (1)数据库连接字符串 (2)查询语句 (3)有子报表参照工艺用水的,这个有两个子报表public GridppReport Report = new GridppReport...
  • rund11
  • rund11
  • 2015年06月04日 10:52
  • 2507

DevExpress_Report 主从报表绑定数据,分页打印

 首先新建一个XtraReport类。根据需要设计报表页面布局;

实现动态统计报表,表头是调用数据库中的字段显示出来的。

最近在项目中有这个需求,因此做了出来,分享给大家。 一、目的:实现动态统计报表,表头是调用数据库中的字段显示出来的。 二、实现效果: 其中:收入类、虚列收入、转移收入、多列收...

VB中调用VC++开发的DLL

转自:http://lanshanlhy.blog.163.com/blog/static/302294762010112832031218/ 再谈在VB中调用VC++开发的DLL  再谈...

UniGUI使用报表Grid++Repor的方法之一(静态调用)

Grid++report是一款国产报表控件/插件,非常优秀,下载地址:http://www.rubylong.cn/,这款控件可以在delphi的Unigui框架中实现完美报表打印及展示。 我们通过...

UniGUI使用报表Grid++Repor的方法之二(动态调用)

UniGui中使用Grid++Report报表控件主要是通过TUniHTMLFrame控件中嵌入HTML代码来进行调用,我们可以直接在delphi中动态修改这个HTML代码来实现不同数据源及报表模板的...

Lazarus 中使用Grid++Report报表控件 的简单例子

Grid++Report安装到Lazarus后,Grid++Report的查询显示器,打印预览器,报表主对象和报表设计器的的相关命令要通过OleServer来具体调用。除此之外,使用方法与在Delph...

Grid++Report报表控件免费版

  • 2010年09月04日 15:24
  • 4.62MB
  • 下载

Lazarus 中安装Grid++Report报表控件

Grid++Report是非常优秀的国产报表控件,相对其他报表控件而言,Grid++Report具中文文档和非常全面的例子程序,,前只在Delphi,易语言中用过,今天尝试在Lazarus中使用,毕竟...

Grid++Report报表控件 V4.0.0.3

  • 2016年07月12日 13:43
  • 4.17MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UniGui中使用Grid++Report报表控件子报表获取数据的方法
举报原因:
原因补充:

(最多只允许输入30个字)