这两天实际排查的对象,分成 5 类:
半成品收发存原表
YDM_BC_INITIAL / YDM_BC_INLIST / YDM_BC_OUTLIST
半成品中间表
CX_YDM_BC_INITIAL / CX_YDM_BC_INLIST / CX_YDM_BC_OUTLIST
成品收发存原表
YDM_ZC_INITIAL / YDM_ZC_INLIST / YDM_ZC_OUTLIST / YDM_ZC_STOCKTAKINGLIST
成品中间表
CX_YDM_ZC_INITIAL / CX_YDM_ZC_INLIST / CX_YDM_ZC_OUTLIST
月报与接口
HOT_PRODUCTION_MES_RZHOT_PRODUCTION_MES_JGQCM_ZG_JUGDE_APPLYCX_TO_MES_LOGYDM_ZC_BILL_M / YDM_ZC_BILL_C / YDM_ZC_LOADVEHICLE_MAT这 5 类对象里,最容易混淆的是:
YDM_*:更像“当前业务真实源头”CX_*:更像“给校验/接口/月报使用的结果表”DataValidationResult:只是某一时点的校验快照,不代表当前库里实时值所以排查时第一原则是:
永远先分清“是原表错了,还是 CX 表错了,还是校验结果只是旧快照”。
最常用的判断公式是:
本月期初 = 上月期初 + 上月入库 - 上月出库 (+ 调差)
其中:
半成品常用:
YDM_BC_INITIALYDM_BC_INLISTYDM_BC_OUTLIST成品常用:
YDM_ZC_INITIALYDM_ZC_INLISTYDM_ZC_OUTLISTYDM_ZC_STOCKTAKINGLIST月报不是直接跟“成品量”比,而是要先明确过程口径。
这次已经确认过一类典型问题:
PROD_WEIGHTPROD_WEIGHT - NVL(LC_WEIGHT, 0)所以月报类问题第二原则是:
先确认“月报值的生成公式”,再谈是不是对不上。
后面再遇到类似问题,建议固定按下面 8 步走。
先看报错来自哪里:
DataValidationResult这一步的目的,是避免把“汇总口径问题”误当成“明细错误”。
先按物料或全口径聚合,确认差多少。
例如:
202601 -> 202602 成品只差 0.020t202603 -> 202604 成品差 2支 / 3.969t这一步只回答一个问题:
到底是“大面积错”,还是“少数几条炉号造成的总差”。
总额确认后,一定要立刻切到炉号级。
因为物料级报错里,常见会混进:
这些问题在物料级看起来像“差了很多”,但炉号级一拆就能分出:
每个异常炉号至少要看 2 套数据:
原表
YDM_*
中间表
CX_*
这一步的目的是把问题分型成:
这一类在这次排查里占比很高。
表现形式通常是:
如果炉号本身是平的,只是物料变了,那通常不应该按“库存错误”处理,而应该按:
改判说明
这次也遇到过非常典型的重复灌数:
CX 里被插了 4 次这种问题最明显的特征是:
CX 里出现多条这个很重要。
不是所有问题都该改原表。
判断规则:
CXCX修完至少做 3 次复核:
下面把这两天碰到的典型问题,按类型整理。
涉及炉号:
A26010132A26010135A26010139C26010317问题表现:
2026-01 期末和 2026-02 期初对不上202602 的 YDM_BC_INITIAL 被写成了“上月入库量”例如:
A26010132
1支 / 1.48吨64支 / 97.188吨最终处理:
202602 的 YDM_BC_INITIAL202601 -> 202602 -> 202603 -> 202604经验结论:
如果某月期初恰好等于上月某类入库,而不是上月期末,优先怀疑期初生成逻辑错把“入库承接”当成“结存承接”。
TQ9618310507410B涉及炉号:
A26010109A26010113A26010120A26010132A26010135A26010139C26010317问题表现:
CX_YDM_BC_* 里还是旧数据check_material_balance 或 DataValidationResult 继续报错处理方式:
CX 按当前原表同步经验结论:
先看“现在的原表”是不是已经对了,再决定要不要动源表。很多时候问题只是结果表没刷新。
TQ0218312001410B涉及炉号:
A25070249A25070271A25080210原表应有:
A25070249:1支 / 1.305吨A25070271:1支 / 1.646吨A25080210:2支 / 3.213吨CX_YDM_BC_OUTLIST 实际却是每条 4 次:
A25070249:4行 / 4支 / 5.220吨A25070271:4行 / 4支 / 6.584吨A25080210:4行 / 8支 / 12.852吨处理方式:
经验结论:
同一炉号、同一月份、同一数量重量重复出现时,不要先怀疑业务,先怀疑 CX 持久化被重复执行。
TQ9618310507410B 与 TQ9618312007410B表现:
2026-02 在 TQ9618312007410B2026-03 期初挂到了 TQ9618310507410B这类问题在物料级会表现为:
但炉号级看是平的,只是物料变了。
这种情况更适合:
TD0719312307411B涉及炉号:
C26010494历史 CX 快照里:
TD0719312307411B 表面剩 5支 / 12.618吨TQ5612412301411B 出库 5支 / 12.618吨这就是典型“同炉号跨物料改判”。
经验结论:
只要同一炉号跨物料迁移且炉号级自平,优先归类为改判,不要急着补期初。
A22070051问题:
202601 期末到 202602 期初只差 0.020吨最后处理:
YDM_ZC_STOCKTAKINGLIST 补了一条 202601 调差-0.02533.8x24.5TB8818212001411C涉及炉号:
A25050280原始情况:
1支 / 2.258吨-1支 / -2.095吨0支 / 0.163吨 尾重处理方式:
-2.095 -> -2.258经验结论:
只差零点几吨、支数为 0 的,优先按尾重处理。
A25100221、A25100033表现:
202603 没有期初、没有入库800806 负出库红冲例如:
A25100221
2026-03 出现 800806 = -1支 / -2.265吨1支 / 2.265吨202604 期初没承接A25100033
202602 本来已清零202603 又有 800806 = -1支 / -1.704吨1支 / 1.704吨202604 也没承接经验结论:
没有期初、没有入库,不代表不可能有库存。只要有负出库红冲,就可能把历史库存冲回来。
TQ4577615272411B / C26030094问题:
2026-03 该有 24支 / 23.233吨CX_YDM_BC_INLIST 里只有 12支 / 11.393吨后来追到原表发现:
12条 / 11.84吨 被挂在了 202604202603处理方式:
YDM_BC_INLIST 那 12 条的 BAL_YEAR_MONTH
202604 -> 202603CX处理后:
72.86772.867经验结论:
如果差值能完整在相邻月份找到,优先怀疑 BAL_YEAR_MONTH 挂错,而不是重量算错。
TQ9618310507203B问题表:
HOT_PRODUCTION_MES_JGMES_CX_JG_ZXNEW_HAND异常表现:
mate_weight 只有 2~3吨prod_weight 却有 90~125吨steel_waste 被算成 3900%根因:
mate_weight = sum(qcm.input_weight) + 接箍重量G 工序记录里,QCM_ZG_JUGDE_APPLY.INPUT_WEIGHT 大量为 0后来按你的业务逻辑核定:
前一道工序的成品量 = 下一道工序的投料量
示例:
A24120546
D 工序合计:
ACT_COUNT = 76ACT_WEIGHT = 94.992G 工序当前:
ACT_COUNT = 76ACT_WEIGHT = 99.307INPUT_WEIGHT = 0所以应补:
G.INPUT_WEIGHT = 94.992对应月报重算:
MATE_WEIGHT = 2.509MATE_WEIGHT = 94.992 + 2.509 = 97.501STEEL_WASTE = 3958.0311STEEL_WASTE = 101.8523最后处理:
QCM_ZG_JUGDE_APPLYHOT_PRODUCTION_MES_JG经验结论:
月报“来料重量很离谱”时,不要直接改结果表,先追来源公式。
KHFT260325016日志顺序:
GetYdmZcBillDateBillRevokeGetYdmZcBillDate另外核到:
GetYdmZcBillDate 的 SOCKET_PARMERplanStartTime / planEndTime 外,其余完全一致同时还发现:
BillClose 传参里的炉号和库里的 JUDGE_STOVE_NO 对不上YDM_ZC_BILL_C.LOADVEHICLE_FLAG 还有 14 支没同步成已装车经验结论:
接口问题一定要同时看:接口日志、主表、明细表、装车表、代码匹配字段。只看一张表很容易误判。
后面再碰到问题,可以直接按下面判断。
满足以下任一:
CX 重复插入CX 漏同步满足以下任一:
满足以下任一:
后面你自己核某个问题,可以直接照这个顺序:
先写下问题对象
物料、合同、月份、报错内容
先做月度总额对账
期初 + 入库 - 出库 (+ 调差) = 期末
再拆到炉号
找出差异是哪些炉号造成的
同时查原表和 CX
判断是以下哪类:
CX 未同步决定处理方式:
CX修完后复核:
下面不是最终 SQL,只是核对时最常用的模式。
select *
from ydm_bc_inlist t
where t.bal_year_month = '202603'
and t.material_no = '物料编码';
select *
from ydm_bc_outlist t
where t.bal_year_month = '202603'
and t.material_no = '物料编码';
select 'INITIAL' src, t.bal_year_month, t.material_no, t.judge_stove_no,
t.act_count, t.act_weight
from ydm_bc_initial t
where t.judge_stove_no = '炉号'
union all
select 'INLIST', t.bal_year_month, t.material_no, t.judge_stove_no,
t.act_count, t.act_weight
from ydm_bc_inlist t
where t.judge_stove_no = '炉号'
union all
select 'OUTLIST', t.bal_year_month, t.material_no, t.judge_stove_no,
t.act_count, t.act_weight
from ydm_bc_outlist t
where t.judge_stove_no = '炉号';
做法不是只比汇总,而是至少比:
如果汇总一样但明细不一样,后面还是会炸。
最后把这两天最有用的结论压成几句话,后面很好用。
先看炉号,再看物料。
很多“物料不连续”,其实是炉号改判。
先看原表,再看 CX。
很多问题只是结果表旧了,不是源头错了。
尾差优先看调差和红冲。
尤其是 0支 非0吨,十有八九不是正常库存。
月报不要直接拿结果说话。
先搞清楚是从哪张判定表、按什么公式写出来的。
接口问题一定要串日志、代码、数据库。
只看其中一块,很容易得出错结论。
截至当前,这几类仍然属于“后续可以继续排查”的方向:
当前库里完全没有、但外部说有的数据
例如某些销售结算接口物料
月报有值、原表当前查不到来源的数据
例如曾遇到的 TQ5612510601412B
改判链跨了多个月、当前只剩历史快照的数据
这类问题的共同点是:
不能只靠当前原表,还要追历史快照、过程、接口源表。
这两天所有问题,归根到底都是下面几类:
CX 没同步CX 重复插入只要后面排查时固定坚持:
先总额、再炉号、再原表/CX 对照、最后再决定改数据还是出说明
大多数问题都能很快定位清楚。