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
相关产品推荐
相关产品推荐

