You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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#侧循环逻辑:

  1. 打开devOrderSales2报表设计器,添加分组标头(GroupHeader) 带区
  2. 设置分组字段为قسم(即Group_ID)
  3. 将组页脚的PageBreak属性设置为AfterBand,即每个分组结束后强制分页
  4. 代码侧直接绑定全量订单数据即可,打印时报表会自动按组分页,每个分组单独占1页,输出效果和分单打印一致。
    该方案更适合需要一次性预览所有发票的场景,不会弹出多个预览窗口。

注意事项

  • 原代码中手动遍历Dgv收集商品ID的逻辑存在冗余,直接通过Order_ID关联查询即可避免漏数
  • 自动打印场景建议增加200-500ms的打印延迟,避免多份报表连续发送到打印机时出现队列拥堵
  • 若需要在发票上显示分组名称/分组批次号,可直接绑定查询结果中的اسم القسم字段输出

内容的提问来源于stack exchange,提问作者mazentq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:21:29