程式資訊
- 程式 ID:
Checkqry - 所屬子系統:O.銀行票據
- 狀態:stable
票齡分析表¶
功能簡介¶
「票齡分析表」把指定收付款日期區間內的應收票據(NR)與應付票據(NP),依「票齡(持票天數)」分桶彙總,算出每個對象在 30 / 60 / 90 / 120 天以內 各落了多少本幣金額、加權後的平均票齡是幾天。它適合財務/業務主管掌握「手上的票大多是短票還是長票」「哪些客戶/業務員/廠商的票齡偏長」,作為資金調度與收付款風險的參考。
本表是一支純查詢報表(不新增、不修改資料),結果同時呈現在三個頁籤,分別從客戶別、業務員別、廠商別三個視角切同一批票據:
- 應收票據票齡(客戶別):應收票據(NR)依客戶彙總。
- 應收票據票齡(業務別):同一批應收票據(NR)改依業務員彙總。
- 應付票據票齡:應付票據(NP)依廠商彙總。
資料來源是票據主檔,透過後端 SP DARB_QRY_CHECK(查詢別 31)撈出收付款日期落在區間內的票據,再由前端逐筆換算本幣金額、依票齡分桶。
前置需求¶
- 權限:O.票據 →
O-100 票齡分析表的瀏覽權限(列印需另有列印權限)。 - 後端 SP:
DARB_QRY_CHECK須已部署且在proc_param登錄;查詢別固定帶31。 - 基礎資料:分析結果的完整度取決於下列資料的維護狀況——
| 資料 | 影響的結果 |
|---|---|
| 應收/應付票據(含收付款日期、到期日、預兌日、票據金額、立帳匯率) | 三個頁籤的全部金額與票齡 |
| 票據掛在的客戶/廠商主檔(代號、簡稱) | 客戶別/廠商別頁的代號/簡稱 |
| 客戶的業務員設定 | 業務員別頁的業務員編號/姓名(沒掛業務員的票會歸到空白業務員列) |
| 幣別與立帳匯率 | 本幣金額=票據金額 × 立帳匯率,外幣票據未換算則金額會偏差 |
NR / NP 是什麼
票據以票別區分:NR=應收票據(Note Receivable,向客戶收的票),NP=應付票據(Note Payable,付給廠商的票)。前兩個頁籤都只看 NR、第三個頁籤只看 NP。
操作步驟¶
這支報表只有一個動作:設定收付款起訖日期後按查詢,三個頁籤一次算好。
- 開啟「票齡分析表」,畫面上方為條件面板、下方為三個結果頁籤。
- 在條件面板設定收付款起訖日期:
- 起始日期:預設為「今天往前推一個月」(
DateTime.Now.AddMonths(-1))。 - 截止日期:預設為「今天」。
- 兩欄都是日期格式(
yyyy/MM/dd),直接輸入或用日期選擇器調整。
- 起始日期:預設為「今天往前推一個月」(
- 按工具列的
查詢。系統以收付款日期 BETWEEN 起始 AND 截止為條件呼叫 SP,撈回票據後即時計算並填入三個頁籤。 -
切換頁籤檢視不同視角:
應收票據票齡(客戶別)應收票據票齡(業務別)應付票據票齡
-
需要紙本或檔案時:
- 在任一格線上按右鍵可匯出 Excel(Telerik 格線內建匯出)。
- 按工具列列印相關按鈕可預覽/列印報表,報表分三張:
應收帳款票齡-客戶別、應收帳款票齡-業務別、應付帳款票齡(詳見欄位連動與附加功能)。
小技巧
改了起訖日期後再按一次 查詢 即重算,三個頁籤會同步更新;不需要分別切頁查詢。

欄位說明¶
查詢條件¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 起始日期 | ✔ | 收付款日期區間下界,格式 yyyy/MM/dd;預設=今天 −1 個月 |
| 截止日期 | ✔ | 收付款日期區間上界,格式 yyyy/MM/dd;預設=今天 |
結果頁籤共同欄位¶
三個頁籤的金額欄位完全相同,差別只在第一、二欄的彙總對象(客戶/業務員/廠商):
| 欄位 | 說明/格式 |
|---|---|
| 客戶代號/業務員編號/廠商代號 | 彙總對象的代號;最後一列固定為 合計(多語系字串,英文版顯示 Total) |
| 客戶簡稱/姓名/廠商簡稱 | 彙總對象名稱;合計列為空白 |
| 合計 | = D30 + D60 + D90 + D120 + 其它(本幣,唯讀計算欄) |
| 加權金額 | 各票「本幣金額 × 持票天數」的加總(本幣) |
| 平均天數 | = 加權金額 ÷ 合計,四捨五入到整數天(合計為 0 時顯示 0);格線以兩位小數格式呈現,故會顯示為 .00 |
| D30 | 持票天數 ≤ 30 天的本幣金額小計 |
| D60 | 持票天數 31~60 天的本幣金額小計 |
| D90 | 持票天數 61~90 天的本幣金額小計 |
| D120 | 持票天數 91~120 天的本幣金額小計 |
| 其它 | 持票天數 > 120 天的本幣金額小計 |
欄名對照
新版頁籤的桶位欄頭直接用 D30 / D60 / D90 / D120;對應 VFP 舊版的「天數30/天數60/天數90/天數120」與報表上的「30天金額/60天金額…」,金額口徑相同。
欄位連動與附加功能¶
這支是查詢報表,沒有逐欄輸入連動,但「按查詢後系統怎麼把每張票算進哪個桶」「列印/匯出會做什麼」是本頁重點,以下逐項說明。
按 查詢 後系統做的事¶
當你按下 查詢,系統依序完成下列計算(對應 CheckQryBll.GetSqlData):
- 清空舊結果:三個頁籤與內部票齡明細全部重建,再開始算。
- 撈票據:以查詢別
31、條件收付款日期 BETWEEN 起始 AND 截止呼叫 SPDARB_QRY_CHECK,撈回符合的票據(含票別、代號、簡稱、業務員、幣別、立帳匯率、收付款日期、到期日、預兌日、票據金額)。 - 逐票換算本幣金額:每張票 本幣金額 = 票據金額 × 立帳匯率,四捨五入到本幣小數位數(
Context.Env.LocalDecimal)。 - 決定「計算日」:每張票的 計算日 = 預兌日與到期日取較晚者(
預兌日 ≥ 到期日 ? 預兌日 : 到期日)。計算日是用來量「票還要放多久」的基準。 -
算持票天數並分桶:每張票的 持票天數 = 計算日 − 收付款日期(天),依下表落桶(落在哪一桶,整張票的本幣金額就加進該桶):
持票天數 落桶 ≤ 30 D30 31~60 D60 61~90 D90 91~120 D120 > 120 其它 -
累計加權金額:每張票貢獻 本幣金額 × 持票天數 到加權金額;若持票天數算出來是負數(計算日早於收付款日期),天數以 1 計(避免負值灌入加權)。
- 分三視角彙總:
- 客戶別頁(CheckQry1):只取
NR應收票,依客戶代號分組。 - 業務員別頁(CheckQry2):同一批
NR應收票,改依業務員編號分組(同一張票會同時出現在客戶別與業務員別的彙總裡,只是分組維度不同)。 - 廠商別頁(CheckQry3):只取
NP應付票,依廠商代號(即代號)分組。
- 客戶別頁(CheckQry1):只取
- 加總列:每個頁籤算完明細後,再追加一列
合計(英文版Total),把各桶與加權金額全部加總,並重算合計列的平均天數。 - 回填頁籤:三份結果一次塞回
CheckQry1s / CheckQry2s / CheckQry3s,格線即時刷新。若 SP 回傳失敗,跳出驚嘆號訊息框、不更新頁籤。
合計與平均天數是即時算的
每一列的 合計=五個桶相加、平均天數=加權金額 ÷ 合計,都是 Poco 的唯讀計算屬性,不存進結果集;所以這兩欄一定跟同列的桶位金額一致。
列印報表(GetReports / IPrintSource)¶
工具列列印功能會依此表的 GetReports 提供三張報表,分別對應三個頁籤的內容:
| 報表編號 | 報表抬頭 | 對應頁籤 |
|---|---|---|
O100-1 |
應收帳款票齡-客戶別 | 應收票據票齡(客戶別) |
O100-2 |
應收帳款票齡-業務別 | 應收票據票齡(業務別) |
O100-3 |
應付帳款票齡 | 應付票據票齡 |
報表資料來源由 GetReportParameters 提供:三個頁籤分別轉成報表用的 Rpt_O100_CheckqryReportPoco(代號/簡稱/D30~D120/其它/加權金額/起訖日期),透過 ReportSource、ReportSource1、ReportSource2 三組參數帶進報表。三張報表都使用 A4、TW 區域、同一份 SQLite 來源樣板(rpt_o100_checkqry_report1)。
匯出 Excel¶
三個頁籤都是 Telerik TsRadGridView,在格線上按右鍵即可匯出目前頁籤的內容到 Excel(含合計列)。匯出內容即畫面所見,不會重新查詢。
與舊版(VFP)行為差異¶
本幣金額的匯率取法與小數位數
VFP 舊版在前端用 U_BLRATE('CHECKQRY', 幣別, '1', '賣', 截止日) 以「截止日的賣出匯率」重算每張票的本幣金額,並 ROUND(..., 0) 取到整數;新版直接採用 SP 回傳的立帳匯率(即建票當時的匯率)乘票據金額,再四捨五入到本幣小數位數(Context.Env.LocalDecimal)。兩者都是「票據金額 × 匯率後四捨五入」,但有兩處差異:(1) 匯率基準不同——舊版用查詢截止日的賣出匯率、新版用立帳匯率;(2) 取位不同——舊版固定取整數、新版取本幣設定的小數位數。
常見問題¶
查不到任何資料、三個頁籤都只有一列「合計」?
代表該收付款日期區間內沒有符合的票據。請確認:(1) 起訖日期涵蓋到票據的收付款日期(不是到期日);(2) 區間內確實有票別為 NR 或 NP 的票據;(3) 後端 SP DARB_QRY_CHECK 已部署並登錄。預設區間只看「最近一個月」,較舊的票要把起始日往前拉。
某張票的金額是 0 或明顯偏小?
本幣金額=票據金額 × 立帳匯率。外幣票若立帳匯率沒設好(例如為 0 或 1),換算後就會異常。請回票據建檔確認該票的幣別與立帳匯率。
平均天數看起來怪怪的,甚至比實際短?
平均天數是加權平均:=(每張票本幣金額 × 持票天數)總和 ÷ 合計金額。金額大的票會把平均往它的票齡拉。另外,若某票的計算日早於收付款日期(持票天數為負),系統會以 1 天計入加權,不會出現負天數。
為什麼同一張應收票同時出現在「客戶別」和「業務別」頁?
這是設計如此。前兩個頁籤是同一批應收票(NR)的兩種彙總視角——客戶別頁依客戶分組、業務員別頁依業務員分組,金額總和會一致,只是切的維度不同。第三頁是另一批資料(應付票 NP),不會跟前兩頁重疊。
業務員別頁出現一列沒有編號/姓名的彙總?
表示有應收票掛在沒有設定業務員的客戶上,這些票會被歸到空白業務員那一組。請回客戶主檔補上業務員設定。
改了匯率/補了票據,數字沒變?
這支報表只有按 查詢 才會重撈重算。調整任何來源資料後,請再按一次 查詢。
相關功能¶
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/O-Check/images/):
checkqry-step1.png— 條件面板(收付款起訖日期)+三個頁籤切換的整體畫面,建議以「應收票據票齡(客戶別)」頁含合計列為主畫面