zoukankan      html  css  js  c++  java
  • 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 
    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    服务器的计时器的Interval最大能设置为多大?
    IE页面嵌入复杂WinForm控件不能正常激活
    自动升级组件居然把我那提供升级的站点目录整个删除了!
    自动升级失败,缺少System.resources.dll?
    字频分析结果出来了
    原来是2003 Server的问题
    一直这么渴望执着不一定能成功,只是活着就是执着
    模拟生态系统自己编写"生命"
    微软的Soap样例是错误的!
    对哈希表进行排序
  • 原文地址:https://www.cnblogs.com/westsoft/p/10381378.html
Copyright © 2011-2022 走看看