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

Posted westsoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UniGui中使用Grid++Report报表控件子报表获取数据的方法相关的知识,希望对你有一定的参考价值。

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地址。
---------------------
作者:shuiying
来源:CSDN
原文:https://blog.csdn.net/shuiying/article/details/49948667
版权声明:本文为博主原创文章,转载请附上博文链接!

 

<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>

--------------------- 
作者:shuiying 
来源:CSDN 
原文:https://blog.csdn.net/shuiying/article/details/49948667 
版权声明:本文为博主原创文章,转载请附上博文链接!

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)+dataxmlCustomer.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)+dataxmlProductList.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)+dataxmlTop10Product.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)+dataxmlTop10Customer.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.

--------------------- 
作者:shuiying 
来源:CSDN 
原文:https://blog.csdn.net/shuiying/article/details/49948667 
版权声明:本文为博主原创文章,转载请附上博文链接!

 










以上是关于UniGui中使用Grid++Report报表控件子报表获取数据的方法的主要内容,如果未能解决你的问题,请参考以下文章

在C#中,设计grid++report报表的具体步骤是啥??帮助文档感觉好乱,自己没有基础,求具体步骤

Grid++Report

Grid++Report实现Web报表

Java开发报表——Grid++Report 报表设计器

Grid++Report 数据填充教程

锐浪报表 Grid++Report 一维码无法固定条形码打印宽度