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

SAP B1 DI API创建采购订单时ODBC-2028错误求助

解决SAP B1 DI API创建采购订单时的ODBC-2028错误

遇到ODBC-2028错误别慌,这个报错的核心是DI API尝试访问的某个主数据、配置记录或字段值在目标公司里压根不存在。结合你贴的代码,我帮你梳理几个最可能的排查方向:

1. 硬编码的ID在目标公司是否有效?

你的代码里写死了好几个ID值,这些在原公司能跑通,但换个公司大概率会出问题:

  • BO_item.Series = 13:去目标公司的【管理】→【系统初始化】→【文档编号】里看看,采购订单的编号系列(Series)有没有ID为13的?
  • BO_item.SalesPersonCode = 4:编号4的销售人员在目标公司的业务伙伴主数据里存在吗?
  • BO_item.TransportationCode = 1:目标公司配置了运输方式代码1吗?去【管理】→【设置】→【采购】→【运输方式】查一下。
  • BO_item.GroupNumber = 1:付款条款ID为1的记录在目标公司存在吗?检查路径是【管理】→【设置】→【业务伙伴】→【付款条款】。

这种硬编码ID的问题是跨公司部署插件的重灾区,建议别直接写死,要么通过DI API动态获取目标公司的对应ID,要么做个插件配置界面让用户自己选。

2. 业务伙伴和物料在目标公司真的存在吗?

  • 先确认传入的cardCode在目标公司是有效的供应商(得是勾选了【供应商】选项的业务伙伴,不能是客户)。
  • 再确认itemCode对应的物料在目标公司存在,而且是允许采购的类型(不能是仅销售的物料)。

你可以在代码里加个前置校验,提前排查这些主数据是否存在,避免走到Add()才报错:

// 校验供应商是否存在
var bp = (SAPbobsCOM.BusinessPartners)getCompany().GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);
if (!bp.GetByKey(cardCode))
{
    SAPbouiCOM.Framework.Application.SBO_Application.StatusBar.SetText($"错误:供应商{cardCode}不存在", SAPbouiCOM.BoMessageTime.bmt_Long, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
    return;
}

// 校验物料是否存在
var item = (SAPbobsCOM.Items)getCompany().GetBusinessObject(SAPbobsCOM.BoObjectTypes.oItems);
if (!item.GetByKey(itemCode))
{
    SAPbouiCOM.Framework.Application.SBO_Application.StatusBar.SetText($"错误:物料{itemCode}不存在", SAPbouiCOM.BoMessageTime.bmt_Long, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
    return;
}

3. 用户自定义字段在目标公司有没有创建?

代码里用到了两个自定义字段:

  • 行项目的U_SatisSip
  • 抬头的U_SatSip

得确认这两个字段在目标公司的采购订单里已经创建,而且字段名称完全一致(SAP B1的自定义字段名称是区分大小写的,别写错了)。你可以去【自定义工具】→【用户定义字段 - 管理】里,找到采购订单(Documents - oPurchaseOrders)的抬头和行项目,检查这两个字段是否存在。

4. 日期格式处理会不会有问题?

你对releaseDate做了字符串拆分转换,不过建议用更稳妥的方式解析日期,避免目标公司系统日期格式不同导致的问题:

// 假设传入的releaseDate是yyyyMMdd格式的字符串
DateTime releaseDt = DateTime.ParseExact(releaseDate, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
BO_item.Lines.ShipDate = releaseDt;
BO_item.DocDueDate = releaseDt;

5. 其他小细节排查

  • 确认getCompany()返回的是目标公司的有效连接,别一不小心连回原公司了。
  • 看看BO_item.AgentCode = null和BO_item.PaymentMethod = null在目标公司是否允许为空,有些配置下这些字段可能是必填的。

最后,建议你在报错时把关键参数也打出来,比如当前用的CardCode、ItemCode、Series这些,这样排查起来更快:

if (retVal != 0) {
    getCompany().GetLastError(out errorCode, out errMsg);
    SAPbouiCOM.Framework.Application.SBO_Application.StatusBar.SetText($"创建采购订单失败:{errMsg} | 供应商:{cardCode} | 物料:{itemCode} | 系列:13", SAPbouiCOM.BoMessageTime.bmt_Long, SAPbouiCOM.BoStatusBarMessageType.smt_Error);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:53