程式資訊
- 程式 ID:
FILLRATE - 所屬子系統:E.營業收款
- 狀態:stable
達成率(客戶達成率)¶
功能簡介¶
「達成率」用來逐月統計每一天的訂單達交情形:以某個年度月份為單位,把當月每一張訂單明細的指定交期(ETA)對上實際出貨記錄,算出該日有多少張訂單、其中有多少張因為未交清或延遲而算作「未達成」。建立並計算後,畫面下方會列出該月 1 號到月底的每一天,方便業務/業務主管以月報的方式檢視客戶端的準交狀況,並逐日填寫原因留存。
這支表單在流程上的位置是:銷售訂單 出貨完成後的事後績效統計——它不影響訂單或出貨,只讀取訂單與出貨記錄做達交分析。
「達成率」是一份逐月存檔的單據,不是即查即丟的報表
與一般查詢報表不同,本功能會把「年度月份+每日訂單件數/未達成件數/原因」存成一張單據(單號自動為「公司代碼+類別+年度月份」)。你可以日後再叫出同一個月份的單據,逐日補填或修改原因。
前置需求¶
- 權限:E.訂單 →
E-190 達成率的瀏覽/修改權限。 - 基礎資料:計算結果完全取自下列資料,請先確認已維護——
| 資料 | 影響什麼 |
|---|---|
| 銷售訂單(含明細指定交期、受訂日期) | 每日訂單件數的來源;指交日期決定該筆落在哪一天 |
| 出貨/交易記錄(出貨轉檔,對應 ORDETLPKID 的明細交貨量) | 完納日期、交貨量——判斷訂單是否交清、是否延遲 |
全域參數 5001(客戶急單天數) |
判定「急單」的天數門檻;未設定或 ≤0 時系統預設 5 天 |
急單天數來自全域參數,不是表單欄位
系統用 U_Prgpar("5001") 取「客戶急單天數」。指定交期與受訂日期相差在此天數(含)以內者標為急單。此參數在全域參數設定維護,本表單上看不到也改不了。
操作步驟¶
達成率是「先建單 → 計算 → 補原因 → 存檔」的流程。
一、新增當月達成率單¶
- 從主選單開啟 E.訂單 → 達成率。
- 點工具列
新增。系統自動帶入:- 類別=
C(客戶)。 - 公司代碼=
1。
- 類別=
- 在 年度月份 輸入要統計的月份,格式
yyyy/MM(例2024/03)。這是唯一必填、且決定整張單的關鍵欄位。 - 視需要填 備註。
二、執行計算¶
- 在新增(或修改)狀態下,按條件列右側的
Query(計算)鈕。 - 系統先檢查 年度月份 是否為合法年月(會試組成
年度月份/01解析);格式錯誤會跳「請輸入正確的日期格式」並中止。 -
通過後系統呼叫達交統計,把該月每一天展開成一列(1 號到月底,依當月實際天數),並填入:
- 訂單件數:當天(依指定交期)有幾張訂單明細。
- 未達成件數:當天訂單中被判定為延交的張數。
在『新增』狀態下計算才會自動鋪滿整月日期
只有當狀態為
新增時,系統會先為當月每一天補上一列空白資料再填數字。若你在修改既有單後按計算,系統只會更新已存在日期列的件數,不會重鋪日期。
三、逐日補原因後存檔¶
- 在下方格線逐列檢視 訂單件數/未達成件數,於 原因 欄填寫該日未達成的說明(原因欄可編輯)。
- 按工具列
儲存。存檔時系統會:- 再次檢查 年度月份 不可空白、且必須是合法年月。
- 自動把 單據日期 設為
年度月份/01。
詳細的每欄連動、計算規則請見欄位連動與附加功能。
欄位說明¶
主檔(單頭)¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 單號(Document No) | — | 唯讀,系統產生。VFP 規則為「公司代碼+類別首字+年度月份」 |
| 年度月份(Year And Month) | 是 | 格式 yyyy/MM;計算與存檔皆以此為準 |
| 類別(Category) | 是 | C=客戶、S=廠商;新增預設 C(目前 C# 僅實作客戶端計算) |
| 公司代碼(Company Code) | 是 | 新增預設 1 |
| 備註(Notes) | — | 自由文字,最長 80 字 |
| 建檔日期(Created Date) | — | 唯讀,系統產生 |
| 異動日期(Edit Date) | — | 唯讀,系統紀錄最後異動時間 |
明細(每日格線)¶
| 欄位 | 可編輯 | 說明 |
|---|---|---|
| 日期(Date) | — | 該月某一天,格式 yyyy/MM/dd;計算時自動產生整月日期 |
| 訂單件數(Order Count) | — | 該日(依指定交期)的訂單明細張數,數字 0 顯示為空白樣式 |
| 未達成件數(Unfulfilled Count) | — | 該日訂單中被判為延交的張數 |
| 原因(Reason) | ✔ | 由使用者填寫的未達成原因,最長 60 字 |
| 備註(Notes) | ✔ | 該日補充說明,最長 60 字 |
欄位連動與附加功能¶
這一節說明「按某鈕、輸入某欄位後系統實際會做什麼」,全部來自程式碼(FillrateViewModel / CustomerFillRateBll / FillrateSave 與 VFP fillrate.prg)。
新增時的預設值(AfterAddNew)¶
當你按 新增,系統會:
- 把 類別 設為
C(客戶)。 - 把 公司代碼 設為
1。 - 清空下方每日明細格線。
對應 VFP
addagain:REPLACE 類別 WITH 'C',公司代碼 WITH USER公司代碼。
按 Query(計算)時系統做的事¶
- 年月檢核:先把 年度月份 試著解析成
年度月份/01;不合法就跳「請輸入正確的日期格式」並停止。 - 抓訂單與出貨:呼叫
DARB_QRY_ORMAST(參數7+ 年度月份)一次取回兩張表——當月訂單明細與其對應的出貨交易明細。 - 逐筆判定每張訂單的達交狀態(核心演算法,依訂單明細主鍵
ORDETLPKID配對出貨):- 急單判定:若
指定交期 − 受訂日期 ≤ 急單天數(參數 5001,預設 5),該筆標記為急單;否則若原備註含「完納」則保留為「完納」。 - 完納日期 / 交貨量:把該訂單所有出貨交易的交易日期取最大值當完納日期、數量累加為交貨量。
- 是否交清:
- 若
交貨量 ≥ 訂貨量→ 未納量 = 0;若完納日期 ≤ 指定交期則延納日數 = 0,否則延納日數 =完納日期 − 指定交期(日曆天)。 - 若
交貨量 < 訂貨量→ 未納量 =訂貨量 − 交貨量,清空完納日期,延納日數 =今天 − 指定交期。
- 若
- 延交旗標:只要
未納量 > 0或延納日數 > 3(客戶延納基準天數,固定 3 天),這張訂單就算延交(未達成)。
- 急單判定:若
- 彙總成每日件數:把所有訂單依指定交期(ETA)分組,每組的張數 = 該日訂單件數,其中延交張數 = 該日未達成件數。
- 鋪日期 / 回填:在
新增狀態下先為當月每一天(依DateTime.DaysInMonth算實際天數)建立一列,再把彙總數字對日期回填到格線。
達成率=(訂單件數 − 未達成件數)÷ 訂單件數
本表單存的是「件數」與「未達成件數」兩個原始數,達成率本身在報表端換算。某日沒有任何訂單時,訂單件數與未達成件數皆為 0。
計算進度提示¶
延交明細逐筆計算時,後端 CustomerFillRateBll 每處理 100 筆會發出一則「Fill Rate...N」進度事件(狀態欄顯示訊息),原意是在狀態列回報進度。
目前版本未把進度顯示到畫面
新版 FillrateViewModel 呼叫計算時並未訂閱此進度事件,因此這串進度訊息目前不會出現在狀態列;計算過程畫面不會即時更新。資料量大時請耐心等候,不要因畫面無回應而誤判當機。
存檔時的連動(FillrateSave)¶
按 儲存 時:
- 擋存檔(AllowSave):年度月份 空白會擋下並提示需輸入;年度月份不是合法年月(無法解析成
年度月份/01)也會擋下並提示「請輸入正確的日期格式」。 - 存檔前處理(HandleDataBeforeEndEdit):自動把 單據日期 設為
年度月份/01;若為修改狀態,將該筆列狀態標記為已修改(E)。
VFP
allowsave另外會在新增/複製時把 單號 組成「公司代碼+類別首字+年度月份」,並把「週六/週日且訂單件數為 0」或無效日期的明細列標記為刪除。
尚未提供的 VFP 功能(規劃中)¶
下列 VFP 既有行為在新版 C# 尚未實作,請勿當成可用功能
- 類別=S(廠商)達交:VFP 與新版同樣只實作
C(客戶)分支,廠商端達交統計請改用 廠商達交率(VENDORFILLRATE)。 - 修改時保留舊原因(保留日期):VFP 在「修改」重算時可輸入保留日期,讓該日期(含)以前的訂單件數/未達成件數/原因沿用上次結果。新版 C# 的計算未實作保留日期機制,重算會以最新資料覆寫。
- 計算後自動匯出 Excel/開啟:VFP 計算客戶分支時會把延交明細
COPY TO ...TMPFILLRATE.XLS並用 Excel 開啟。新版尚未提供此自動匯出。 - 列印(達成率報表):VFP 報表程式為
FILLRATE_P(對應FILLRATEPRINT),新版 ViewModel 尚未掛報表來源,目前無內建列印。
常見問題¶
按了計算,每日明細卻沒有鋪出整個月份的日期?
自動鋪滿整月日期只在「新增」狀態下計算才會發生。若你是叫出舊單按 修改 後再計算,系統只會更新已存在日期列的件數、不會重新鋪日期。要重做整月,請以新增方式重建該月份單據。
某天的訂單件數是 0,但我知道那天有訂單?
件數是依訂單明細的指定交期(ETA)歸日,不是受訂日或出貨日。請確認那批訂單明細的指定交期確實落在該日;指交日期空白或落在他月,就不會計入這一天。
明明已出貨,那張訂單還是被算成『未達成』?
延交判定有兩個條件,符合任一就算未達成:未納量 > 0(交貨量小於訂貨量,尚未交清),或延納日數 > 3 天(即使交清,但完納日期晚於指定交期超過 3 天)。請核對該訂單的交貨量是否等於訂貨量、以及最後一筆出貨交易日期是否晚於指交日期 3 天以上。
為什麼有些訂單顯示『急單』?這會影響達成率嗎?
當「指定交期 − 受訂日期 ≤ 急單天數」(全域參數 5001,預設 5 天)即標為急單。急單只是備註標記,不改變延交判定——急單若也未交清或延遲,一樣計入未達成件數。
存檔時被擋,提示要輸入年度月份或日期格式?
年度月份 是必填,且必須能組成合法年月(系統會試解析 年度月份/01)。請用 yyyy/MM 格式輸入正確月份(例 2024/03),不要留空或填成不存在的月份。
我要看廠商的達交率,這支表單查不到?
本表單只統計客戶端(類別 C)。廠商達交請改用採購模組的廠商達交率(VENDORFILLRATE)。
相關功能¶
- 銷售訂單 — 訂單件數與指定交期的來源
- 出貨通知單 — 完納日期、交貨量的來源
- 達成率主要計算邏輯 — 急單、延交、完納日期判定
- 廠商達交率(採購)
- 主管資訊(EIS) — 達成率統計與儀表板
- 全域參數設定(急單天數 5001)
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/E-SalesOrder/images/):
fillrate-step1.png— 新增後的單頭(年度月份/類別 C/公司代碼 1)fillrate-step2.png— 按Query計算後鋪滿整月的每日明細格線(含訂單件數/未達成件數)fillrate-step3.png— 逐日填寫「原因」欄並存檔的畫面