跳轉到

程式資訊

  • 程式 IDGPURCH
  • 所屬子系統:C.總務管理
  • 狀態:stable

G採購單(Purchase Order)

功能簡介

「G採購單」是總務模組的雜項採購單據,用來向廠商下單採購進貨用料或一般物料。一張採購單由主檔(一個廠商、一個訂購日期、一種幣別/匯率/收付條件)與多筆明細(每列一個品號/數量/單價/預訂交期)組成。

它的位置在採購流程的中段:上游可由G請購單請購轉採購Requisition To Purchasing)批次轉入產生,下游則由進貨單(G進貨單)依本採購單的明細收貨、累計已交數量。採購、總務人員平時就在這支表單維護廠商訂單,並透過列印輸出採購單給廠商。

與「採購單(PURCH)」的關係

本頁是總務模組的 G採購單(GPURCH,C-050),資料來源為 Twork_gen_vw_gpurch 系列。它與G 採購(Purchasing)模組下的採購單(PURCH)是兩支獨立程式,欄位與計稅邏輯雷同但資料表不同,請勿混用。

前置需求

  • 權限:C.總務 → C-050 G採購單 的新增/修改/刪除/查詢/列印權限。
  • 基礎資料:下列主檔須先維護,否則對應欄位無法帶出或存檔會被擋下——
資料 影響什麼
廠商主檔(SPDATA 廠商代號的有效性、自動帶出收付條件幣別
倉儲主檔(GSTKBAS) 倉儲代號驗證;存檔時倉儲代號不存在會被擋
收付條件主檔 主檔收付條件號與其說明
幣別/匯率資料 幣別的賣出匯率(採購日期當日),決定本幣金額換算
稅別主檔 主檔稅別對應的稅率,存檔時計算稅額
廠商報價(G採購報價 GSPPDT Price QueryBid 面板帶出的歷史/各廠商最新單價
個人參數 4001 新增時自動帶入的預設倉儲代號

操作步驟

新增採購單

  1. 按工具列 新增,系統自動帶入下列預設值(見欄位說明):採購別=1、匯率=1、幣別=本位幣、倉儲代號=個人參數 4001、公司代碼=1、採購日期=今天。
  2. Vendor Code(廠商代號) 輸入或以連結(KeyField 超連結可跳SPDATA)選廠商;輸入後系統自動帶出收付條件號/說明幣別(詳欄位連動與附加功能)。
  3. 視需要調整 Order Date(採購日期)Warehouse(倉儲代號)Currency(幣別)/Exchange Rate(匯率)Payment Term(收付條件)送貨地點Notes(採購備註)傳真日期
  4. 在下方明細格線逐列輸入:
    1. 品號(SKU,可用品號查詢欄帶出品名/單位)。
    2. 數量
    3. 單價(受 AllowViewPrice 權限控制是否顯示)。
    4. 預訂交期(新增列預設今天 +14 天)。
    5. 需求部門(必填,缺漏會擋存檔)。
  5. 儲存。存檔前系統會檢核廠商、日期、幣別、匯率、倉儲、每列預訂交期與需求部門,並重算主檔金額與稅額。

修改採購單

  1. 用工具列導覽鈕或查詢定位到要修改的採購單。
  2. 修改 進入編輯狀態。
  3. 已被進貨收料的明細列(已交數量 > 0)整列鎖定不可編輯(CanEdit=false),也不可刪除。
  4. 數量不得改到小於該列已交數量,否則該列出現紅字錯誤、存檔被擋。

刪除

  • 整張單刪除或單列刪除前,系統會檢查:已交數量 > 0 的明細列不可刪除;採購別為一般採購(1)時,數量為 0 或品號空白的列在存檔時會被自動標記刪除。

列印採購單

  1. 按工具列 列印,開啟採購單列印條件頁。
  2. 條件預設帶入目前這張單的採購單號起訖。
  3. 確認 Purchase Order No(採購單號)區間後輸出。

列印報表規劃中

目前 GpurchPrintViewModel 的報表產生邏輯(GetPrintSettings/取數)尚為保留(程式碼註解中),實際 PDF 報表輸出尚未提供。條件頁可開啟,但報表內容待後續接上 TWORK_RPT_GPURCH

由請購單轉入(延伸功能)

按工具列的延伸功能鈕(ExtendedFunction1),開啟請購轉採購視窗,挑選請購來源批次轉成採購單;轉檔完成後系統會自動導覽到新產生的採購單。詳見欄位連動與附加功能

欄位說明

主檔欄位

欄位 必填 說明/格式/預設
P.O.#(採購單號) 系統產生 唯讀,存檔時自動編號
Branch#(公司代碼) 新增預設 1
Vendor Code(廠商代號) 可連結 SPDATA;輸入後帶出收付條件/幣別
Vendor Name(廠商簡稱) 唯讀,依廠商代號帶出
Order Date(採購日期) ShortDate;新增預設今天
Warehouse(倉儲代號) 新增預設個人參數 4001;存檔驗證須存在於倉儲主檔
Currency(幣別) 新增預設本位幣;取採購日期當日賣出匯率
Exchange Rate(匯率) 新增預設 1;須 > 0,否則擋存檔
Payment Term(收付條件號) 依廠商帶出,可改
送貨地點 明細列送貨地點空白時,存檔自動以此帶入
Notes(採購備註) 最長 40 字
傳真日期 ShortDate
Status(結案) 系統產生 唯讀
Req No(請購單號) 系統產生 唯讀,來源請購單號
Total Qty(合計數量) 系統產生 唯讀,= 各明細數量加總
Total Amount(合計金額) 系統產生 唯讀,= 各明細原幣未稅加總;受 AllowViewPrice 控制顯示

明細欄位

欄位 必填 說明/格式/預設
序號 系統產生 唯讀
品號(SKU) 品號查詢欄,輸入後帶出品名/單位等
品名 唯讀,依品號帶出
廠商品號
數量 採購數量;變更後重算金額,並檢核不得小於已交數量
請購單號 系統產生 唯讀
單位 下拉(UOM 清單)
Price Query(單價查詢) 按鈕欄,開歷史單價面板;受 AllowViewPrice 控制顯示
單價 AllowViewPrice 控制顯示;變更後重算原幣/本幣未稅
原幣未稅 系統計算 唯讀,= 數量 × 單價(原幣);受 AllowViewPrice 控制顯示
本幣未稅 系統計算 唯讀,原幣 × 匯率換算;受 AllowViewPrice 控制顯示
預訂交期 新增列預設今天 +14 天;未結案列空白會擋存檔
回覆日期 廠商回覆交期
暫定週數 整數
備註 最長 50 字
是否結案 勾選框(Y/N);勾選後存檔會跳提醒確認
已交數量 系統產生 唯讀,進貨累計;> 0 時該列鎖定
需求部門 數量≠0 且有品號的未結案列必填,否則擋存檔

欄位連動與附加功能

這一節整理「輸入某欄位/按某鈕後系統會做什麼」,全部來源為實際程式碼。

新增時帶出的預設值(AfterAddNew)

當你按 新增,系統在主檔自動填入:

  • 採購別 = 1(一般採購)。
  • 匯率 = 1。
  • 幣別 = 本位幣(Context.Env.LocalCurrency)。
  • 倉儲代號 = 個人參數 4001(每位使用者可設定自己的預設倉)。
  • 公司代碼 = 1。
  • 採購日期 = 今天。

明細新增列時(SetNewData),預訂交期自動帶今天 +14 天。

小技巧

若新增後倉儲代號是空的或不是你要的倉,請先在系統的個人參數把 4001 設好,之後每張新單都會自動帶入。

輸入廠商代號(廠商代號Binding)

當你在 Vendor Code 輸入或選出廠商,系統會以廠商主檔(SPDATA)帶出:

  • 收付條件號 ← 廠商設定的收付條件。
  • 說明 ← 該收付條件的描述。
  • 幣別 ← 廠商幣別;若廠商沒設幣別,回填本位幣。

若查不到該廠商,上述三欄會被清空、幣別回填本位幣。

VFP 另帶但新版尚未提供

VFP 舊版輸入廠商時還會一併帶出送貨地點/交易條件/付款方式/運送方式。新版 C# 目前只帶收付條件與幣別,其餘欄位需手動輸入(屬已知差異,非錯誤)。

幣別與匯率連動

  • 幣別欄為 TsCurrency 控件,會依採購日期賣出(Sell)匯率自動帶入匯率欄。
  • 匯率被改動,系統立即以新匯率重算整張單的金額(TaxCalculator.CalculateAmount),主檔合計金額與各列本幣未稅同步更新。

數量/單價輸入後的金額重算

  • 輸入或修改明細的數量單價時,該列呼叫 SetCurrencyAmount() 重算原幣未稅/本幣未稅
  • 同時主檔的 Total Qty(= 各列數量加總)與 Total Amount(= 各列原幣未稅加總)即時重算。
  • 數量時還會自動觸發 Price Query(帶出該品號的歷史報價,見下)。

數量檢核(不得小於已交數量)

輸入數量時系統檢查「數量 ≥ 已交數量」。若把數量改到小於已交數量,該欄會出現紅字錯誤 Quantity must be greater than [Received Quantity],且存檔會被擋下。

Price Query 與 Bid 面板(歷史單價)

此功能受 AllowViewPrice(可看價)權限控制,無此權限時相關欄位與面板整組隱藏。

  • 按明細列的 Price Query 按鈕(或變更數量時自動觸發):系統以該列品號+採購日期+本單廠商,查出同一廠商該品號的歷史報價,顯示在右側特殊查詢頁,並自動切到該頁籤。
    • 系統會依「採購或報價來源」(個人參數 6006)與「報價有效天數」(6010)過濾有效報價,並挑出符合採購數量的最低採購量對應單價自動帶回該列單價
  • 切換明細列時,下方 Bid 面板(GUnitPriceSpecialQuery)會列出不同廠商對同一品號的最新報價,供比價參考;按該列的 Return 按鈕可把那筆報價的單價回填到目前明細列。

結案勾選(是否結案)

  • 勾選明細列的是否結案後存檔,系統會跳出提醒:偵測到有 N 列已結案,請確認結案正確(OK / Cancel)。按 Cancel 取消存檔。
  • 一般採購(採購別=1)的列若數量為 0 或品號空白,存檔時會被自動標記刪除。

延伸功能:請購轉採購(ExtendedFunction1)

按工具列延伸功能鈕,會開啟請購轉採購(Gpptopu)視窗:

  1. 在該視窗挑選請購來源並執行轉檔。
  2. 轉檔成功後,本表單自動以新產生的採購單 Pkid 導覽到該張採購單並重新整理畫面,讓你接著補充/確認。

存檔時的計算與驗證(GpurchSave)

儲存 時,系統依序:

  1. 檢核主檔:廠商代號、採購日期、幣別不可空白;匯率必須 > 0;倉儲代號必須存在於倉儲主檔。
  2. 檢核結案列:有結案列時跳提醒確認。
  3. 檢核未結案列:每列預訂交期不可空白;數量≠0 且有品號的列需求部門必填。
  4. 檢核刪除/數量:已交數量 > 0 的列不可刪除;任一列數量不可小於已交數量。
  5. 資料整理(HandleDataBeforeEndEdit):每列重算原幣/本幣金額;一般採購數量 0 或品號空白的列標記刪除;明細送貨地點空白時帶主檔送貨地點。
  6. 稅額計算(TaxCalculate):主檔依稅別取稅率,呼叫 TaxCalculator 加總並回填原幣金額/本幣金額/稅額

VFP 有、新版尚未提供的功能

規劃中/尚未提供(不可在新版操作)

依 VFP 對比,下列功能目前未移植到新版 C#,操作時請勿期待其存在:

  • 結案特殊修改鈕(VFP else5):結案單僅能調低單價、改備註與結案旗標,含「特殊修改單價不得大於原單價」防呆。
  • 修改交期(VFP PURCH_E 批次改交期)。
  • 進貨查詢(VFP GPURCH_S / else6)。
  • 反推稅率/反推未稅價按鈕。
  • 主檔的交易條件/付款方式/運送方式欄位無 UI。
  • 採購單列印報表內容(條件頁可開,報表輸出待接 TWORK_RPT_GPURCH)。

常見問題

存檔時一直說「請輸入需求部門」?

一般採購的明細列只要數量不為 0 且有品號需求部門就是必填。請逐列補上需求部門再存檔;若該列其實不需要,把數量清為 0(一般採購會在存檔時自動移除空列)。

明細列的單價、原幣未稅、本幣未稅都看不到(整欄不見)?

這些價格相關欄位與 Price QueryBid 面板都受可看價(AllowViewPrice)權限控制。沒有此權限時整組價格欄位會隱藏,請洽系統管理員調整權限。

本幣金額是 0 或沒換算?

本幣金額=原幣 × 匯率。請確認幣別有設定、匯率 > 0(匯率 ≤ 0 會擋存檔)。改了匯率後金額會立即重算;若仍為 0,檢查明細是否有輸入單價與數量。

某個明細列改不動、也刪不掉?

該列若已交數量 > 0(已被進貨收料),整列會鎖定(不可編輯、不可刪除),且數量不得改到小於已交數量。需先處理對應的進貨單才能調整。

倉儲代號存檔時報「請輸入正確資料」?

存檔會比對倉儲主檔,輸入的倉儲代號必須存在。新增時若個人參數 4001 帶出的倉不在倉儲主檔,也會被擋;請改填有效倉儲代號或修正參數。

Price Query/Bid 面板查不到任何單價?

歷史單價來自廠商採購報價(GSPPDT)。請確認該品號+廠商有報價、報價在有效天數(參數 6010)內、且來源類型符合參數 6006 設定;無有效報價時面板為空、單價不會自動帶入。

按了列印,卻印不出採購單內容?

目前列印條件頁可開啟,但實際報表輸出邏輯尚在規劃(程式碼中保留、未接上 TWORK_RPT_GPURCH),因此暫時不會產生 PDF。詳見列印採購單的說明。

相關功能


需補截圖清單

以下截圖待功能 runtime 驗收後補拍(放 docs/C-GeneralAffair/images/):

  1. gpurch-step1.png — 新增採購單後的主檔預設值(廠商、幣別、匯率、倉儲)
  2. gpurch-step2.png — 明細格線(品號/數量/單價/預訂交期/需求部門)
  3. gpurch-step3.png — Price Query 歷史單價面板與下方 Bid 比價面板
  4. gpurch-step4.png — 結案勾選後的存檔提醒對話框
  5. gpurch-step5.png — 列印條件頁(採購單號起訖)