跳轉到

程式資訊

  • 程式 IDBOM_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,二擇一:

  1. 品號:以品號區間反查(預設,程式列舉 QueryType.SKU)。選此項時下方的 工程代號 欄位會自動鎖住(不可輸入)。
  2. 工程代號:以一張工程代號(製程) 底下的組件反查(QueryType.ProcessingCode)。選此項時 工程代號 欄位才會解鎖可輸入。

步驟② 輸入查詢範圍

  1. 查詢別為 品號 時,填 起始品號 ~ 截止品號
    • 兩欄都是品號搜尋框,可直接打字或按搜尋鈕挑品號。
    • 預設 起始品號 為空字串、截止品號zzz,等於「全部品號」。
  2. 查詢別為 工程代號 時,填 工程代號。系統會先找出掛在這個工程代號底下的所有組件,再以這些組件當作要反查的品號。

步驟③ 設定篩選條件(選填)

條件面板下方有四個勾選項,預設都不勾:

  1. 僅查詢最底階:只看「直接母件」這一層,不向上多階展開(詳見 欄位連動與附加功能)。
  2. 僅查詢成品:保留欄位,但目前查詢流程尚未套用此過濾(見 欄位連動與附加功能 的說明)。
  3. 含未來生效:把生效日期尚未到的 BOM 關係也納入反查。
  4. 篩選有用途:查詢後,主檔只留下真的有反查到母件的品號(有明細的列),把查無用途的品號隱藏。

步驟④ 執行查詢並檢視結果

  1. 按工具列的 查詢
  2. 上方主檔格線(查詢品號) 列出每個被查詢的品號及其品名、生產部門、停用、有明細。
  3. 點選上方任一列下方明細格線 即顯示「這個查詢品號被哪些母件/組件用到」的清單與彙總用量。
  4. 需要時按工具列的 列印(或格線匯出)輸出報表(見 欄位連動與附加功能)。

查詢條件面板

主從查詢結果

小技巧

改了任何條件後,直接再按一次 查詢 即可重算。上、下兩個 Telerik 格線都支援右鍵「匯出 Excel」。

欄位說明

查詢條件

欄位 必填 說明 / 格式 / 預設
查詢別 品號工程代號;預設 品號QueryType.SKU
起始品號 查詢別為 品號 時生效;預設空字串
截止品號 查詢別為 品號 時生效;預設 zzz(等於不設上限)
工程代號 查詢別為 工程代號 時才解鎖並生效;以此製程下的組件反查;預設空字串
僅查詢最底階 預設不勾;只反查直接母件、不多階展開
僅查詢成品 預設不勾;目前查詢流程尚未套用此過濾(見下方說明)
含未來生效 預設不勾;勾選時把未生效的 BOM 關係也納入
篩選有用途 預設不勾;查詢後只留有反查到母件的查詢品號

△ 條件必填

工程代號 只有在查詢別選 工程代號 時才需要、也才能輸入;選 品號 時此欄被鎖住。

主檔格線(查詢品號)

欄位 說明
查詢品號 被反查的品號(即條件區間/工程代號展開出來的品號清單)
品名 該品號的品名
生產部門 該品號在製程上的生產部門(取製程資料)
停用 該品號是否已停用
有明細 Y 表示這個品號反查到母件(即被別人用到);空白表示查無用途(綁定屬性 HaveDetail

明細格線(用途)

欄位 說明
查詢品號 對應上方選取的查詢品號
組件編號 用到查詢品號的母件/組件品號(即反查到的「用途」)
停用 該組件是否停用
品名 該組件品名
數量 查詢品號被該組件用到的彙總用量(多階時依各階用量×(1+損耗率)累乘後加總)
單位 用量單位
備料倉庫 BOM 設定的備料倉庫
生效日期 / 失效日期 該 BOM 用途關係的生效、失效日期
生產部門 該組件的生產部門
客戶 該組件對應的客戶簡稱(同一組件對多客戶時以逗號 , 串接)
產品別 該組件的品別說明(成品/半成品/原物料等,綁定屬性 顯示品別
零件編號 零件編號

欄位連動與附加功能

這一節把「輸入某欄位後會怎樣」「按某按鈕會做什麼」全部列出,來源是 Bom_purpConditionViewModelBom_purpViewModelBom_purpBll 的實際程式碼。

條件面板的連動

  • 查詢別 → 工程代號欄啟用狀態:當你把 查詢別 切到 工程代號Bom_purpConditionViewModel 會把 ProcessingCodeIsEnabled 設為 true,於是 工程代號 輸入框(綁 IsEnabled="{Binding ProcessingCodeIsEnabled}")解鎖;切回 品號 時又把它鎖住。所以「工程代號打不進去」通常是因為查詢別還停在 品號
  • 品號/工程代號搜尋框起始品號/截止品號/工程代號 三欄都是搜尋框(TsSearchTextBox),可直接輸入,也可按搜尋鈕跳出品號/工程代號挑選清單。三欄都設 UpdateSourceTrigger=LostFocus,所以是失焦時才把值寫回參數——打完字要 Tab 或點別處離開欄位,條件才會更新。

查詢 時系統做什麼(反查的核心邏輯)

查詢 會呼叫 Bom_purpViewModel.Query(),再進到 Bom_purpBll.Calculate(),流程如下:

  1. 組查詢條件
    • 查詢別=品號 → 條件是「品號 between 起始品號 and 截止品號」。
    • 查詢別=工程代號 → 條件是「品號 in(掛在該工程代號底下的所有組件)」,也就是先把製程(Proces JOIN Bom_m)展開成一組組件編號,再用這組組件當反查對象。
  2. 生效別:未勾 含未來生效 時傳 0(只取已生效);勾選時傳 1(連未生效的 BOM 關係一起抓)。
  3. 呼叫 SP:以上述條件、生效別、BOM 最大階數(BomParameter.BomMaxLevel,預設 20)呼叫後端預存程序 DARB_QRY_BOM_PROCES1,一次取回四組資料:候選品號清單(主檔)、BOM 明細、製程(生產部門)、客戶對應。
  4. 向上反查並彙總用量(未勾「僅查詢最底階」時,走 NormalCalculate):對每個查詢品號,系統用 BFS 逐層(最多 BomMaxLevel 層)往上找出所有用到它的母件,並把每一階的用量套 數量 ×(1+損耗率) 一路累乘,最後把同一個組件編號的多條路徑用量加總成一筆。彙總過程四捨五入到 BOM 預設精度(MathWrapper.RoundAwayFromZeroBomParameter.DecimalPlace)。
  5. 補上其他屬性SetOtherProperty):替每筆明細補上品別(PartCategory)、產品別說明(顯示品別)、停用、生產部門,以及對應的客戶簡稱(同一組件對多個客戶時以逗號串接);替主檔補上生產部門。
  6. 標記「有明細」:凡是有反查到母件的查詢品號,主檔的 有明細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/):

  1. bom_purp-step1.png — 條件面板(含查詢別、起訖品號/工程代號、四個勾選項)
  2. bom_purp-step2.png — 查詢結果主從格線(上方查詢品號、下方用途明細)