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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:46:30