货品关系设置
适用范围:存货管理 → 组装拆卸 → 货品关系设置
内容:配方维护的标准操作流程、字段与可编辑性标准、系统行为标准、配方取用口径、常用提示速查
更新日期:2026-10-13
目录
1. 功能简介
货品关系设置用于维护**"一个货品由哪些物料、各用量多少组成"**的配方数据(即组装关系 / BOM)。它是整个组装拆卸体系的数据源头:
- 左边("表格"页)是组装的货品(成品,来源是物料档案中被标记为"组装物料"的货品);右边("构成明细"页)是被组装的物料(原料清单与用量)。
- 配方数据保存于货品关系表
GoodsRelate,按"成品 + 原料"唯一确定一行。 - 【货品组装】【货品拆卸】【批量组装】三类单据在选中成品时,都读取这份配方自动展开原料,无需逐单手工录入。
- 配方中的标准进价还用于成本上卷:【更新商品标准进价】会把"Σ(原料用量 × 原料标准进价)"回写为成品的标准进价。
本功能只维护"关系与用量",不做库存增减、不产生单据;库存与账务变化请在组装/拆卸单据中完成。
2. 菜单入口与界面总览
2.1 菜单入口
存货管理 → 组装拆卸 → 货品关系设置打开"货品关系设置"窗口(窗口标题即菜单名)。
2.2 界面结构
| 区域 | 内容 | 按钮 |
|---|---|---|
| 顶部工具栏 | 全局操作 | 【退出】【原料定位】【更新商品标准进价】 |
| 标题栏 | 显示当前选中的组合品名称 | — |
| 页签 "表格" | 组合品(成品)列表:货品编号、货品名称、是否不允许修改组装数量 | — |
| 页签 "构成明细" | 当前成品的原料清单(见第 4 章列定义),底部合计行显示进价金额、售价金额合计 | 【刷新价格】【复制组成】【粘贴组成】+ 记录导航器(首/尾/插入/删除/编辑/提交/取消) |
| 状态栏 | 修改人员、修改时间(当前明细行) | — |
界面右侧帮助栏原文提示:"左边的表格是组装的货品(来源是物料编码中是组装物料),右边是被组装的物料"。
2.3 左侧列表的取数范围(重要)
左侧只显示满足以下全部条件的货品:
| 条件 | 说明 |
|---|---|
fCombination = 1 | 货品档案中已标记为组装物料(组合品) |
fState = 0 | 未停用 |
fWorkType = 0 | 非加工类型 |
未删除(SignDelete <> 1) | 未作废删除 |
fIndustry = 当前行业 | 与当前登录业务行业一致 |
结论:某货品在本界面看不到,请先到【物料编码 / 货品档案】把它设为"组装物料"并确认行业、状态正确——本界面不提供新建成品的功能。
3. 标准操作流程
流程总览:
① 档案设组合品 → ② 选中成品 → ③ 添加原料 → ④ 录入用量
→ ⑤ 刷新价格 → ⑥(可选)复用配方 → ⑦(定期)更新商品标准进价步骤 ① 确认成品已是"组装物料"
在货品档案将成品标记为组装物料(fCombination=1),否则不会出现在左侧列表,也无法在组装单中被选中。
步骤 ② 选中成品
- 在**"表格"**页单击目标货品行(点击单元格即切换到该货品的明细并进入编辑态);
- 或点击【原料定位】:先输原材料名称→选中原料→再在"用了该原料的成品"中选中成品,系统自动定位到左侧行(用于"这个原料被哪些配方用到"的追查)。
步骤 ③ 添加原料(两种方式)
| 方式 | 操作 | 适用 |
|---|---|---|
| 逐行录入 | 记录导航器点【插入】→ 在"编号"列输入或选择物料 | 补一两行 |
| 批量导入 | 点"编号"列单元格的省略号按钮(…)→ 在物料查询窗口多选物料 → 确定 | 首次建配方 |
原料选择范围受【组装拆卸设置 → 是否允许所有物料组装】控制:
- 未勾选(默认):只能选
fLineType in (0,4,6) 且 fCombination = 0的货品,即普通商品/原材料,不能选组合品(防止配方嵌套); - 已勾选:放开限制,所有物料均可作为原料(包括组合品,此时需自行保证不形成循环关系)。
选定原料后,系统自动带出编号、名称、基础单位、标准进价、标准售价,并记录修改人员 = 当前登录操作员、修改时间 = 服务器时间。
步骤 ④ 录入用量(唯一必录项)
在"数量"列填写生产 1 个成品所需该原料的数量(以该原料的基础单位计)。
操作纪律(强制):新增行、【粘贴组成】得到的行,数量都默认为空(0),系统不会拦截、不会提示。数量留 0 会导致组装单展开出 0 用量行、原料不出库而成品全额入库,成本严重失真。每行录入完毕后按回车离开当前行即已保存到
GoodsRelate。
步骤 ⑤ 刷新价格
点击【刷新价格】,确认"确认刷新组合价格模式?"后,系统按物料档案的最新标准进价 / 标准售价更新当前成品的所有配方行,并刷新金额合计。
步骤 ⑥ 复用已有组装配方(复制 / 粘贴组成)
- 选中已有配方的成品,点【复制组成】;
- 切换到目标成品,点【粘贴组成】,确认"复制之前的组成吗?";
- 系统只追加"目标成品中尚不存在"的原料行(同物料已存在则跳过),随后自动调用一次【刷新价格】(会弹出"确认刷新组合价格模式?",需点"是");
- 必须逐行补录数量(见步骤 ④ 纪律)。
复制内容仅保存在本次打开的窗口内存中,关闭窗口后即失效,不能跨会话、跨机器使用。
步骤 ⑦ 更新商品标准进价(成本上卷)
点击顶部【更新商品标准进价】,确认"确认更新商品最新进价"后,系统依次执行:
- 关系检查(等待窗"检查商品拆卸关系是否正确"):遍历全部组合品做递归展开,发现循环关系即抛错中止(见第 8 章);
- 成本上卷:把每个组合品的"Σ(原料用量 × 原料标准进价)"回写为该组合品在物料档案中的标准进价(汇总为 0 的货品不更新)。
影响范围是整个账套的全部组合品,不只当前选中行。该操作应在配方与原料进价都稳定后执行(建议每日/每次调价后一次),不要在配方做到一半时执行。
保存与退出
- 明细为逐行即时保存(每行提交即写入
GoodsRelate),没有"整单保存"按钮; - 编辑某一行的过程中切换到其他货品,该行未提交的修改会被丢弃;
- 切换页签、关闭窗口时系统自动提交主表编辑内容。
4. 字段与可编辑性标准
4.1 "构成明细"页列定义
| 列标题 | 字段 | 可编辑 | 是否存入 GoodsRelate | 说明 |
|---|---|---|---|---|
| 编号 | fMaterielNo | 是(选料 / 省略号批量导入) | 否(存 fMaterielID) | 原料编号;点省略号=批量导入 |
| 名称 | fMaterielName | 否(只读) | 否 | 随编号自动带出 |
| 基础单位 | fBaseUnit | 否(只读) | 否 | 取原料档案基础单位,配方中不单独保存 |
| 数量 | fQuantity | 是 | 是 | 必录,单位=原料基础单位 |
| 标准进价 | fPurchaseSprice | 否(只读) | 是 | 只能由【刷新价格】从原料档案取得 |
| 标准售价 | fSaleSprice | 否(只读) | 是 | 同上 |
| 进价金额 | fPurMoney | 否(计算列) | 否 | = 数量 × 标准进价,底部合计 |
| 售价金额 | fSaleMoney | 否(计算列) | 否 | = 数量 × 标准售价,底部合计 |
隐藏定位字段:fGoodsID(成品,新增行自动取当前选中货品)、fMaterielID(原料)、ChangeMan / ChangeDate(修改人员 / 修改时间)。
写库定位规则:以 fGoodsID + fMaterielID 作为一行的唯一标识(PrimeFields)。
4.2 "表格"页列定义
| 列标题 | 字段 | 可编辑 | 说明 |
|---|---|---|---|
| 货品编号 | fMaterielNo | 否(只读) | — |
| 货品名称 | fMaterielname | 否(只读) | — |
| 是否不允许修改组装数量 | fIsEditQty | 是 | 写回货品档案 PCode_Materiel.fIsEditQty 的标识位 |
关于该标识位的现状说明:经本模块代码核查,组装单 / 拆卸单中"数量列是否可改"实际由 【组装拆卸设置 → 是否允许修改组装数量】(全局开关,默认允许)统一控制,单据逻辑中未读取每个货品的
fIsEditQty。因此当前请按全局开关管理;若业务需要"按单个货品锁定数量",请向开发提出接通该标志的需求,不要误认为勾选后即生效。
5. 行为标准(系统保证)
| 标准项 | 系统行为 |
|---|---|
| 配方为单层 | 单据展开只读取本成品的直接原料清单,不递归展开下层配方。若 A=B+C、B=D+E,则组装 A 只展开 B(得到 B、C 两行),D、E 不会出现。 |
| 嵌套需自行分步 | 含半成品(原料本身是组合品)的生产,需先组装半成品、再组装成品,分两张单据完成;系统不会自动展开到最底层。 |
| 循环关系检测 | 【更新商品标准进价】前对全部组合品递归展开,检测到"A→B→A"等循环时报错并列出循环链,中止本次更新。 |
| 无配方不阻塞 | 成品被选中时若配方为空,单据不报错,该货品按散装称重方式录入(组合品且无配方行的判定)。 |
| 逐行即时写库 | 明细行提交即写入 GoodsRelate,无需手工"保存";行编辑中切换货品则丢弃该行未提交修改。 |
| 单价不可手工改 | 配方行的标准进价 / 售价在界面上只读,只能通过【刷新价格】取自原料档案,保证配方价格与档案一致。 |
| 计算列不写库 | 编号、名称、外文名、基础单位、进价金额、售价金额均登记为"非 SQL 字段",不会试图写入 GoodsRelate。 |
| 操作留痕 | 添加/更换原料行时记录当前登录操作员与服务器日期,在状态栏"修改人员 / 修改时间"显示(仅"改数量"不会更新此留痕)。 |
| 只读保护 | 当明细网格或数据集处于只读(权限控制)时,禁止修改并提示"只读状态不允许修改!"。 |
| 重复原料行不合并 | 同一原料可被重复添加成两行(仅【粘贴组成】会跳过已存在物料)。同一原料不要重复录入,否则单据会展开两行、用量翻倍。 |
6. 配方如何被单据取用
三类下游(货品组装单、货品拆卸单、批量组装向导)取用口径完全一致:
取数: select * from GoodsRelate where fGoodsID = 选中的成品
展开: 配方有 N 行 → 单据明细生成 N 行(行号按配方顺序 1..N)
用量: 单据数量 fBillQty = fDoQty = 配方 fQuantity × 单据表头成品数量
单位量:fDoOneQty = fFinishQty = 配方 fQuantity(生产 1 个成品的用量,拆卸成本分摊按此分摊)
价格: 取配方行/原料档案价格,组装入库成本按记账规则(默认移动加权成本)计算要点:
- 配方改动不会自动回写已生成的单据:需要让已生成单据反映新配方,须在该单据中重新选择一次成品(重选会先删除该单已有明细行再按新配方重建,手工加的行会被清除,请重新补录)。
- 批量组装向导在"输入批量组装"页按同一份配方展开原料,可在【被组装信息汇总】页核对用量与领料仓库库存后再生效。
7. 价格维护标准
| 操作 | 作用范围 | 数据流向 | 用途 |
|---|---|---|---|
| 【刷新价格】 | 当前成品的全部配方行 | 原料档案标准进价/售价 → GoodsRelate | 原料调价后同步配方上的价格快照 |
| 【更新商品标准进价】 | 账套内全部组合品 | Σ(配方用量 × 原料标准进价) → 成品档案 PCode_Materiel.fPurchaseSprice | 让组合品的标准进价反映配方成本 |
执行标准顺序(不可颠倒):
原料档案价格维护到位 → 【刷新价格】逐成品同步配方价 → (全部配方就绪后)【更新商品标准进价】- 先刷配方价再上卷,否则上卷用的是旧配方价,成品进价偏低/偏高;
- 配方尚不完整的半成品不要参与上卷(该步是全站执行,无法只算一个货品);
- 上卷汇总为 0 的货品不会被改写(保留原进价)。
8. 提示信息速查表
| 提示信息 | 出现时机 | 含义与处理 |
|---|---|---|
| "请输入原材料名称:" | 点【原料定位】 | 输入原料名称/编号片段以反查用到它的成品 |
| "只读状态不允许修改!" | 只读时点"编号"列省略号 | 当前权限或状态不允许维护配方,联系主管授权 |
| "确认刷新组合价格模式?" | 点【刷新价格】 | 确认后按原料档案覆盖当前成品配方行价格 |
| "复制之前的组成吗?" | 点【粘贴组成】 | 确认把已复制的原料清单追加到当前成品;粘贴后必须补录数量 |
| "确认更新商品最新进价" | 点【更新商品标准进价】 | 该操作影响全部组合品,确认前先完成配方与价格维护 |
| (等待窗)"检查商品拆卸关系是否正确" | 上卷第一步 | 正在递归检查循环关系 |
| (等待窗)"更新商品最新进价" | 上卷第二步 | 正在回写成品标准进价 |
| "更新商品最新进价成功" | 上卷完成 | 正常完成 |
| "异常:发现商品拆卸关系循环 …" | 检查到循环 | 提示中列出循环链(带"| 循环"标记者即为闭环),必须删除造成循环的那条配方行后重试 |
| "更新组装产品成本失败!原因:…" | 上卷 SQL 出错 | 记录原因并反馈系统管理员(同时写入系统错误日志) |
9. 常见问题(FAQ)
Q1:为什么我要维护的货品在左边列表里找不到?
它还不是"组装物料",或已停用 / 为加工类型 / 已作废删除 / 与当前登录行业不一致。先到货品档案修正(见 2.3 条件表)。
Q2:为什么选原料时搜不到某个物料?
默认只允许选"普通商品/原材料且非组合品"。若确实需要把它作为原料(例如半成品套料),请到【组装拆卸设置】勾选"是否允许所有物料组装"。开启后系统不再阻止你形成循环配方,请务必用【更新商品标准进价】做一次关系检查。
Q3:新增了一行但数量忘了填,会怎样?
系统不拦截、不提示,保存下来用量为 0。后果是组装单展开出 0 用量行:原料不消耗、成品却全额入库,成本虚增。必须以"数量非空非 0"为交验标准自查。
Q4:能不能只配一层,让系统自动把半成品再往下拆?
不能。配方展开是单层的(见第 5 章)。半成品必须先单独组装入库,再作为原料参与上层成品的组装。
Q5:改了配方数量,之前生成的组装单会跟着变吗?
不会。已生成单据需重新选择成品才会按新配方重建明细,且重建会清掉该单已有明细行(包括手工加的行)。
Q6:同一个原料不小心加了两行怎么办?
选中多余那一行,用记录导航器【删除】提交即可。系统不会自动合并重复行,重复行会导致用量翻倍。
Q7:A 组装成 B,B 又能组装回 A,界面没拦住?
维护时不拦(避免误伤),检查发生在【更新商品标准进价】的关系检查步骤,会以"发现商品拆卸关系循环"报错并列出循环链。请作为月度必做检查项执行。
Q8:配方里的进价能不能手工改?
不能,界面上为只读。价格统一由原料档案维护后用【刷新价格】带入,以保证配方与档案口径一致。
Q9:【复制组成】【粘贴组成】能把配方复制到另一台机器 / 明天再用吗?
不能。复制内容仅存于本次窗口内存,关闭窗口即失效。跨成品可用,跨会话需重新复制。
10. 按钮与操作速查
| 按钮 | 位置 | 作用 | 备注 |
|---|---|---|---|
| 【原料定位】 | 顶部工具栏 | 由原料反查并定位到用到它的成品 | 两步选择:先原料、后成品 |
| 【更新商品标准进价】 | 顶部工具栏 | 关系循环检查 + 全站组合品成本上卷 | 影响全账套,按第 7 章顺序执行 |
| 【刷新价格】 | 构成明细页 | 当前成品配方行价格 ← 原料档案最新价 | 有确认框 |
| 【复制组成】 | 构成明细页 | 记住当前成品的原料清单 | 仅存内存 |
| 【粘贴组成】 | 构成明细页 | 把清单追加到当前成品,跳过已有物料,随后弹出【刷新价格】确认框 | 粘贴后须补录数量 |
| 导航器【插入】 | 构成明细页 | 新增一个空原料行 | 编号、数量都要填 |
| 导航器【删除】 | 构成明细页 | 删除当前原料行(配方去掉该料) | 即时写库 |
| 导航器【编辑】/【提交】 | 构成明细页 | 进入 / 确认当前行修改(如改数量) | 提交即写 GoodsRelate |
| 导航器【取消】 | 构成明细页 | 放弃当前行未提交的修改 | — |
| "编号"列 … 按钮 | 构成明细页 | 批量多选物料一次加入配方 | 只读状态下会提示不允许修改 |
| 页签"表格"/"构成明细" | 内容区 | 成品清单 / 当前成品的原料清单 | 切换时自动提交主表编辑 |
变更记录
| 日期 | 说明 |
|---|---|
| 2026-10-13 | 首次整理为在线标准;同日随 P0 修复(【原料定位】后明细未随成品重开、导致编辑落到错误货品)核对界面与取数口径 |
