504385214 发表于 2018-8-28 21:25:35

设计时数据源转运行时数据源

本帖最后由 Lenka.Guo 于 2018-8-29 09:42 编辑

rdl报表,用设计器做设计时数据源,可预览。。然后在通过程序读取PageReport后,怎么转换为运行时数据源,比如读取文件里面的sql语句通过后台查询数据并赋值到报表。
就是报表模板是设计时数据源,但是展示的时候我想转行为运行是数据源,通过后台把模板转行?不知可行不。

运用场景就是设计时在哪儿都可以设计,但是运行的时候可能是公网,就没办法把数据库映射出去。

Lenka.Guo 发表于 2018-8-29 09:40:48

可以试试,在生成PageReport 对象后,
1. 将报表的dataProvider 更换成DataSetProvider。2. 在 LocateDataSource 中为报表返回数据

代码
var rptPath = new FileInfo(@"..\..\Invoice2.rdlx");
                        var definition = new PageReport(rptPath);
            definition.Report.DataSources.ConnectionProperties.DataProvider = "DATASET";

                        definition.Document.LocateDataSource += new LocateDataSourceEventHandler(OnLocateDataSource);

        void OnLocateDataSource(object sender, LocateDataSourceEventArgs args)
                {
                        args.Data = LoadData();
                }

504385214 发表于 2018-8-29 11:33:52

本帖最后由 504385214 于 2018-8-29 11:58 编辑

Lenka.Guo 发表于 2018-8-29 09:40
可以试试,在生成PageReport 对象后,
1. 将报表的dataProvider 更换成DataSetProvider。2. 在 LocateData ...
昨天弄出来了!!但是还有一些小问题!!比如我是多个数据集,已经每个数据集里面都有参数,怎么处理哇??
在OnLocateDataSource里面处理哇??
重点是参数处理。
有没有复杂全面点的例子哇

KearneyKang 发表于 2018-8-29 14:18:05

你是说你有多个数据集,并且每个数据集里都有参数的传递是吧。现在没有对应的demo。

但是你可以通过后台获取参数,如果不知道怎样后台获取参数,你可以参考如下博客:https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=48869&extra=page%3D1

504385214 发表于 2018-8-29 15:02:15

KearneyKang 发表于 2018-8-29 14:18
你是说你有多个数据集,并且每个数据集里都有参数的传递是吧。现在没有对应的demo。

但是你可以通过后台 ...


                /// <summary>
      /// 数据集
      /// </summary>
      static Dictionary<string, string> set = new Dictionary<string, string>();
               
                public static void ReportPrint_text(string djh)
      {
            set.Clear();

            PageReport pageReport = new PageReport(new System.IO.FileInfo(@"C:\Users\gong\Desktop\运行时数据源.rdlx"));
                       
            foreach (var item in pageReport.Report.DataSets)
            {
                set.Add(item.Name, item.Query.CommandText);
                item.Query.CommandText = null;
            }
            ///参数赋值
            pageReport.Report.ReportParameters.DefaultValue.Values.Add(djh);
            string yymc ="XXXX信息";
            pageReport.Report.ReportParameters.DefaultValue.Values.Add(yymc);


            ///更换数据类型及删除sql语句
            pageReport.Report.DataSources.ConnectionProperties.DataProvider = "DATASET";//更换数据类型为dataset
            pageReport.Report.DataSources.ConnectionProperties.ConnectString = null;
            pageReport.Report.ReportParameters.Clear();

         PageDocument pageDocument = new PageDocument(pageReport);
            pageDocument.LocateDataSource += new LocateDataSourceEventHandler(locatedata);

            pageDocument.Print(true, false, false);

      }

      private static void locatedata(object sender, LocateDataSourceEventArgs args)
      {
            foreach (var item in set)
            {
                if (args.DataSetName == item.Key)
                {
                  string sql = item.Value;
                  args.Data = returndata(sql);
                  if (args.Data == null)
                  {
                        MessageBox.Show("没有数据可打印!");
                        return;
                  }
                }
            }
      }
               
               private static object returndata(string sql)
      {
            DataTable dt = new DataTable();
            dt=///更近sql语句查询datatable结果
            return dt;
      }

上面代码要报错呢


大神帮忙完整下例子哇。sql语句里面如果有参数怎么处理。

KearneyKang 发表于 2018-8-29 17:28:13

你这是后台绑定动态数据源,参数的操作跟在数据库里的常规操作是一样的。没有特别之处啊

504385214 发表于 2018-8-29 17:57:48

KearneyKang 发表于 2018-8-29 17:28
你这是后台绑定动态数据源,参数的操作跟在数据库里的常规操作是一样的。没有特别之处啊

可以重构参数面板上面的查询报表按钮么?

KearneyKang 发表于 2018-8-30 15:01:58

你是先重现写一个查询按钮。然后通过点击该按钮,数据筛选完成后,再把筛选后的数据绑定给报表。这是完全可行的。报表只做一个战士,具体的数据筛选都是你自己通过按钮触发后来进行筛选

504385214 发表于 2018-9-1 17:57:10

KearneyKang 发表于 2018-8-30 15:01
你是先重现写一个查询按钮。然后通过点击该按钮,数据筛选完成后,再把筛选后的数据绑定给报表。这是完全可 ...

思路有了。
现在是侧边栏默认展开咋设置哇,还有侧边栏默认到参数面板咋设置哇

KearneyKang 发表于 2018-9-3 09:15:22

你是想侧边栏,一只展开,还是。

如果你的参数有默认值侧边栏是不默认显示的,如果侧边栏无值必须输入值,则侧边栏一只显示。


页: [1] 2
查看完整版本: 设计时数据源转运行时数据源