C# DevExpress实现销售报表按商品分组单独打印发票咨询
实现按商品分组拆分打印发票方案
需求背景
销售开单打印时需按商品所属分组批次拆分发票:同一Group_ID下的商品打印在同一张发票,不同分组商品单独生成独立发票。例:6件商品分属3个分组时,最终输出3张发票,每张仅包含对应分组的商品。
现有代码问题
- 一次性拉取订单全量商品传入报表,未做分组拆分
- 遍历数据网格时的判断逻辑
DgvSale.Rows[i].Cells[6].Value == DgvSale.Rows[i].Cells[6].Value为恒成立无效逻辑,无实际分组/过滤作用 - 仅生成1次报表实例,无法实现分单打印效果
改造实现(最小改动版,无需修改现有报表模板)
核心逻辑:查询全量数据后按Group_ID分组,每个分组单独生成报表实例绑定数据、执行打印。
改造后完整代码如下:
int id = Convert.ToInt32(txtID.Text); DataTable tblAllSale = new DataTable(); string sql = @"SELECT [Order_ID] as 'رقم الفاتورة',talb_ID as 'طلب',[Cust_Name] as 'اسم العميل',Products.Pro_Name as 'المنتج',Products.Group_ID as 'قسم',Products_Group.Group_Name as 'اسم القسم',[Sales_Detalis].[Qty] as 'الكمية',[Price] as 'السعر',[User_Name] as 'الكاشير',[Date] as 'التاريخ',[Unit] as 'الوحدة',[Sales_Detalis].Tax_Value as 'الضريبة',Price_Tax as 'السعر بعد الضريبة',[typetalab] as 'نوع الطلب',[priceservic] as 'خدمة',[shiftname] as 'شيفت',notes as 'ملاحظات',shiftnum as 'شيفت رقم' FROM [dbo].[Sales_Detalis] INNER JOIN Products ON Products.Pro_ID = Sales_Detalis.Pro_ID INNER JOIN Products_Group ON Products.Group_ID = Products_Group.Group_ID WHERE Order_ID = {0} ORDER BY Products.Group_ID ASC"; if (Properties.Settings.Default.SalePrintKind == "8CM") { // 1. 查询当前订单所有商品数据 string commandText = String.Format(sql, id); tblAllSale = db.readData(commandText, ""); if (tblAllSale.Rows.Count == 0) return; // 2. 按分组ID(قسم字段)拆分数据,需提前引用System.Data.DataSetExtensions var groupList = tblAllSale.AsEnumerable() .GroupBy(row => row.Field<int>("قسم")) .ToList(); // 3. 遍历每个分组,单独生成发票打印 foreach (var group in groupList) { DataTable tblGroup = group.CopyToDataTable(); devOrderSales2 rpt = new devOrderSales2() { DataSource = tblGroup, DataMember = "OrderSales2" }; rpt.DataSource = tblGroup; rpt.Parameters["ID1"].Value = id; rpt.PrinterName = Properties.Settings.Default.PrinterNameSteker; rpt.xrTableCell8.Visible = true; if (Properties.Settings.Default.saleprintauto == "0") { rpt.Print(); } else if (Properties.Settings.Default.saleprintauto == "1") { rpt.ShowPreviewDialog(); } } }
可选优化方案(报表侧分组,无需循环生成实例)
如果使用的是DevExpress XtraReport报表组件,可直接在报表模板中配置实现分组分页,无需修改C#侧循环逻辑:
- 打开
devOrderSales2报表设计器,添加分组标头(GroupHeader) 带区 - 设置分组字段为
قسم(即Group_ID) - 将组页脚的
PageBreak属性设置为AfterBand,即每个分组结束后强制分页 - 代码侧直接绑定全量订单数据即可,打印时报表会自动按组分页,每个分组单独占1页,输出效果和分单打印一致。
该方案更适合需要一次性预览所有发票的场景,不会弹出多个预览窗口。
注意事项
- 原代码中手动遍历Dgv收集商品ID的逻辑存在冗余,直接通过Order_ID关联查询即可避免漏数
- 自动打印场景建议增加200-500ms的打印延迟,避免多份报表连续发送到打印机时出现队列拥堵
- 若需要在发票上显示分组名称/分组批次号,可直接绑定查询结果中的
اسم القسم字段输出
内容的提问来源于stack exchange,提问作者mazentq
相关产品推荐
相关产品推荐

