程式資訊
- 程式 ID:
IncomeCondition - 所屬子系統:N.總帳管理
- 狀態:stable
損益表查詢條件¶
功能簡介¶
「損益表查詢條件」是損益表(N-150)主畫面左側的查詢條件面板,並不是一支獨立的程式。它由 IncomeConditionViewModel 驅動,畫面透過 App.xaml 的 DataTemplate 對應到 IncomeCondition 控件,承載一組查詢參數(IncomeQueryParameters)。
使用者在這個面板設定年度、月份區間、部門、幣別、科目語言、是否含明細後,按損益表主畫面工具列的 查詢,這些條件就會被帶進 IncomeBll 與 CurrentPeriodBll,去組出損益表的兩個結果頁——逐月損益(去年同期/本年度/預算三欄)與本期累計損益。
它適合會計、財務主管在月結後檢視損益狀況;條件本身決定了報表要算到第幾個月、用哪一種幣別、要不要展開到明細科目。完整的結果欄位與報表,請見母頁損益表。
本頁與「損益表」是同一支程式
本頁描述的是損益表(ProgramClass.INCOME,N-150)的條件面板,與母程式共用同一個 ProgramClass 與查詢流程。查詢結果、列印報表、欄位明細請見 ./income.md;本頁專注說明每一個查詢條件欄位的預設值、限制與連動效果。
前置需求¶
- 權限:N.總帳 →
N-150 損益表的瀏覽權限(含列印權限才能輸出報表)。條件面板沒有獨立權限,跟著母程式走。 - 基礎資料:條件面板本身只是輸入參數,但查詢結果的完整度取決於下列資料——
| 資料 | 影響什麼 |
|---|---|
| 會計科目(科目主檔 ACCL,含大分類/中分類/借貸別) | 損益表的科目歸類、彙總層級、營業內外的判定 |
| 已過帳的傳票(SLIY,是否過帳=Y) | 本年度與去年同期的實際數;未過帳的傳票不列入 |
| 部門主檔 | 部門代號條件比對的對象(可只看單一部門或全部) |
| 預算(BUDGET) | 損益表「預算」欄的來源;沒有編預算則該欄為 0 |
| 科目的英文名稱 | 科目名稱顯示切到「英文」時的顯示文字 |
資料來源是傳票,不是另一張單據
損益表是即時彙算,不像進貨單那樣有獨立的「損益表單檔」。每按一次 查詢 就重新從傳票(SLIY)彙算一次,因此改完條件一定要重按查詢才會反映。
操作步驟¶
- 在損益表主畫面按
新增(工具列),系統會帶出一組預設條件(見欄位說明)。 - 設定 年度:輸入要查的西元年(4 位)。預設為今年。
-
設定 起始月份/截止月份:輸入 1~12 的數字。預設起始為
1、截止為「系統當月」。月份會自動夾限
起始與截止月份只接受 1~12;輸入超過範圍的值(例如 0 或 13)系統會自動夾到合法範圍,不會報錯。詳見欄位連動與附加功能。
-
設定 部門代號:點
部門查詢鈕選一個部門,或直接保留ALL查全部門。 - 選 幣別:在
功能幣/本幣/集團幣三選一(單選),決定損益金額用哪一種幣別彙算。預設為功能幣。 - 選 科目名稱顯示:在
科目名稱(中文)/英文科目名稱二選一,決定結果中科目以哪種語言顯示。預設跟著登入者的語系。 - 視需要勾選 含明細科目:勾選時逐筆明細科目展開;不勾則只顯示彙總層級。預設勾選。
- 回主畫面按工具列
查詢,結果顯示在右側兩個頁籤(逐月損益/本期累計)。 - 需要紙本時按
列印,可選損益表、簡式、本期及累計、月份比較、預算比較等多種格式(報表清單見損益表)。
欄位說明¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 年度 | ✔ | 西元年 4 位。預設 DateTime.Now.Year(今年)。決定本年度資料;去年同期欄自動取「年度−1」 |
| 起始月份 | ✔ | 1~12 的整數。預設 1。超出範圍會自動夾限 |
| 截止月份 | ✔ | 1~12 的整數。預設=系統當月。決定算到第幾個月,其後月份歸 0(見下節) |
| 部門代號 | — | 部門代號或 ALL。預設 ALL(全部門)。使用 DeptSearch 查詢鈕,CheckDataExist=false 不檢查代號是否存在 |
| 幣別 | ✔ | 單選 功能幣(Functional)/本幣(Local)/集團幣(Group)。預設 功能幣。決定彙算用的金額欄位 |
| 科目名稱顯示 | ✔ | 單選 科目名稱(中文)/英文科目名稱(English)。預設=登入者語系(Context.User.Language) |
| 含明細科目 | — | 勾選=展開到明細科目;不勾=只到彙總層級。預設勾選(true) |
新增時的幣別預設不一致(已知行為)
參數類別 ResetToDefault() 把幣別預設為 功能幣,但母程式 AfterAddNew()(按新增後重設主檔)會把主檔幣別設為 本幣。因此實際進畫面看到的預設幣別,以面板上 radio 勾選的 功能幣 為準(條件面板的 Parameter.CurrencyType 才是查詢真正採用的值)。
欄位連動與附加功能¶
這一節把「在某欄位輸入後、系統會做什麼」「某條件如何改變查詢結果」逐條列出,全部來自實際程式碼。
進入畫面時¶
- 條件面板建立時(
IncomeConditionViewModel建構),系統會把 科目名稱顯示 預設成登入者的語系(LanguageEnum = Context.User.Language),覆蓋掉參數預設的「繁體中文」。也就是說,英文使用者進來時科目名稱預設顯示英文。 - 其餘條件(年度=今年、起始月份=1、截止月份=當月、部門=ALL、幣別=功能幣、含明細=勾)由
IncomeQueryParameters建構時呼叫的ResetToDefault()帶入。
起始月份/截止月份¶
- 當你輸入 起始月份 或 截止月份,系統會用
Math.Clamp(value, 1, 12)自動夾限:輸入小於 1 會被改成 1、大於 12 會被改成 12。所以不會出現「第 0 月」或「第 13 月」這種非法區間。 - 截止月份決定「算到哪一個月」:查詢時
TotalCalculate會把大於截止月份的那幾個月(去年同期、本年度、預算三組)全部歸 0。例如截止月份設 6,則 7~12 月的數字一律不計,本期合計只累加起始月~截止月。 - 本期合計(當期)只累加「起始月~截止月」之間的數字:
PreviousYearCurrentPeriod/ThisYearCurrentPeriod/BudgetCurrentPeriod三個合計欄,是把區間內各月份相加得來。改月份區間,三欄合計會跟著變。 - 查詢後會把條件組成「截止日」:
截止日 = 年度/截止月份/該月最後一天(SetIncomem內以DateTime.DaysInMonth算出當月最後一天),寫進結果主檔(Incomem)的EndingDate欄位,供報表抬頭顯示查詢區間。
年度¶
- 年度同時決定本年度與去年同期兩欄:
IncomeBll取previousYear = 年度 − 1,查詢條件抓「去年整年 + 本年度」兩段傳票(傳票日期 like '去年%' or like '本年度%'),分別填入「去年同期」與「本年度」金額。 - 只彙算 已過帳(是否過帳=Y)且科目代號
>= '4'(損益類科目)的傳票,未過帳傳票不列入。
部門代號¶
- 保留 ALL(全部門)時,查詢用不分部門的 SP 參數組(
Lp_1 = "3"/"4"),彙算全公司損益。 - 指定某一個部門時,查詢改用帶部門的參數組(
Lp_1 = "31"/"41",並把部門代號當作LP_P5傳給 SP),只彙算該部門的損益與預算。 DeptSearch控件設定CheckDataExist=false:輸入的部門代號不會在輸入當下檢查是否存在;查不到資料只會讓結果為空,不會擋你輸入。
幣別(功能幣/本幣/集團幣)¶
-
三個 radio 共用
GroupName="Currency",互斥單選;選擇的值決定查詢時 SP 要彙總哪一組金額欄位:選項 對應彙算欄位 功能幣(Functional) 借方金額/貸方金額 本幣(Local) 本借方金額/本貸方金額 集團幣(Group) 集借方金額/集貸方金額 -
換幣別後重按
查詢,整張損益表的金額會以新幣別重新彙算(含去年同期、本年度、預算三欄)。原幣不適用損益表
CurrencyTypeEnum雖然還有「原幣(OriginalCurrency)」,但損益表面板只提供功能幣/本幣/集團幣三個選項,因為損益表是跨科目彙總、不會用單一原幣表示。
科目名稱顯示(中文/英文)¶
- 兩個 radio 共用
GroupName="LanguageEnum",互斥單選。切到英文科目名稱時,結果中的科目名稱(含「營業收入合計」「營業毛利合計」等彙總列名稱)會以英文呈現;切回科目名稱則顯示中文。 - 彙總列(4ZZZ、5ZZ、5ZZZ、6ZZ、6ZZZ、營業外收入/支出/利益、本期損益)的文字會依此語系,透過
DisplayNameService.GetDisplayNameByUserLanguage取對應語言的字串。
含明細科目¶
- 勾選(含明細):每一筆明細科目以自己的科目代號(
彙總科目 = 科目代號)逐筆呈現,損益表會看到完整的明細科目列。 - 不勾選(只到彙總):科目會被歸併到上層——
5/6開頭的科目取前 2 碼當彙總科目,其餘損益科目取前 4 碼。畫面只顯示彙總後的少數列,適合主管快速看大數。 - 不論勾或不勾,營業內外的小計列與「營業收入合計/毛利/利益/本期損益」等合計列都會自動算出(
NonOperatingCalculate/NonOperatingProfitCalculate/TotalCalculate)。
查詢後的整理(影響你看到的列)¶
- 查詢完成後,整年三組金額全為 0 的科目列會被移除(
TotalCalculate內RemoveAll),所以沒有任何發生額的科目不會出現在損益表上。 - 結果依 彙總科目 排序呈現,營業外收入/支出的彙總代號會依科目主檔大分類「營業外收入/營業外支出」動態判定(找不到時退回預設
71/75)。
常見問題¶
改了年度或幣別,損益表數字沒變?
損益表是即時彙算,改完條件一定要回主畫面重按 查詢 才會重算。條件面板只是收集參數,本身不會自動觸發查詢。
某些科目在損益表上看不到?
兩個原因:(1) 該科目整年的去年同期、本年度、預算三組金額全為 0,會被自動移除;(2) 你勾了 不含明細,明細科目被歸併到彙總層級,要勾「含明細科目」才看得到逐筆明細。
金額是 0 或比預期少?
請確認:(1) 對應月份的傳票已過帳(是否過帳=Y),未過帳不列入;(2) 截止月份是否設得太前面——大於截止月份的月份會被歸 0,本期合計只累加起始~截止月之間;(3) 幣別是否選對(功能幣/本幣/集團幣彙算的是不同金額欄位)。
預算欄全是 0?
損益表的「預算」欄來自預算編製(BUDGET)。若該年度/科目沒有編預算,預算欄就是 0,這不是錯誤。
輸入部門代號查不到資料?
部門欄的 DeptSearch 設定為不檢查代號是否存在(CheckDataExist=false),輸入錯誤代號不會擋你,但會查不到該部門的損益。請改用 部門 查詢鈕挑選正確部門,或保留 ALL 查全部門。
起始月份輸入 13 會怎樣?
系統會自動把它夾到合法範圍(1~12),不會報錯也不會當掉。月份永遠落在 1~12 之間。
相關功能¶
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/N-GeneralLedger/images/):
incomecondition-step1.png— 條件面板全貌(年度/月份/部門/幣別/科目語言/含明細)incomecondition-step2.png— 幣別三選一 radio 與「含明細科目」勾選框incomecondition-step3.png— 條件設定完成後、損益表主畫面的查詢結果(兩個頁籤)