如何对比SAP Business One中未结销售订单与BP主数据的地址?
在SAP Business One中实现BP主数据与未结订单地址校验的SQL关联方案
核心关联逻辑
通过**业务伙伴代码(CardCode)和地址类型(AddressType)**将两个数据集关联,确保对比的是同一BP的同一类地址(如送货地址/账单地址),再逐个字段校验一致性。
合并后的校验SQL查询
将你已有的两个查询合并为一个,直接筛选出地址字段不一致的未结订单记录:
-- 校验BP主数据地址与未结销售/交货订单地址的一致性 SELECT ord.CardCode AS 业务伙伴代码, ord.CardName AS 业务伙伴名称, ord.DocNum AS 订单编号, ord.DocType AS 单据类型, -- 标记具体不一致的字段 CASE WHEN ISNULL(bp.Street, '') <> ISNULL(ord.Street, '') THEN '街道' ELSE '' END AS 不一致字段, bp.ZipCode AS BP主数据邮编, ord.ZipCode AS 订单邮编, bp.Country AS BP主数据国家, ord.Country AS 订单国家 FROM -- 未结销售/交货订单地址数据集(替换为你的原有查询) ( -- 未结销售订单 SELECT T0.CardCode, T0.CardName, T0.DocNum, '销售订单' AS DocType, T0.Street, T0.ZipCode, T0.Country, T0.AddressType FROM ORDR T0 WHERE T0.DocStatus = 'O' UNION ALL -- 未结交货单 SELECT T0.CardCode, T0.CardName, T0.DocNum, '交货单' AS DocType, T0.Street, T0.ZipCode, T0.Country, T0.AddressType FROM ODLO T0 WHERE T0.DocStatus = 'O' ) ord -- 关联BP主数据对应类型的地址 INNER JOIN ( SELECT T0.CardCode, T1.Street, T1.ZipCode, T1.Country, T1.AddressType FROM OCRD T0 INNER JOIN CRD1 T1 ON T0.CardCode = T1.CardCode ) bp ON ord.CardCode = bp.CardCode AND ord.AddressType = bp.AddressType -- 筛选存在不一致的记录(处理空值避免误判) WHERE ISNULL(bp.Street, '') <> ISNULL(ord.Street, '') OR ISNULL(bp.ZipCode, '') <> ISNULL(ord.ZipCode, '') OR ISNULL(bp.Country, '') <> ISNULL(ord.Country, '')
关键说明
- 地址类型匹配:通过
AddressType关联,确保对比的是BP的送货地址和订单的送货地址,避免跨类型对比导致的错误。 - 空值处理:用
ISNULL将空值转为空字符串,防止空值与非空值对比时被误判为不一致(可根据实际业务调整)。 - 字段标记:通过
CASE语句明确指出哪个字段不一致,便于在B1验证提示中给出精准信息。
B1验证配置要点
- 在B1的验证规则中,将上述SQL作为校验查询,当查询返回结果时触发错误提示。
- 错误提示可动态引用查询字段,例如:
业务伙伴${业务伙伴代码}的订单${订单编号}的${不一致字段}与主数据不一致,请检查。
内容的提问来源于stack exchange,提问作者user12422846
相关产品推荐
相关产品推荐

