C#字段变更循环:SAP按供应商生成新单据问题求助
解决方案
下面是修改后的代码,实现按供应商分组生成SAP采购询价单(OPQT),当供应商变更时自动创建新单据:
int recordCount = oRecordset.RecordCount; if (recordCount <= 0) { application.MessageBox("无记录可处理"); return; } application.MessageBox("开始添加采购询价单"); System.Threading.Thread.Sleep(2000); // 原代码的2毫秒几乎无延迟,这里改成2秒更合理 string currentSupplier = string.Empty; SAPbobsCOM.Documents currentOPQT = null; // 确保记录集定位到第一条 oRecordset.MoveFirst(); for (int i = 0; i < recordCount; i++) { // 读取当前记录的字段值 string supplier = oRecordset.Fields.Item(1).Value.ToString().Trim(); string item = oRecordset.Fields.Item(0).Value.ToString().Trim(); int qty = Convert.ToInt32(oRecordset.Fields.Item(3).Value); // 供应商变更或首次创建单据时,先保存旧单据再新建 if (supplier != currentSupplier || currentOPQT == null) { // 保存上一个供应商的单据(如果存在) if (currentOPQT != null) { int addResult = currentOPQT.Add(); if (addResult != 0) { application.MessageBox($"供应商 {currentSupplier} 的单据保存失败,错误码:{addResult}"); } else { application.MessageBox($"供应商 {currentSupplier} 的单据已添加"); } // 释放COM对象避免内存泄漏 System.Runtime.InteropServices.Marshal.ReleaseComObject(currentOPQT); } // 初始化新的采购询价单 currentOPQT = (SAPbobsCOM.Documents)application.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oPurchaseQuotations); currentOPQT.CardCode = supplier; currentOPQT.DocDate = DateTime.Now; currentOPQT.DocDueDate = DateTime.Now; currentOPQT.RequiredDate = DateTime.Now; // 修正原代码的拼写错误:Requried → Required currentSupplier = supplier; } // 添加当前记录为明细行 currentOPQT.Lines.ItemCode = item; currentOPQT.Lines.RequiredQuantity = qty; currentOPQT.Lines.Add(); // 移动到下一条记录 oRecordset.MoveNext(); } // 处理最后一个供应商的单据 if (currentOPQT != null) { int finalResult = currentOPQT.Add(); if (finalResult != 0) { application.MessageBox($"最后一个供应商 {currentSupplier} 的单据保存失败,错误码:{finalResult}"); } else { application.MessageBox($"最后一个供应商 {currentSupplier} 的单据已添加"); } System.Runtime.InteropServices.Marshal.ReleaseComObject(currentOPQT); } application.MessageBox("所有单据处理完成");
关键修改说明
- 字段读取逻辑:把供应商、商品、数量的读取移到循环内部,确保每次循环获取当前记录的正确数据
- 供应商分组判断:用
currentSupplier跟踪当前处理的供应商,变更时自动切换新单据 - COM对象管理:SAP业务对象是COM类型,使用后必须释放,避免内存泄漏
- 错误提示:增加单据保存结果的判断,方便排查异常
- 拼写修正:原代码的
RequriedDate是拼写错误,修正为SAP标准属性名RequiredDate
内容的提问来源于stack exchange,提问作者MattW
相关产品推荐
相关产品推荐

