2014年11月30日星期日

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第十日/超時第三日>


上圖的四個 Query 就是 Financial Position Statement 及 Income Statement 的 Datasets. 如果你有基本的 Accounting 底子, 應該可以四個表所對應的不同部份. 雖然看上去一切準備就緒, 但其實還欠缺了一項至關重要的資料, 就是 Stock .

如何評價 Stock 一直是 Accounting 的藝術範圍, 以前我們不是用 FIFO 就是 LIFO, 而且是用 At Cost 來計算 (當然除了藝術中的藝術 - W.I.P.). 近年 IFRS 大力推動以 Fair Values 來計算資產價值使 Financial Statements 更好地反映實際的狀況, 希望使到行內的藝術範圖縮小. 然而, 什麼是 Fair Values 呢? 說穿了其實就是依賴會計師的 Professional Judgement, 換句話說就是 "將藝術理性化".

但是在我這一個 Project 來說, 這些都不重要, 因為在這裡, Stock 就是 Investing Interests, 而這些 Interests 大多是有公認的市價, 那 Fair Values 的問題就不存在了. 或許你會想我是不是計不了市價, 所以才只弄出四個 Datasets. 當然不是, 自動以系統內最新價格來計算 Investing Interests 的功能早在 Matching 那時候已實作了出來. 真正令我停下的, 是如何表現 Financial Position Statement 及 Income Statement.

首先說說 Financial Position Statement 的公式:

Assets + Stock = Equity + Profit + Liabilities

即是如果我知道 Assets, Stock, Equity 及 Liabilities 的數值, 我就可以倒迫出 Profits 出來, 列式如下:
Assets + Stock - Equity - Liabilities = Profit 

由於所有數值都是用 Double Entry 方法來獲取, 即使不計算 Income Statement 中任何一粒數, 我這個 Profit 都不會出錯. 甚至可以進一步擴展這公式去得到 Retained Profit 及 Current Profit. 設以下公式中的 T=Day of Report, n=Days of Period:

Assets(T)-Assets(T-n-1)+Stock(T)-Stock(T-n-1)-Equity(T)+Equity(T-n-1)-Liabilities(T)+Liabilities(T-n-1) = Current Profit 

Assets(T-n-1)+Stock(T-n-1)-Equity(T-n-1)-Liabilities(T-n-1) = Retained Profit 

當然, 實際一點的方法是應該 Closing Account, 把 Retained Profit 以數值形存到 Table 內, 但如果只是個人用的 Accounting, 我想使用者未必需要或懂得如此處理. 用公式去處理 Retained Profit 及 Current Profit 還有兩個更大的好處: 第一, 就是報表時間長短的自由度; 第二, Income Statement 的處理可以切割開來.

Income Statement 的處理都是大同小異, 先看看公式:

Income/Sales - Cost of Goods Sold - Indirect Expenses = Profit 
&
Opening Stock + Purchase + Direct Expenses - Closing Stock = Cost of Goods Sold

即可以簡化成:

Income/Sales - Opening Stock - Purchase - Direct Expenses + Closing Stock - Indirect Expenses = Profit

進一步指明時間範圍就可以得到 Current Profit:

Income/Sales(n) - Stock(T-n-1) - Purchase(n) - Direct Expenses(n) + Stock(T) - Indirect Expenses(n) = Current Profit

以一條公式來檢查 Financial Position Statement 及 Income Statement 在某時間範圍(n)內的值是否相等:

Assets(T)-Assets(T-n-1)+Stock(T)-Stock(T-n-1)-Equity(T)+Equity(T-n-1)-Liabilities(T)+Liabilities(T-n-1) = Income/Sales(n)-Stock(T-n-1)-Purchase(n)-Direct Expenses(n)+Stock(T)-Indirect Expenses(n) 

看到了嗎? Accounting 其實就是套套邏輯. 

寫這篇其實是為了弄清自己的思緒... (>o<)


2014年11月29日星期六

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第九日/超時第二日>


今日主要是加了三個有關 Investment 的 Form,分別是用來檢視 Market Price History (左下),用來 Update 個別 Security 的 Market Price Updater (右上),及不作區分的 Market Price Updater (右下)。

在寫這篇東西時,突然發覺 Market Price History 的左欄目有點多餘,或許在 Fine Tuning 階段會弄走它,以減少所佔用的記憶體。

在這裡,我想首先解釋一下為什麼叫 Matching,其實這是有點 "精神勝利法" 的意味。以一般小投資者如我,通常我們在買股票時,有一個不經意的預設思想就是:All In All Out,但其實在投資世界中,我們應該把自己的投資視作可隨意分割的餅仔,更重要的是記錄不同的倉位。而 Matching 就是用來實現這些的手段。

假設我上年以84元買入了三手匯豐,今年年頭匯豐卻跌到落76元,但我唔認輸再入三手,即我現在擁用6手匯豐,而平均每股作價80元。可這該死的匯豐就是上唔返去80元以上,死死地停在78元,那點算呢? 

這種情況下,最簡單的就是,全部出清6手,認賠算數,再等下次機會。另一種就是先賣三手,鎖定那三手的利潤,然後再謀定而後動。做法簡單,但如何記錄呢? 市場時時刻刻在變,情況絕不會如此簡單。賣出買入,一隻股票可能來來去去幾十次,那如何準確知道自己此時此刻手持的倉位?

答案就是用 Matching 去記錄不同的買賣組合,並以此推算每一隻持有或曾經持有的股票中未結清倉位。

Investment 相關的 Data Entry,Matching 及 Market Price 都已經做好,接下就是 Balance Sheet 及 Income Statement 的事了。

下圖是增加了三筆投資記錄後的 Cash Flow Statement,可以與在前篇的比較一下有什麼不同。雖然資料還未齊全,但架構已經肯定是 Work 的。



如果你有興趣想進一步了解什麼是 Cash Flow Statement,可以到下列網址參考:



2014年11月28日星期五

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第八日/超時第一日>


第八日, Cash Flow Statement 初稿完成!! 如上圖所顯示的, Cash Flow Statement 好像很簡單的樣子, 但是, 其原理可不是那麼直觀. 在簡單的背後, 組成 Cash Flow Statement 的物件其實包括了: 五個 Tables, 四條 Queries 及 三個 Reports.

這個 Cash Flow Statement 可以再水平擴展, 顯示每一個 Cash Flow Statement Type 的 In / Out 數, 也可以向下顯示 Cash Flow Statement Type 中的每一個 Account 的 In / Out 數.


另一方面 Personal Quick Statistic Reports 亦已經準備好. 左手邊的那個報表是整體八個項目的統計圖表, 而右手邊的是每一個項目獨立的統計報告.

整個 '扭計骰' 概念就是讓使用者可以快速找出自己的消費習慣, 而無需理會 Accounting 的事情.

好了, 拖拉了好幾天, 明天要回到 Investment 上去啦... 這次是一定的!!!




2014年11月27日星期四

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第七日>


跳票的情況比我想像中還要嚴重,除了因工事太忙外,我心又真的太多,太貪又太野。。。

上圖的是'扭計骰'相關的報表,可以見到除了 Account Balance 之外,還可以看到在該 Account 內的 Schedule,其實還可以再向下擴充顯示該 Subject 的 Daily Transaction Total。

雖然上一篇說要解決 Investment 相關的報表,但我想我還是會先把 Cash Flow Statement 弄出來,而且會採用 IFRS (ISA 7) 的 Direct Method 來設計。可是昨天我又發現很有趣的 Free Cash Flow Statement,看得我有點心癢癢想試試弄出來。。。

經過多秒的反覆思想,我決定剩下的路線圖要如何走:
1。Cash Flow Statement
2。Investment
3。Balance Sheet & Income Statement
4。User Control
5。Fine Tuning

好了,明天開始'超時階段'。 現在去搵周公先,請呀!!


2014年11月24日星期一

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第六日>



第六天, 今天花了很多時間在輸入測試用的資料上, 因為是時候要知道最初想的資料結構有沒有出問題.

入了資料, 就可以設計 Report , 上圖是三款最基本的 Accounting Report: General Journal, Ledger 及 Trial Balance. Running Balance 當然是一定要的, 但是在 Microsoft Access 中, Running Balance是不需要在 VBA 裡大費周張地Dim這Dim那, 可也不是簡單地在 Report 的Property中Enable "Running Balance" 選項那麼直接, 就是有一點技巧的啦, 這些都會在之後的番外篇中說明.

基本 Accounting 的東西已經弄妥, 接下來就是回到 Investment 這一 part, 亦是我從未完整實作過的東西. 但正如黎天王的金句: "要贏人, 先要贏自己!" , 不挑戰自己, 又如何推展自己的極限呢?



明天已經是第七天, 看來我的七日鮮鐵定要跳票了...


2014年11月23日星期日

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第五日>


看來我的七日鮮很有可能變成十日鮮。。。

今日還是在和 Deal Closing 纏鬥,但最後達成到我想要的自動化程度,這兩天的時間花的很值得。這兩次我好像患上了強迫症, 強迫自己不可以走彎路, 挑戰自已的邏輯推理能力... 其實我很享受這種忘我的感覺, 可是我知道很快Access將再給不了我這種充實的感覺...

隨著兩個主要的Interface完成, 之後就是種種玩弄Data的花巧表現及Report, 當然包括昨天提及的"扭計骰"啦.

話說回來, 我又修改了一些最底層的東東... 唉!


2014年11月22日星期六

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第四日>


第四日, 基本將Deal Closing Form (DC) 整個砍掉重鍊, 現在個Form自動根據使用者的選擇回饋更多資訊, 而另一方面, 在選擇那一筆交易來結清時, 系統會自動顯示那一筆交易尚未結清的餘數, 及該筆交易的每單位價格.

今天洗澡時, 突然靈光一閃, 立即衝出浴室回到電腦前, 弄出了上圖左上角類似"扭計骰"的東東. 那這個東西是什麼來的呢, well, 又是一樣玩弄數字的花巧東西囉.

雖然, 在一開始時, 已經告誡自己不要追求太多花巧的功能, 但心癮這回事嘛, 你懂的... 而結果是什麼呢? 還未達到目標的三份之一, 已經寫了過百行的code (唔計VBA自己generate那些), 半百的objects. 

明天後天, 看來我要開盡個turbo...


2014年11月21日星期五

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第三日>


昂然踏入第三日,因為工作煩重,所以沒有花太多時間在這project之上。雖則如此,但也不是毫無進展。今日在這兩個最主要的user interface上已經增加了不少自動化功能。

先說說在master voucher有什麼自動化功能,包括double entry的autofill,auto voucher numbering,及眾多可以簡化資料輸入的控制項等。

而在deal closing上,一樣有auto voucher numbering,但功能則主要集中在細部。在細部之中,已經整合了master voucher 的 deal transaction,user只需選擇某一特定的buy或sell,其他資料如 security name, type 及該筆交易未結清的剩餘數量。

我在這些自動化的過程中,並沒有使用太多coding的技巧,反而是大量使用了query 作為dataset,我會在七日後的番外篇多加講解。

2014年11月20日星期四

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第二日>


雖然理論上,TABLE設好了就盡量不要改動,但有時候 "原則" 還是要放一邊的。。。遠目中

我自已有個很怪的習慣,就是喜歡將Form建立在Query之上,而不是直接用Table,不知道為什麼就是不喜歡。所以你會看到有一堆aaq開頭的Query,那些就是為了我這古怪的習慣而來。

今天主要是弄輸入資料的Form,上圖右手邊的那些就是了。這些我都是用Datasheet來設計,目的是增快輸入的速度,減少使用者不必要的操作,雖然看上簡單,但我也有使用到ComboBox及混合Query來進一步加強便利性。

中間的那一個大Form則是今次設計的兩個主角其中之一。這個Form分為三個部份,最上的是標題資料,中間是會計資料,底部則是投資資料。三個部份都有不少的code要寫,來增加實用性。而在上方的則是我在模仿現在很流行的方塊式設計,這個四方的東西是一個按鈕,來控制底部投資區塊是否出現,之後的列印及其他功能按鈕都應該會用同一style來設計。

有興趣的朋友可以比較下圖與昨天的那一張有什麼不同,然後你就會明白我為什麼一開首就要感歎一番。

明天則會是另一個主角出場,Deal Closing Form。




2014年11月19日星期三

DATABASE七日鮮 - OaccPFA2014 建構全記錄 <第一日>


第一日的工程其實沒有什麼特別, 就是依照心中的意念來設計不同 TABLE. 這一次的設計重點是放在如何記錄金融投資的交易, 而這意念則是來自於自身的經驗.

TABLE的設計要點最主要盡量簡單, 不加插太多花巧的FIELD, 但同時又可以達成以下功能

1. DOUBLE ENTRY 
2. BALANCE SHEET 
3. INCOME STATEMENT
4. CASH FLOW STATEMENT
5. DEALS CLOSING STATEMENT

如果留心上圖, 你會發覺真正要花時間輸入的FIELD其實不多, 我盡量將有重複性的DATA都獨立成一個個TABLE, 即使用者只需輸入一次該等DATA, 往後就可以重複使用.

另一個特別之處是, 我在每一個TABLE都設計了雙重INDEX, 第一個INDEX是系統自動編配, 第二個INDEX則需要使用者自行輸入. 這種設計是為了避開某些RELATIONAL DATABASE天生的限制, 又同時可以享受到其邏輯結構.

最後, 我比較擔心的是, 使用者在設定某些如CASH FLOW STATEMENT的屬性時會感到困惑. 但暫時我又未想到比較好的方法... 唯有邊寫邊想吧.

好了, 明天將會是基本的FORM.