Quincy 发表于 2024-11-3 15:02:24

【ActiveReports18】RDLX主从表结构报表如何显示并多页打印?

例如,我当前有出库单如下:



我当前代码如下:
public async Task<DataTable> LoadData(LocateDataSourceArgs args)
{
      //取值,URL传参,多个参数需要使用&进行分割
      var urlParamStr = (object[])args.ReportParameters.Value;

      var dic = ReportHelper.StringToDictionary(urlParamStr.ToString());

      string id = dic["id"].ToString();

      DataTable dt = new DataTable();

      var _context = _outboundOrderRepository.DbContext;

      if (args.DataSet.Query.DataSourceName == "DataSource1")
      {
                if (args.DataSet.Name == "DataSet1")
                {
                        dt.Columns.Add("出库开单单号");
                        dt.Columns.Add("开单日期");
                        dt.Columns.Add("制单人");
                        dt.Columns.Add("制单日期");
                        dt.Columns.Add("出库人");
                        dt.Columns.Add("出库部门");
                        dt.Columns.Add("备注");
                        dt.Columns.Add("审核人");
                        dt.Columns.Add("审核时间");
                        var orderInfo = await _context.Queryable<Xb_OutboundOrder>().Where(x => x.OutboundOrderId == Convert.ToInt64(id)).FirstOrDefaultAsync();

                        if (orderInfo == null) return dt;

                        var lxUserInfo = await _context.Queryable<Sys_UserInfo>().Where(x => x.User_Id == orderInfo.AuditId).FirstOrDefaultAsync();

                        var zdUserInfo = await _context.Queryable<Sys_UserInfo>().Where(x => x.User_Id == orderInfo.CreateID).FirstOrDefaultAsync();

                        string deptmentName = string.Empty;
                        if (orderInfo.DepartmentId.HasValue)
                        {
                              var deptmentInfo = await _context.Queryable<Sys_Department>().Where(x => x.DepartmentId.ToString() == orderInfo.DepartmentId.Value.ToString()).FirstOrDefaultAsync();
                              deptmentName = deptmentInfo?.DepartmentName;
                        }

                        var ckUserInfo = await _context.Queryable<Sys_UserInfo>().Where(x => x.User_Id == orderInfo.WarehouseKeeper).FirstOrDefaultAsync();

                        dt.Rows.Add(orderInfo.Number, orderInfo.InvoiceDate,
                              zdUserInfo?.UserTrueName, orderInfo.CreateDate, ckUserInfo?.UserTrueName, deptmentName, orderInfo.Remarks,
                              lxUserInfo?.UserTrueName, orderInfo.AuditDate);

                }
                else if (args.DataSet.Name == "DataSet2")
                {
                        dt.Columns.Add("货品名称");
                        dt.Columns.Add("货品编号");
                        dt.Columns.Add("型号");
                        dt.Columns.Add("规格");
                        dt.Columns.Add("单位");
                        dt.Columns.Add("仓库");
                        dt.Columns.Add("库位");
                        dt.Columns.Add("批次");
                        dt.Columns.Add("数量");
                        dt.Columns.Add("单价");
                        dt.Columns.Add("总金额");
                        dt.Columns.Add("自定义1");
                        dt.Columns.Add("自定义2");
                        dt.Columns.Add("自定义3");
                        dt.Columns.Add("品牌");
                        dt.Columns.Add("生产日期");
                        dt.Columns.Add("过期日期");
            dt.Columns.Add("仓库编号");
            dt.Columns.Add("库位编号");
            dt.Columns.Add("备注");
            var orderItemList = await _context.Queryable<Xb_OutboundOrderItem>().Where(x => x.OutboundOrderId == Convert.ToInt64(id)).OrderByDescending(x => x.Id).ToListAsync();

                        if (!orderItemList.Any()) return dt;

                        foreach (var orderItem in orderItemList)
                        {
                              var productInfo = await _context.Queryable<Xb_Product>().Where(x => x.Id == orderItem.ProductId).FirstOrDefaultAsync();

                              var warehouseInfo = await _context.Queryable<Xb_Warehouse>().Where(x => x.Id == orderItem.WarehouseId).FirstOrDefaultAsync();

                              var warehouseLocationInfo = await _context.Queryable<Xb_WarehouseLocation>().Where(x => x.Id == orderItem.WarehouseLocationId).FirstOrDefaultAsync();

                              dt.Rows.Add(productInfo?.Name, productInfo?.Number, productInfo?.Model,
                                        productInfo?.Specifications, productInfo?.Unit, warehouseInfo?.Name, warehouseLocationInfo?.Name,
                                        orderItem.Batch, orderItem.Quantity, orderItem.Price, orderItem.Quantity * orderItem.Price,
                                        productInfo?.Custom1, productInfo?.Custom2, productInfo?.Custom3, productInfo?.Brand,
                                        orderItem.ProductionDate, orderItem.ExpirationDate, warehouseInfo?.Number, warehouseLocationInfo?.Number, orderItem?.Remarks);
                        }


                }

      }

      return dt;

}

现在我需要打印多页,要如何实现?

Felix.Li 发表于 2024-11-3 15:02:25

本帖最后由 Felix.Li 于 2024-11-4 10:15 编辑

您好,主从报表的多页打印,不需要在数据层面做处理。只需要报表设计改成每个主表的分组换页即可。
具体如下:
1.添加主表表格。根据主表分组条件进行分组:


并添加分组换,介于每页换页:

这样报表就会根据你的数据主表的分组条件,每个分组显示一页,这一页显示完后就会自动换页,然后咱们在这个表格的分组行里面设计嵌套的子表格即可。
这是简单的分组换页Demo:

Quincy 发表于 2024-11-4 11:10:50

Felix.Li 发表于 2024-11-4 10:07
您好,主从报表的多页打印,不需要在数据层面做处理。只需要报表设计改成每个主表的分组换页即可。
具体如 ...

我现在用列表可以实现分页的功能,但是为什么只会触发数据集dataset1,不会触发dataset2,我换个模版又可以

Quincy 发表于 2024-11-4 11:12:34

如图

Bella.Yuan 发表于 2024-11-4 14:10:03

Quincy 发表于 2024-11-4 11:12
如图

您好,看您使用的是运行时数据源,您检查一下对应的报表设计是否和您代码中的一致,看您回复切换模版后可以正常显示,您可以对比一下2个报表模板。我看您代码中是DataSource下有个DataSet1和DateSet2,您看看您报表模板中是否也是对应的,也可以打断点来一一查看一下。
页: [1]
查看完整版本: 【ActiveReports18】RDLX主从表结构报表如何显示并多页打印?