程式資訊
- 程式 ID:
PI - 所屬子系統:E.營業收款
- 狀態:stable
形式發票(Proforma Invoice)¶
功能簡介¶
「形式發票」(PI,Proforma Invoice)是出貨/報關前提供給客戶的預估性發票,列出本批交易的品號、數量、單價、金額與付款/交期等條件,作為客戶下單、開立信用狀(L/C)或安排付款的依據。它與商業發票(CI)結構相近,但 PI 是交易成立前的形式文件、不入帳,CI 才是出貨後的正式商業發票。
此表單由負責外銷的業務/船務人員維護:在主檔填客戶、PI 日期、幣別等抬頭資料,在明細逐列輸入品號與數量單價,系統即時加總總數量與原幣總金額供核對。
資料表尚未部署
程式(ViewModel / Source / 存檔邏輯)已依 VFP 原版 PI(scx_ord.vcx) 還原完成,故狀態標為 beta;但底層資料表 pi_m / pi_d 的建表 DDL 尚待放行部署。在資料表建立前,本功能無法實際存取資料。下方操作步驟描述的是已實作的程式行為,供部署後對照使用。
前置需求¶
- 權限:E.銷售訂單 →
E-130 形式發票的瀏覽/修改/列印權限。 - 基礎資料:下列主檔/參數會影響欄位帶值與存檔,請先維護——
| 資料 | 影響什麼 |
|---|---|
| 客戶主檔(客戶資料) | 客戶代號輸入後自動帶客戶簡稱;存檔驗證客戶代號必填 |
| 品號主檔(品號資料) | 明細品號輸入後帶產品描述(中/英)與單位;查無品號會擋下並提示 |
| 幣別與匯率(匯率資料) | 幣別帶出當日賣出匯率;幣別小數位決定金額加總的進位位數 |
| 公司代碼設定(C101) | 主檔公司代碼下拉清單 |
| 交易條件設定(C202) | 交易條件下拉清單;存檔時由代碼帶出交易條件文字 |
操作步驟¶
新增一張 PI¶
- 從主選單開啟 E.銷售訂單 → 形式發票。
- 點工具列
新增。 - 在上方主檔區輸入抬頭資料:
- PINO(PI 單號):由使用者自行輸入(系統不自動編號),不可空白且不可與既有單號重複。
- 客戶代號:可直接輸入或按放大鏡查詢;輸入後右側自動顯示客戶簡稱。
- PI日期:必填。
- 公司代碼、幣別:由下拉選擇。選定幣別後系統自動帶入該日賣出匯率。
- 切換到
明細資料編修頁籤,逐列輸入明細(見欄位連動與附加功能):- 品號:輸入後自動帶產品描述與單位。
- 數量、單價:輸入後系統即時重算上方的總數量與原幣總金額。
- 新增列的序號會自動帶下一個流水號(3 位,如
001)。
- 視需要切換
頁首資料編修頁籤補充報價單號/客戶訂單號/聯絡人/交易條件/預訂交期/商品名稱/頁首備註/頁尾備註/正麥(SHIPPING MARK)等資料。 -
點
儲存。小技巧
可用 Ctrl+S 快速儲存。
修改¶
- 用工具列的查詢或上下筆移動找到目標 PI。
- 點
修改進入編輯狀態。 -
調整主檔或明細欄位後
儲存。報價單號僅新增可改
報價單號欄位只有在「新增/複製新增」狀態下可編輯;進入修改狀態後會變為唯讀(對應 VFP
changeopmode規則)。
刪除明細列¶
- 在明細將某列數量改為 0。
- 存檔時系統自動把該列標記為刪除(不會寫入),等同移除該明細列。
列印¶
PI 報表規劃中
VFP 原版的 PI 列印報表 PI_P(SCX_ORDP) 尚未移植到新版。列印 功能在報表移植完成前暫不可用。
欄位說明¶
主檔(抬頭)¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| PINO | 是 | PI 單號,使用者自行輸入(無自動編號),長度 20;空白或重複不可存檔 |
| 客戶代號 | 是 | 長度 10;輸入後帶客戶簡稱 |
| 客戶簡稱 | — | 由客戶代號自動帶出,唯讀、不存檔 |
| PI日期 | 是 | yyyy/MM/dd |
| 公司代碼 | — | 下拉(C101 公司代碼設定) |
| 幣別 | — | 下拉(幣別設定);變更後重帶匯率並影響金額加總小數位 |
| 匯率 | — | 格式 999.9999;選幣別後自動帶當日賣出匯率,可手改 |
| 總數量 | — | 系統加總,唯讀、不存檔 |
| 原幣總金額 | — | 系統加總,唯讀、不存檔 |
| 報價單號 | — | 長度 12;僅新增/複製狀態可改 |
| 客戶訂單號 | — | 長度 20 |
| 聯絡人 | — | 長度 30 |
| 交易條件 | — | 下拉(C202);存檔時由代碼帶出文字 |
| 預訂交期 | — | yyyy/MM/dd |
| 產品描述別 | — | 中文 或 英文;決定明細帶哪種品號描述 |
| 商品名稱 | — | 長度 100 |
| 頁首備註/頁尾備註/正麥(SHIPPING MARK) | — | 多行文字 |
明細(明細資料編修 頁籤)¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 序號 | — | 新增列自動帶 3 位流水號(如 001) |
| 客戶品號 | — | 長度 30 |
| 品號 | — | 輸入後帶產品描述與單位;查無品號會提示 |
| 產品描述 | — | 由品號+主檔產品描述別自動帶,可手改 |
| 單位 | — | 由品號自動帶,亦可從下拉清單選擇 |
| 數量 | — | 改變後即時重算總計;存檔時為 0 的列視為刪除 |
| 單價 | — | 格式 999,999.99999(6 位小數);改變後即時重算總計 |
| 報價單位 | — | 長度 4 |
| 備註 | — | 長度 30 |
欄位連動與附加功能¶
這一節列出「輸入某欄位/按某動作後系統會做什麼」,全部來自實際程式碼(PiViewModel、Pi_mSource、Pi_dSource、PiSave 及 VFP PI class)。
主檔連動¶
-
輸入客戶代號 → 自動帶客戶簡稱 當你輸入或查詢選定客戶代號後,系統用
DescriptionHelper.GetCustomerName取出客戶簡稱顯示在右側唯讀欄。移動到其他資料筆時也會重新帶一次簡稱。VFP 註解未還原的帶值
VFP 原版在輸入客戶代號後,原本還會一併帶客戶的幣別/聯絡人/交易條件,但這些在 VFP 中已被註解停用,新版亦未還原。新版只帶客戶簡稱,其餘抬頭欄位需自行輸入。
-
選擇幣別 → 自動帶賣出匯率 選定幣別後,主檔上的匯率控件(
SearchType=Sell)依PI日期抓當日賣出匯率填入匯率欄(對應 VFP幣別.LostFocus取U_BLRATE(幣別,'1','賣',PI日期))。匯率帶出後仍可手動覆寫。 -
幣別影響金額加總的小數位 變更幣別會觸發總金額重算。金額加總時的進位位數取自該幣別的小數位設定(
OpenDbfTable.GetDecimalPlaces)——例如 TWD/JPY 取 0 位、其他幣別多為 2 位。 -
產品描述別影響全部明細描述 主檔的產品描述別(中文/英文)改變時,系統會對所有明細列重新呼叫
SetProduct,依新選的語別重帶每列的產品描述。 -
報價單號僅新增可改
報價單號欄位預設唯讀,只有在新增或複製新增狀態才開放編輯(XAMLDataTrigger對應 VFPchangeopmode)。
明細連動¶
-
輸入品號 → 帶產品描述與單位 在明細輸入品號離開欄位時,系統呼叫
SetProduct:- 用
DescriptionHelper.GetInvent取品號主檔;查無品號時跳出「查無品號 !!!」提示並停止帶值。 - 依主檔產品描述別:選「中文」帶中文描述、否則帶英文描述;若該語別描述為空,退而取
GetSKUDescription。 - 帶入品號主檔的單位。
- 用
-
數量/單價改變 → 即時重算總計 明細的數量或單價變更後,系統重算上方主檔的總數量與原幣總金額:
- 總數量 = Σ 各列數量。
- 原幣總金額 = Σ ROUND(數量 × 單價, 幣別小數位)。
- 加總時排除標記刪除(增刪修=D)的列與品號空白的列(對應 VFP
sum加總的FOR (增刪修<>'D') AND (NOT EMPTY(品號)))。
-
新增明細列自動編序號 新增一列明細且序號為空時,系統取現有最大序號 +1,格式化為 3 位(如
004)填入序號(對應 VFPson1fld=序號)。 -
數量為 0 的列視為刪除 明細的刪除條件是「數量=0」(
NeedDeleteFunction回傳數量 == 0)。存檔時這類列會被標記為刪除而不寫入。
存檔時的處理(PiSave)¶
按 儲存 時,系統依序:
-
必填與重複檢查
- PINO 不可空白;且以
pino(排除自己的pkid)查pi_m,單號重複則擋下並提示「資料重複」。 - PI日期 不可空白。
- 客戶代號 不可空白。
- PINO 不可空白;且以
-
回填明細主鍵與序號 把每列明細的
pino回填為主檔單號;序號仍為空的列補上流水號。 -
帶交易條件文字 若交易條件文字欄為空,由交易條件碼透過
GetTransactionMethod帶出文字一併存檔(比照 CiSave)。 -
清掉 0 數量列 數量為 0 的明細列標記為刪除,不寫入資料庫。
PI 不掛審核、無轉傳票/沖帳
pi_m 沒有審核欄位,本表單不走簽核流程;PI 屬交易前的形式文件,也不轉傳票、不沖帳。VFP 原版的「複製報價單、搜尋客號帶單價、頁首備註自動產生」等按鈕在 VFP 中已被註解停用,新版亦未還原。
常見問題¶
存檔時提示要輸入 PINO/PI日期/客戶代號?
這三項是必填:PINO(單號,需自行輸入且不可重複)、PI日期、客戶代號。請確認都已填寫;PINO 還會做重複檢查,與既有單號相同會被擋下。
輸入品號後產品描述/單位是空白?
產品描述與單位是從品號主檔帶出的。請確認:該品號存在於品號主檔(否則會跳「查無品號」)、且品號主檔有對應產品描述別(中文/英文)的描述與單位。改了主檔的「產品描述別」後,明細描述會自動依新語別重帶。
改了數量/單價,總數量或原幣總金額沒變?
請確認該列品號不為空白且未被標記刪除——加總只計入有品號、未刪除的列。另外金額會依幣別小數位進位(如 TWD/JPY 取 0 位),小額差異可能來自進位。
選了幣別但匯率沒帶出來?
匯率是依PI日期抓當日賣出匯率。請先確認 PI 日期已填、且匯率主檔有該幣別當日(或可推算)的賣出匯率資料。匯率帶出後仍可手動修改。
報價單號為什麼改不了?
報價單號只有在「新增/複製新增」狀態可編輯;一旦進入「修改」狀態就會變唯讀。若要調整既有單的報價單號,請改用複製新增重建,或在新增當下填妥。
把明細數量改成 0,那一列會怎樣?
數量為 0 的明細列在存檔時會被視為刪除、不寫入資料庫,等同移除該列。若要保留該品項,請填入正確數量。
相關功能¶
需補截圖清單
以下截圖待資料表部署、功能 runtime 驗收後補拍(放 docs/E-SalesOrder/images/):
pi-step1.png— 主檔抬頭區(PINO/客戶代號/PI日期/幣別/匯率/總數量/原幣總金額)pi-step2.png—明細資料編修頁籤(序號/品號/數量/單價等明細格線)pi-step3.png—頁首資料編修頁籤(報價單號/交易條件/預訂交期/備註/正麥)