程式資訊
- 程式 ID:
BOM_PURP - 所屬子系統:D.工程資料
- 狀態:stable
BOM 用途查詢¶
功能簡介¶
「BOM 用途查詢」是一支 BOM 反查(where-used) 查詢報表,用來回答一個問題:「這個品號/零件,被哪些 BOM 用到?用了多少?」
一般 BOM 維護 是「由上而下」展開——給一個成品,看它由哪些組件構成;本表單則是 「由下而上」反查——給一個品號(或一段品號區間、一張工程代號),逐層往上找出所有以它為組件的母件,並把各層用量依損耗率累乘後彙總成單一筆總用量。
適合 BOM 工程師、生管、採購在以下情境使用:
- 某零件要停用或改版前,先確認它被哪些成品用到,評估影響範圍。
- 某物料漲價或缺料時,反查受影響的成品清單與用量。
- 確認一張工程代號(製程)底下的組件被哪些母件使用。
本表單是純查詢報表,不會異動任何 BOM 資料;查詢結果以「上方主檔(查詢品號)+下方明細(用途)」的主從格線呈現,並可列印/匯出。
前置需求¶
- 權限:D.BOM →
D-130 BOM 用途查詢的瀏覽權限;要列印需列印權限。 - 基礎資料:反查結果完全建立在 BOM 主檔與製程資料上,下列資料的維護狀況決定查得到什麼——
| 資料 | 影響的結果 |
|---|---|
| BOM 維護(組件結構、損耗率、生效/失效日期、備料倉庫、單位) | 反查能否找到母件、明細的數量/單位/備料倉庫/生效失效日期 |
| 製程資料 / 工程代號 | 以工程代號查詢時的篩選來源;主檔與明細的生產部門 |
| 品號主檔(品名、品別、停用、客戶) | 各列的品名/產品別/停用標記、明細的客戶欄 |
BOM 階數上限(BomParameter.BomMaxLevel,預設 20 階) |
反查向上展開的最大層數 |
備註
本表單讀取的是目前已維護的 BOM 結構。若某組件關係的生效日期尚未到,預設不會被反查到,需勾選 含未來生效(見 欄位連動與附加功能)。
操作步驟¶
本表單採「條件面板 + 工具列查詢」模式:在條件面板設好查詢條件,再按工具列的 查詢,結果顯示在主從格線。
步驟① 選擇查詢別¶
條件面板最上方有兩個 RadioButton,二擇一:
品號:以品號區間反查(預設,程式列舉QueryType.SKU)。選此項時下方的 工程代號 欄位會自動鎖住(不可輸入)。工程代號:以一張工程代號(製程) 底下的組件反查(QueryType.ProcessingCode)。選此項時 工程代號 欄位才會解鎖可輸入。
步驟② 輸入查詢範圍¶
- 查詢別為
品號時,填 起始品號 ~ 截止品號。- 兩欄都是品號搜尋框,可直接打字或按搜尋鈕挑品號。
- 預設 起始品號 為空字串、截止品號 為
zzz,等於「全部品號」。
- 查詢別為
工程代號時,填 工程代號。系統會先找出掛在這個工程代號底下的所有組件,再以這些組件當作要反查的品號。
步驟③ 設定篩選條件(選填)¶
條件面板下方有四個勾選項,預設都不勾:
- 僅查詢最底階:只看「直接母件」這一層,不向上多階展開(詳見 欄位連動與附加功能)。
- 僅查詢成品:保留欄位,但目前查詢流程尚未套用此過濾(見 欄位連動與附加功能 的說明)。
- 含未來生效:把生效日期尚未到的 BOM 關係也納入反查。
- 篩選有用途:查詢後,主檔只留下真的有反查到母件的品號(有明細的列),把查無用途的品號隱藏。
步驟④ 執行查詢並檢視結果¶
- 按工具列的
查詢。 - 上方主檔格線(查詢品號) 列出每個被查詢的品號及其品名、生產部門、停用、有明細。
- 點選上方任一列,下方明細格線 即顯示「這個查詢品號被哪些母件/組件用到」的清單與彙總用量。
- 需要時按工具列的
列印(或格線匯出)輸出報表(見 欄位連動與附加功能)。


小技巧
改了任何條件後,直接再按一次 查詢 即可重算。上、下兩個 Telerik 格線都支援右鍵「匯出 Excel」。
欄位說明¶
查詢條件¶
| 欄位 | 必填 | 說明 / 格式 / 預設 |
|---|---|---|
| 查詢別 | ✔ | 品號 或 工程代號;預設 品號(QueryType.SKU) |
| 起始品號 | — | 查詢別為 品號 時生效;預設空字串 |
| 截止品號 | — | 查詢別為 品號 時生效;預設 zzz(等於不設上限) |
| 工程代號 | △ | 查詢別為 工程代號 時才解鎖並生效;以此製程下的組件反查;預設空字串 |
| 僅查詢最底階 | — | 預設不勾;只反查直接母件、不多階展開 |
| 僅查詢成品 | — | 預設不勾;目前查詢流程尚未套用此過濾(見下方說明) |
| 含未來生效 | — | 預設不勾;勾選時把未生效的 BOM 關係也納入 |
| 篩選有用途 | — | 預設不勾;查詢後只留有反查到母件的查詢品號 |
△ 條件必填
工程代號 只有在查詢別選 工程代號 時才需要、也才能輸入;選 品號 時此欄被鎖住。
主檔格線(查詢品號)¶
| 欄位 | 說明 |
|---|---|
| 查詢品號 | 被反查的品號(即條件區間/工程代號展開出來的品號清單) |
| 品名 | 該品號的品名 |
| 生產部門 | 該品號在製程上的生產部門(取製程資料) |
| 停用 | 該品號是否已停用 |
| 有明細 | Y 表示這個品號有反查到母件(即被別人用到);空白表示查無用途(綁定屬性 HaveDetail) |
明細格線(用途)¶
| 欄位 | 說明 |
|---|---|
| 查詢品號 | 對應上方選取的查詢品號 |
| 組件編號 | 用到查詢品號的母件/組件品號(即反查到的「用途」) |
| 停用 | 該組件是否停用 |
| 品名 | 該組件品名 |
| 數量 | 查詢品號被該組件用到的彙總用量(多階時依各階用量×(1+損耗率)累乘後加總) |
| 單位 | 用量單位 |
| 備料倉庫 | BOM 設定的備料倉庫 |
| 生效日期 / 失效日期 | 該 BOM 用途關係的生效、失效日期 |
| 生產部門 | 該組件的生產部門 |
| 客戶 | 該組件對應的客戶簡稱(同一組件對多客戶時以逗號 , 串接) |
| 產品別 | 該組件的品別說明(成品/半成品/原物料等,綁定屬性 顯示品別) |
| 零件編號 | 零件編號 |
欄位連動與附加功能¶
這一節把「輸入某欄位後會怎樣」「按某按鈕會做什麼」全部列出,來源是 Bom_purpConditionViewModel、Bom_purpViewModel 與 Bom_purpBll 的實際程式碼。
條件面板的連動¶
- 查詢別 → 工程代號欄啟用狀態:當你把 查詢別 切到
工程代號,Bom_purpConditionViewModel會把ProcessingCodeIsEnabled設為true,於是 工程代號 輸入框(綁IsEnabled="{Binding ProcessingCodeIsEnabled}")解鎖;切回品號時又把它鎖住。所以「工程代號打不進去」通常是因為查詢別還停在品號。 - 品號/工程代號搜尋框:起始品號/截止品號/工程代號 三欄都是搜尋框(
TsSearchTextBox),可直接輸入,也可按搜尋鈕跳出品號/工程代號挑選清單。三欄都設UpdateSourceTrigger=LostFocus,所以是失焦時才把值寫回參數——打完字要 Tab 或點別處離開欄位,條件才會更新。
按 查詢 時系統做什麼(反查的核心邏輯)¶
按 查詢 會呼叫 Bom_purpViewModel.Query(),再進到 Bom_purpBll.Calculate(),流程如下:
- 組查詢條件:
- 查詢別=
品號→ 條件是「品號 between 起始品號 and 截止品號」。 - 查詢別=
工程代號→ 條件是「品號 in(掛在該工程代號底下的所有組件)」,也就是先把製程(ProcesJOINBom_m)展開成一組組件編號,再用這組組件當反查對象。
- 查詢別=
- 生效別:未勾 含未來生效 時傳
0(只取已生效);勾選時傳1(連未生效的 BOM 關係一起抓)。 - 呼叫 SP:以上述條件、生效別、BOM 最大階數(
BomParameter.BomMaxLevel,預設20)呼叫後端預存程序DARB_QRY_BOM_PROCES1,一次取回四組資料:候選品號清單(主檔)、BOM 明細、製程(生產部門)、客戶對應。 - 向上反查並彙總用量(未勾「僅查詢最底階」時,走
NormalCalculate):對每個查詢品號,系統用 BFS 逐層(最多BomMaxLevel層)往上找出所有用到它的母件,並把每一階的用量套數量 ×(1+損耗率)一路累乘,最後把同一個組件編號的多條路徑用量加總成一筆。彙總過程四捨五入到 BOM 預設精度(MathWrapper.RoundAwayFromZero,BomParameter.DecimalPlace)。 - 補上其他屬性(
SetOtherProperty):替每筆明細補上品別(PartCategory)、產品別說明(顯示品別)、停用、生產部門,以及對應的客戶簡稱(同一組件對多個客戶時以逗號串接);替主檔補上生產部門。 - 標記「有明細」:凡是有反查到母件的查詢品號,主檔的 有明細(
HaveDetail)欄會標Y。
「僅查詢最底階」的差異¶
- 不勾(預設,多階反查
NormalCalculate):對每個查詢品號做完整向上展開,把所有層級的母件全找出來,並做跨階用量累乘彙總。明細的 數量 是「該組件用到查詢品號的總用量」。 - 勾選(
OnlyBottomSKUCalculate):只取直接相鄰那一層的 BOM 關係,不再往上多階追,明細直接用 BOM 上設定的單階用量(l.數量)。適合只想看「直接母件」而不要整串用途鏈時使用。
「僅查詢成品」與「篩選有用途」¶
- 僅查詢成品:此勾選目前對畫面查詢結果沒有作用。BLL 那段「只保留品別=成品」的過濾,只寫在
Calculate(Twork_Qry_Bom_Proces1Result resultSet)這個供單元測試使用的多載裡;ViewModel 的Query()實際呼叫的是無參數的Calculate(),並未套用此過濾。因此勾或不勾,明細都會顯示全部用途(成品、半成品、原物料等)。 - 篩選有用途:在
Query()取回結果後,於 ViewModel 端把主檔過濾成HaveDetail == "Y"的查詢品號,等於把「查無任何用途」的品號從上方清單隱藏。注意這只影響顯示,不影響反查計算本身。
主從連動¶
- 選取上方主檔列 → 下方明細更新:點選上方任一查詢品號,
SelectedItem變更時以該品號為 key(detailLookup)取對應明細,下方明細格線立即換成該品號的用途清單。 - 若上方未選任何列(
SelectedItem為 null),下方明細會清成空白。
列印 / 報表¶
- 本表單的
HaveReportData()回傳true,因此工具列的 列印 可用,列印走系統共用的查詢報表列印流程(IPrintSource / FastReport),輸出目前查詢結果。 - 上、下兩個 Telerik 格線都可用格線右鍵 匯出 Excel。
本表單沒有新增/修改/刪除
BOM 用途查詢是唯讀查詢報表(兩個格線都 IsReadOnly="True"),不提供新增、修改、刪除、沖帳、轉傳票等異動動作。要改 BOM 結構請到 BOM 維護。
常見問題¶
工程代號欄位打不進去(灰色不可輸入)?
工程代號 只有在「查詢別」選 工程代號 時才會解鎖(ProcessingCodeIsEnabled)。請先把上方的查詢別從 品號 切到 工程代號,欄位就會啟用。
查出來主檔有品號,但下方明細是空的(有明細欄沒有 Y)?
代表這個品號沒有被任何母件用到(查無用途),或它的 BOM 用途關係尚未生效。可:1)勾 含未來生效 再查一次;2)確認該品號確實有出現在別的 BOM 的組件明細裡。若想直接把這類「查無用途」的品號隱藏,勾 篩選有用途。
我確定某零件有被用到,卻反查不到?
常見三個原因:1)BOM 用途關係的生效日期尚未到 → 勾 含未來生效;2)查詢別還停在 品號 但區間沒涵蓋到該品號 → 確認 起始品號 ~ 截止品號(預設截止 zzz 為全部);3)品號搜尋框是失焦才寫回值,打完字沒離開欄位就按查詢,條件可能還是舊的——打完先 Tab 一下再查。
明細的「數量」跟 BOM 上設定的用量對不起來?
未勾 僅查詢最底階 時,數量是多階彙總後的總用量,會把每一階的用量套 數量 ×(1+損耗率) 累乘加總,並四捨五入到 BOM 預設精度,因此通常會比單階用量大。若只想看單階用量,請勾 僅查詢最底階。
勾了「僅查詢成品」,明細還是出現半成品、原物料?
這是目前的已知行為——「僅查詢成品」的過濾只在供測試的多載裡實作,畫面實際走的 Calculate() 無參數版本不套用它,所以勾選不影響結果。詳見欄位連動與附加功能。
以「工程代號」查詢,結果好像把很多品號都查進來了?
查詢別=工程代號 時,系統是先把掛在該工程代號底下的所有組件展開成一組品號,再對這組品號逐一反查。所以一個工程代號可能對應多個組件、進而帶出多個查詢品號,屬正常行為。
相關功能¶
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/D-Bom/images/):
bom_purp-step1.png— 條件面板(含查詢別、起訖品號/工程代號、四個勾選項)bom_purp-step2.png— 查詢結果主從格線(上方查詢品號、下方用途明細)