跳轉到

程式資訊

  • 程式 IDIncomeCondition
  • 所屬子系統:N.總帳管理
  • 狀態:stable

損益表查詢條件

功能簡介

「損益表查詢條件」是損益表(N-150)主畫面左側的查詢條件面板,並不是一支獨立的程式。它由 IncomeConditionViewModel 驅動,畫面透過 App.xamlDataTemplate 對應到 IncomeCondition 控件,承載一組查詢參數(IncomeQueryParameters)。

使用者在這個面板設定年度、月份區間、部門、幣別、科目語言、是否含明細後,按損益表主畫面工具列的 查詢,這些條件就會被帶進 IncomeBllCurrentPeriodBll,去組出損益表的兩個結果頁——逐月損益(去年同期/本年度/預算三欄)與本期累計損益。

它適合會計、財務主管在月結後檢視損益狀況;條件本身決定了報表要算到第幾個月、用哪一種幣別、要不要展開到明細科目。完整的結果欄位與報表,請見母頁損益表

本頁與「損益表」是同一支程式

本頁描述的是損益表(ProgramClass.INCOME,N-150)的條件面板,與母程式共用同一個 ProgramClass 與查詢流程。查詢結果、列印報表、欄位明細請見 ./income.md;本頁專注說明每一個查詢條件欄位的預設值、限制與連動效果

前置需求

  • 權限:N.總帳 → N-150 損益表 的瀏覽權限(含列印權限才能輸出報表)。條件面板沒有獨立權限,跟著母程式走。
  • 基礎資料:條件面板本身只是輸入參數,但查詢結果的完整度取決於下列資料——
資料 影響什麼
會計科目(科目主檔 ACCL,含大分類/中分類/借貸別) 損益表的科目歸類、彙總層級、營業內外的判定
已過帳的傳票(SLIY,是否過帳=Y) 本年度與去年同期的實際數;未過帳的傳票不列入
部門主檔 部門代號條件比對的對象(可只看單一部門或全部)
預算(BUDGET) 損益表「預算」欄的來源;沒有編預算則該欄為 0
科目的英文名稱 科目名稱顯示切到「英文」時的顯示文字

資料來源是傳票,不是另一張單據

損益表是即時彙算,不像進貨單那樣有獨立的「損益表單檔」。每按一次 查詢 就重新從傳票(SLIY)彙算一次,因此改完條件一定要重按查詢才會反映。

操作步驟

  1. 在損益表主畫面按 新增(工具列),系統會帶出一組預設條件(見欄位說明)。
  2. 設定 年度:輸入要查的西元年(4 位)。預設為今年。
  3. 設定 起始月份/截止月份:輸入 1~12 的數字。預設起始為 1、截止為「系統當月」。

    月份會自動夾限

    起始與截止月份只接受 1~12;輸入超過範圍的值(例如 0 或 13)系統會自動夾到合法範圍,不會報錯。詳見欄位連動與附加功能

  4. 設定 部門代號:點 部門 查詢鈕選一個部門,或直接保留 ALL 查全部門。

  5. 幣別:在 功能幣本幣集團幣 三選一(單選),決定損益金額用哪一種幣別彙算。預設為 功能幣
  6. 科目名稱顯示:在 科目名稱(中文)/英文科目名稱 二選一,決定結果中科目以哪種語言顯示。預設跟著登入者的語系。
  7. 視需要勾選 含明細科目:勾選時逐筆明細科目展開;不勾則只顯示彙總層級。預設勾選。
  8. 回主畫面按工具列 查詢,結果顯示在右側兩個頁籤(逐月損益/本期累計)。
  9. 需要紙本時按 列印,可選損益表、簡式、本期及累計、月份比較、預算比較等多種格式(報表清單見損益表)。

欄位說明

欄位 必填 說明/格式/預設
年度 西元年 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 才是查詢真正採用的值)。

欄位連動與附加功能

這一節把「在某欄位輸入後、系統會做什麼」「某條件如何改變查詢結果」逐條列出,全部來自實際程式碼。

進入畫面時

  1. 條件面板建立時(IncomeConditionViewModel 建構),系統會把 科目名稱顯示 預設成登入者的語系LanguageEnum = Context.User.Language),覆蓋掉參數預設的「繁體中文」。也就是說,英文使用者進來時科目名稱預設顯示英文。
  2. 其餘條件(年度=今年、起始月份=1、截止月份=當月、部門=ALL、幣別=功能幣、含明細=勾)由 IncomeQueryParameters 建構時呼叫的 ResetToDefault() 帶入。

起始月份/截止月份

  1. 當你輸入 起始月份截止月份,系統會用 Math.Clamp(value, 1, 12) 自動夾限:輸入小於 1 會被改成 1、大於 12 會被改成 12。所以不會出現「第 0 月」或「第 13 月」這種非法區間。
  2. 截止月份決定「算到哪一個月」:查詢時 TotalCalculate 會把大於截止月份的那幾個月(去年同期、本年度、預算三組)全部歸 0。例如截止月份設 6,則 7~12 月的數字一律不計,本期合計只累加起始月~截止月。
  3. 本期合計(當期)只累加「起始月~截止月」之間的數字:PreviousYearCurrentPeriodThisYearCurrentPeriodBudgetCurrentPeriod 三個合計欄,是把區間內各月份相加得來。改月份區間,三欄合計會跟著變。
  4. 查詢後會把條件組成「截止日」:截止日 = 年度/截止月份/該月最後一天SetIncomem 內以 DateTime.DaysInMonth 算出當月最後一天),寫進結果主檔(Incomem)的 EndingDate 欄位,供報表抬頭顯示查詢區間。

年度

  1. 年度同時決定本年度與去年同期兩欄IncomeBllpreviousYear = 年度 − 1,查詢條件抓「去年整年 + 本年度」兩段傳票(傳票日期 like '去年%' or like '本年度%'),分別填入「去年同期」與「本年度」金額。
  2. 只彙算 已過帳(是否過帳=Y)且科目代號 >= '4'(損益類科目)的傳票,未過帳傳票不列入。

部門代號

  1. 保留 ALL(全部門)時,查詢用不分部門的 SP 參數組(Lp_1 = "3"/"4"),彙算全公司損益。
  2. 指定某一個部門時,查詢改用帶部門的參數組(Lp_1 = "31"/"41",並把部門代號當作 LP_P5 傳給 SP),只彙算該部門的損益與預算。
  3. DeptSearch 控件設定 CheckDataExist=false:輸入的部門代號不會在輸入當下檢查是否存在;查不到資料只會讓結果為空,不會擋你輸入。

幣別(功能幣/本幣/集團幣)

  1. 三個 radio 共用 GroupName="Currency",互斥單選;選擇的值決定查詢時 SP 要彙總哪一組金額欄位

    選項 對應彙算欄位
    功能幣(Functional) 借方金額/貸方金額
    本幣(Local) 本借方金額/本貸方金額
    集團幣(Group) 集借方金額/集貸方金額
  2. 換幣別後重按 查詢,整張損益表的金額會以新幣別重新彙算(含去年同期、本年度、預算三欄)。

    原幣不適用損益表

    CurrencyTypeEnum 雖然還有「原幣(OriginalCurrency)」,但損益表面板只提供功能幣/本幣/集團幣三個選項,因為損益表是跨科目彙總、不會用單一原幣表示。

科目名稱顯示(中文/英文)

  1. 兩個 radio 共用 GroupName="LanguageEnum",互斥單選。切到 英文科目名稱 時,結果中的科目名稱(含「營業收入合計」「營業毛利合計」等彙總列名稱)會以英文呈現;切回 科目名稱 則顯示中文。
  2. 彙總列(4ZZZ、5ZZ、5ZZZ、6ZZ、6ZZZ、營業外收入/支出/利益、本期損益)的文字會依此語系,透過 DisplayNameService.GetDisplayNameByUserLanguage 取對應語言的字串。

含明細科目

  1. 勾選(含明細):每一筆明細科目以自己的科目代號(彙總科目 = 科目代號)逐筆呈現,損益表會看到完整的明細科目列。
  2. 不勾選(只到彙總):科目會被歸併到上層——56 開頭的科目取前 2 碼當彙總科目,其餘損益科目取前 4 碼。畫面只顯示彙總後的少數列,適合主管快速看大數。
  3. 不論勾或不勾,營業內外的小計列與「營業收入合計/毛利/利益/本期損益」等合計列都會自動算出(NonOperatingCalculateNonOperatingProfitCalculateTotalCalculate)。

查詢後的整理(影響你看到的列)

  1. 查詢完成後,整年三組金額全為 0 的科目列會被移除TotalCalculateRemoveAll),所以沒有任何發生額的科目不會出現在損益表上。
  2. 結果依 彙總科目 排序呈現,營業外收入/支出的彙總代號會依科目主檔大分類「營業外收入/營業外支出」動態判定(找不到時退回預設 7175)。

常見問題

改了年度或幣別,損益表數字沒變?

損益表是即時彙算,改完條件一定要回主畫面重按 查詢 才會重算。條件面板只是收集參數,本身不會自動觸發查詢。

某些科目在損益表上看不到?

兩個原因:(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/):

  1. incomecondition-step1.png — 條件面板全貌(年度/月份/部門/幣別/科目語言/含明細)
  2. incomecondition-step2.png — 幣別三選一 radio 與「含明細科目」勾選框
  3. incomecondition-step3.png — 條件設定完成後、損益表主畫面的查詢結果(兩個頁籤)