用C++编写个人理财软件
?
用C++編寫個人理財軟件
?
學生:劉明偉? 指導老師:謝中科
?
摘? 要?? 本課程設計主要解決個人日常生活中收入與支出等進行記錄的程序設計.在課程設計中,系統開發平臺為Windows xp,程序設計開發環境采用Microsoft visual studio2005,數據庫采用Microsoft Access 2003,程序運行平臺為Windows 98/2000/XP。對于收入支出進行記錄,在程序設計中,采用了面向對象解決問題的方法。程序通過調試運行,初步實現了設計目標,并且經過適當完善后,將可以應用在商業中為個人解決簡單的實際問題。
?
關鍵詞?程序設計;數據庫;SQL;c++;個人理財
?
1 引言
? ?隨著時代的進步、社會的發展,人們越來越富裕走向小康的時候一個問題凸現出來,就是個人理財。
?
1.1課題背景
??? 理財的目的,在追求不虞遺乏的豐富人生,是以經濟學為精神、會計學為基
礎、財務學為手段的一門實用科學。
為什么要理財?
每個人都希望過幸福美滿的生活,但是你首先應自問有沒有這樣的能力?房子、車子、股票、珠寶…?? //系統生成代碼,略去…?? //系統生成代碼,略去,在某些人眼里是財富的象征,生活品質的保證,是他們努力追求的價值。 也有許多所謂的有錢人,寧愿選擇平平淡淡的生活,辛勤工作、努力儲蓄,他們不認為華麗的外表相可以代表高水準的生活品質。不過,顯然大多數人一生中都是無法滿足的。
心理學家馬斯洛的需求理論告訴我們,人類的需求是有層級之分的:在安全無虞的前提下追求溫飽,當基本生活條件獲得滿足之后,則需求得到社會的尊重;并進一步追求人生的最終目標自我實現。 而要依層級滿足這些需求,必須建立在不虞遺乏的財務條件上。因此,你必須認識理財的重要,訂定一套適合自己的理財計劃,來達成自己的生活目標。
我們知道,追求效益極大化是經濟學的基本精神,即說以最小的代價,獲得最大的收益。但這并非表示我們吝于付出,因為資源是有限的,稀少的資源,迫使我們必須做選擇,而理財行為就是聰明的選擇。我們付出代價最少、收益最大的一條路,讓有限的資源得以發揮最大的效用。
而對于我們能擁有的、以及想要爭取的,透過會計學對財富流量及存量的記錄,客觀地顯現在資產負債表以及損益表上,可以幫助我們看清自己的財務狀況,進而規劃出符合我們的需求、能力可及的財務目標。 對于資金的籌措及運用,財務學可以提供我們最佳的策略及方法,以最少的成本取得資源,并做好有效的分配,因應景氣循環及環境的變化,配合目標定出自己的資產組合。[1]
?
1.2個人理財軟件的目的
俗話說“你不理財,財不理你”,只有通過合理的理財,才能夠有效的管理你的個人資產的合理運用。個人理財軟件不僅可以幫你記帳,更多的是可以實時掌握你的收入與支出,掌握資金的變動情況,同時還可以統計出資金的主要流向,從而更合理的分配資金。本課題將達到以下幾個目的:
(1)??? 清晰簡便明了的操作,減少不必要的精力消耗
傳統的個人理財軟件中,有大量的冗余功能,使用戶的大部分精力將耗費在了解復雜的界面與繁瑣的操作上,而作為缺少個人理財所應具有的簡便明了的特點。通過此個人理財軟件,用戶可以將絕大部分精力放在對數據的研究上,而不是無意義的操作上。
(2)??? 提供更好的服務
個人理財軟件可以較迅速、有效地收集各種個人財務信息,用戶可以直接從系統中獲得自己所需的個人財務信息,并根據相關的信息做出決策和相應的行動方案。
(3)??? 降低成本
個人理財軟件沒有繁瑣的操作,簡便易懂的操作使用戶減少了上手時間,降低了使用成本。
2個人理財軟件可行性分析
?
2.1技術可行性
??? 個人理財軟件為管理軟件,因而數據庫的設計與操縱是系統設計的核心。我在課程設計期間學習了數據庫的有關知識,具備一定的能力,能進行基本的數據庫的設計與操作;該軟件沒有追求過份復雜的功能,因而該軟件的實現在技術上是可行的。
2.2人員可行性
??? 我個人在課程設計期間多處獲取資料進行學習,進而對程序的實現有了一定的了解
??? 大一的上學期學習了c++,具有了一定功底,可以進行軟件的設計與開發。
??? 所以該軟件的實現在人員上是可行的。
2.3軟件工作量
??? 制作該軟件的工作量相對于我來說較大,必須保證按進度完成任務。實際工作量預計超過一個月(每天2小時)。如包含相應知識的學習,文檔的制作等。
2.4代碼工作量
??? 預計需3天左右。
2.5文檔要求
??? 依據國家《計算機軟件產品開發文件編制指南》和《現代軟件工程》的理論與原則編制標準的軟件技術文檔。
3個人理財軟件需求分析
根據實地考查我們可以先畫出本系統的一個總框架圖如下圖3-1所示;
???????????????????? ??????圖3_1 系統總體框架圖
3.1收入數據輸入
“收入數據輸入” 功能模塊用于記錄收入信息,包含的子功能模塊如圖3-2所示。
圖3-2 “收入數據輸入”功能模能塊
?對于個人理財行為來說,不需要太過于復雜的記錄,對于收入的記錄只需要包含收入的日期、金額、類型、及個人需要添加的說明。
?
3.2支出數據輸入
?“支出數據輸入”功能模塊用于記錄支出的相關信息,包含的子功能模塊如圖3-3所示。
??????????????????? 圖3-3“支出數據輸入”功能模塊
與收入數據輸入類似,對于支出的記錄只需要包含收入的日期、金額、類型、及個人需要添加的說明。
?
3.3收入支出數據統計
“收入支出數據統計”功能模塊用于統計某天、某月、或某年的收入支出情況,包含的子功能模塊如圖3-4所示
?
?
?
?
?
?
?
?
?
?
圖3-4“收入支出數據統計”功能模塊
?? 本模塊可以方便直觀的展示近期的收入支出情況。
?
3.4數據繪圖模塊
?? 本模塊通過從數據庫中讀取數據然后繪圖,按年繪圖,繪制一年每個月的收入、支出、收入支出總和,這樣可以更加直觀形象的展現出個人的財務情況。本模塊功能由于本人技術原因尚未實現,正在研究中。
?
3.5數據庫分析
?根據以上的需求分析,該課程一共需要4張表,分別存放相應的數據信息,其中支出數據表和收入數據表是關鍵表,用于存放基礎數據信息。其它兩個表記錄收入和支出的類型。
?(1) 主要實體圖
????
圖3-5收入數據實體與屬性圖
?
圖3-6支出數據實體與屬性圖
?
??? ?(2) 個人理財軟件表清單
???????????????????????? 表3.1 個人理財軟件清單
Money | 保存收入的信息 |
MoneyOut | 保存支出的信息 |
Type | 保存收入類型的信息 |
TypeOut | 保存支出類型的信息 |
?
?
4程序實現
?
Visual C++資源通常由窗體、模塊和類模塊等構成。在“工程資源管理器”中,可以對窗體、模塊和類模塊進行管理。窗體是Visual C++程序中必不可少的資源。它可以實現程序的外觀顯示,添加程序代碼,實現需要的功能。模塊可以用來管理全局常量、變量和用戶自定義函數等。在一個工程中可以有多個模塊同時存在。本次設計用類來管理數據庫中的每個表,類的成員變量對應表中的每個列,類的成員函數則實現對表的各種操作,例如添加、修改、刪除和讀取數據等。
?
4.1系統主界面設計
當軟件運行時顯示系統主界面。
(1)軟件主界面
進入程序后,出現軟件主界面。主界面對話框如圖4-1所示。
?
圖4-1 軟件主界面
? 主界面如圖4-1所示,在此界面可以直接單擊想使用的的模塊的按鈕。
?
4.2收入數據模塊
(1)單擊【收入數據】按鈕,進入【收入數據】功能窗體,如圖4-2所示。
?
?
圖4-2收入數據窗口
?
?
在窗口中可以看到有收入日期、收入存儲在數據庫中的記錄號、收入的金額、收入的類型和收入的說明,還有用一對數據進行操作的幾個按鈕,分別是移動記錄的四個按鈕(按順序跟別是移動到第一條、移動到前一條、移動到下一條、移動到最后一條)、“添加記錄”、“刪除記錄”和用以退出收入窗口的“確定”按鈕。
當按照正確的格式輸入數據后,點擊“添加記錄”彈出對話框4-3,提示成功,當以不正確的格式填寫點擊“添加記錄”后,由于程序沒有再次添加異常處理機構,會出現對話框4-4,此時點擊“確定”,重新按照正確格式填寫即可。
4-3添加記錄成功
?????????????????? ???
圖4-4? 添加記錄格式錯誤
?
?????要想刪除某一條記錄,則移動到此記錄,點擊“刪除記錄”,若成功刪除則彈出如圖4-5所示的對話框。
?圖4-5刪除記錄成功
?
(2)本模塊詳細信息?
? 本模塊結構簡單,它由對數據庫進行基本操作的功能,能夠管理數據庫中記錄的收入數據,例如收入日期、金額、類型、說明等,可以直接在窗體內的控件對的各條記錄進行操作。單擊【添加記錄】按鈕可以將新的的記錄存入數據庫,但是由于本人技術有限的原因,新添加的記錄只有在再次打開“收入數據”對話框時才可以查詢得到。
?
4.3支出數據模塊
(1)支出數據窗口
該窗體的主要功能是對支出數據進行操作,與收入數據窗口相似。如圖4-6所示:
???????????????????????????4-6支出數據窗口
?
??(2)本模塊詳細信息?
???? 本模塊操作與收入信息模塊相同,各種信息也基本相同。
?
5數據統計模塊
?
5.1數據統計模塊界面
數據統計模塊的界面如圖5-1所示:
?
5-1數據統計模塊界面
?
?
在下拉菜單中選擇某項將會在下面的編輯框中輸出相應的數據。效果如圖5-2所示:
?
?
6 ?異常處理
程序在執行時經常會出現一些違反設計期望的異常情況(如除零),過去的解決方法是利用操作系統中斷代為處理。由于這種解決方法強行中止了應用程序的運行,一些大型的應用系統的開發人員提出,可以在允許的范圍內由應用程序自身來處理一般性的程序運行錯誤。C++語言異常處理由三個部分構成。異常檢測的觸發、異常檢測的捕獲和異常檢測的處理[3]。它們分別對應了“try”、“throw”和“catch”三個關鍵字。這三者的關系如圖5-1所示。
圖6-1C++.NET異常處理流程圖
被throw語句扔出的數據實際上被壓入了相應層的catch語句所對應的堆棧內,最后才被catch語句捕獲到的。當try語句出現嵌套時,情況可能會更加復雜。
?????????????????
7本軟件關鍵技術簡介
?
7.1動態連接數據庫
???? 通過使用CDatabase類與數據進行連接,而不需要添加數據源,這樣避免了軟件移植到其他計算機上需要在添加數據源的麻煩,也使計算機操作水平不高的人可以方便的使用本軟件。
?
?
CDatabase類
要建立與數據源的連接,首先應構造一個CDatabase對象,然后再調用CDatabase的Open成員函數.Open函數負責建立連接,其聲明為
virtual BOOL Open( LPCTSTR lpszDSN, BOOLbExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = “ODBC;”, BOOLbUseCursorLib = TRUE ); throw( CDBException, CMemoryException );
參數lpszDSN指定了數據源名(構造數據源的方法將在后面介紹),在lpszConnect參數中也可包括數據源名,此時lpszDSN必需為NULL,若在函數中未提供數據源名且使lpszDSN為NULL,則會顯示一個數據源對話框,用戶可以在該對話框中選擇一個數據源.參數bExclusive說明是否獨占數據源,由于目前版本的類庫還不支持獨占方式,故該參數的值應該是FALSE,這說明數據源是被共享的.參數bReadOnly若為TRUE則對數據源的連接是只讀的.參數lpszConnect指定了一個連接字符串,連接字符串中可以包括數據源名、用戶帳號(ID)和口令等信息,字符串中的"ODBC"表示要連接到一個ODBC數據源上.參數bUseCursorLib若為TRUE,則會裝載光標庫,否則不裝載,快照需要光標庫,動態集不需要光標庫. 若連接成功,函數返回TRUE,若返回FALSE,則說明用戶在數據源對話框中按了Cancel按鈕。若函數內部出現錯誤,則框架會產生一個異常。[2]?
?
7.2 在程序中使用SQL對數據庫進行操作??
? SQL 的誕生于IBM 公司在加利福尼亞San Jose 的試驗室中在七十年代SQL由這里
開發出來最初它們被稱為結構化查詢語言Structured Query Language 并常常簡稱為sequel。
?
SQL 是操作和檢索關系型數據庫的事實上的標準語言它允許程序員和數據庫管理員
做如下的工作
1 更改數據庫的結構
2 更改系統的安全設置
3 增加用戶對數據庫或表的許可權限
4 在數據庫中檢索需要的信息
5 對數據庫的信息進行更新[3]???????????????????????
?
?
?
?
致?? 謝
?
在這次C++的課程設計中,曾遇到過不少問題,單靠我個人的努力,很難按時完成該課程設計,在此,我衷心感謝我的指導老師龍鵬飛教授和謝中科老師。老師認真負責的工作態度,嚴謹的治學精神和深厚的理論水平都使我獲益非淺。另外,還要感謝學校領導、班主任、各位同學對我們的關懷、幫助,為我們提供了良好的設計環境以及各方面的支持。
另再次感謝龍鵬飛教授和謝中科老師,龍教授和謝老師在我做課程設計期間給我很多無私的幫助,使我能夠學習到很多東西。
?
結束語
本程序在對數據庫進行的操作上方便性很強,不需要用戶添加數據源這一點極大地方便了用戶的使用。通過使用CDatabase類與CRecordset類能直接對數據庫進行操作,其優點是顯而易見的。
通過本次課程設計,我學會了數據庫編程的部分知識,能夠進行較簡單的程序開發。
?
參考文獻
?
[1]個人理財的意義. http://www.gsyh.com/simple/index.php?t8533.html.
[2]CDatabase類.???http://ivanvic.blogbus.com/
[3]王永宏.《SQL 21 日自學通(V1.0)》?? 網上的FREEBOOK
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
附錄 A 個人理財軟件源程序代碼
//程序名稱:FinancingDlg.cpp
//程序功能:主窗口的類
//程序作者:劉明偉
//最后修改日期:2007-7-5
?
#include "stdafx.h"
#include "Financing.h"
#include "FinancingDlg.h"
#include "InDlg.h"
#include "Statistic.h"
#include "DrawDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于應用程序“關于”菜單項的CAboutDlg對話框
class CAboutDlg : publicCDialog
{
…?? //系統生成代碼,略去
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
??? CDialog::DoDataExchange(pDX);
}
?
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CFinancingDlg 對話框
CFinancingDlg::CFinancingDlg(CWnd* pParent /*=NULL*/)
??? :CDialog(CFinancingDlg::IDD, pParent)
{
??? m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
?
void CFinancingDlg::DoDataExchange(CDataExchange* pDX)
{
??? CDialog::DoDataExchange(pDX);
}
?
BEGIN_MESSAGE_MAP(CFinancingDlg, CDialog)
??? ON_WM_SYSCOMMAND()
??? ON_WM_PAINT()
??? ON_WM_QUERYDRAGICON()
??? //}}AFX_MSG_MAP
??? ON_BN_CLICKED(IDC_BUTTON_IN,&CFinancingDlg::OnBnClickedButtonIn)
??? ON_BN_CLICKED(IDC_BUTTON_OUT,&CFinancingDlg::OnBnClickedButtonOut)
??? ON_BN_CLICKED(IDC_BUTTON_STATISTIC,&CFinancingDlg::OnBnClickedButtonStatistic)
??? ON_BN_CLICKED(IDC_BUTTON_GRAPHIC,&CFinancingDlg::OnBnClickedButtonGraphic)
END_MESSAGE_MAP()
// CFinancingDlg 消息處理程序
?
BOOL CFinancingDlg::OnInitDialog()
{
??? CDialog::OnInitDialog();
??? …?? //系統生成代碼,略去
}
?
void CFinancingDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
??? …?? //系統生成代碼,略去
}
?
// 如果向對話框添加最小化按鈕,則需要下面的代碼
//? 來繪制該圖標。對于使用文檔/視圖模型的MFC 應用程序,
//? 這將由框架自動完成。
?
void CFinancingDlg::OnPaint()
{
??? …?? //系統生成代碼,略去
}
?
//當用戶拖動最小化窗口時系統調用此函數取得光標顯示。
//
HCURSOR CFinancingDlg::OnQueryDragIcon()
{
??? return static_cast<HCURSOR>(m_hIcon);
}
?
void CFinancingDlg::OnBnClickedButtonIn()? //打開“收入數據”對話框
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CInDlg dlg;
??? dlg.DoModal();
}
?
void CFinancingDlg::OnBnClickedButtonOut()? //打開“支出數據”對話框
{
??? // TODO: 在此添加控件通知處理程序代碼
??? COuttDlg dlg;
??? dlg.DoModal();
}
?
void CFinancingDlg::OnBnClickedButtonStatistic()?? //打開“數據統計”對話框
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CStatistic dlg;
??? dlg.DoModal();
}
?
void CFinancingDlg::OnBnClickedButtonGraphic()??? //打開“數據曲線”對話框
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CDrawDlg dlg;
??? dlg.DoModal();
}
?
//程序名稱:InDlg.cpp
//程序功能:實現收入數據窗口的各功能。
//程序作者:劉明偉
//最后修改日期:2007-7-5
// InDlg.cpp : 實現文件
//
?
#include "stdafx.h"
#include "Financing.h"
#include "InDlg.h"
?
// CInDlg 對話框
?
IMPLEMENT_DYNAMIC(CInDlg, CDialog)
?
CInDlg::CInDlg(CWnd* pParent /*=NULL*/)
??? :CDialog(CInDlg::IDD, pParent)//在此函數中實現連接數據庫
{
??? CString path;????????????????? //定義變量用于存儲程序的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath()); //連接數據庫
???m_db.OpenEx(path);?????????????? //初始化
???m_rs.m_pDatabase=&m_db;???????//數據庫連接關聯
???m_rs.Open(AFX_DB_USE_DEFAULT_TYPE,_T("SELECT* FROM [Money]"));//打開表
??? m_Now = 0;
??? m_Count = 0;
??? for(; !m_rs.IsEOF(); m_rs.MoveNext())//檢索表
??? {
??????? m_Count++;
??????? m_Now++;
??? }
??? if(m_Now!=1&&m_Count>0)?? //到達第一條記錄
??? {
???????m_rs.MoveFirst();
??????? m_Now=1;
??? }
}
?
CInDlg::~CInDlg()
{
???m_rs.Close();m_db.Close();?? //關閉記錄集
}
?
void CInDlg::DoDataExchange(CDataExchange* pDX)
{
??? ..
}
?
?
BEGIN_MESSAGE_MAP(CInDlg, CDialog)
?//?? ON_BN_CLICKED(IDC_BUTTON1,&CInDlg::OnBnClickedButton1)? //隱藏了添加收入類型的功能
…?? //系統生成代碼,略去
END_MESSAGE_MAP()
?
?
// CInDlg 消息處理程序
CString CInDlg::GetAppPath()?//隱藏了添加收入類型的功能
{
??? CStringstrPath;????????????????? //定義變量用于存儲程序的路徑
??? WCHARexePath[MAX_PATH];?????? ???//定義變量用于存儲程序的路徑
???GetModuleFileName(NULL,exePath,MAX_PATH);????????????? //數組表示exe文件路徑
??? strPath.Format(_T("%s"),exePath);???????????????????? //字符串表示exe文件路徑
???strPath=strPath.Left(strPath.ReverseFind('\\'));?????? //刪除exe文件名
??? return strPath;
}
void CInDlg::OnOK()???????//“確定”按鈕
{
??? // TODO: 在此添加專用代碼和/或調用基類
???? CDialog::OnOK();
}
?
void CInDlg::OnShowWindow(BOOL bShow, UINT nStatus) //在此函數中初始化收入類型控件
{
???CDialog::OnShowWindow(bShow, nStatus);
?
??? // TODO: 在此處添加消息處理程序代碼
??? m_Type.ResetContent();???????? //清除所有數據
??? CDatabase db;????????????????? //定義一個對象用于對據庫進行操作
??? CString path;????????????????? //定義一個變量用于存儲程序所處的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath());//連接數據庫
???db.OpenEx(path);???? ??????????//初始化
??? CRecordset??? rs( &db );???????? //數據庫連接關聯
???rs.Open(AFX_DB_USE_DEFAULT_TYPE,_T("SELECT* FROM [Type]"));//打開表
??? for(; !rs.IsEOF(); rs.MoveNext())?? //檢索表
??? {
??????? CStringstr;????????????
???????rs.GetFieldValue(L"Type",str);//在當前表檢索字段數據
???????m_Type.AddString(str);//向列表框中添加項
??? }
??? rs.Close();?????????? //關閉記錄集
??? db.Close();?????????? //關閉記錄集
}
?
void CInDlg::OnBnClickedButtonFirst()?? //將記錄移動到最前一條
{
??? // TODO: 在此添加控件通知處理程序代碼
??? if(m_Count>0)
??? {
??????? m_Now = 1;
??????? m_rs.MoveFirst();???????????????? //移動到第一條記錄
??????? CStringti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值
???????m_rs.GetFieldValue(L"Time",ti);??
???????m_rs.GetFieldValue(L"Money",mo);?
???? ???m_rs.GetFieldValue(L"Type",ty);??
???????m_rs.GetFieldValue(L"About",ab);?
?????? m_InID.SetWindowTextW(id);??????? //將變量顯示在相應控件中
???????m_Time.SetWindowTextW(ti);???????
???????m_Money.SetWindowTextW(mo);??????
???????m_Type.SetWindowTextW(ty);???? ???
???????m_About.SetWindowTextW(ab);?????
??? }
}
?
void CInDlg::OnBnClickedButtonBack()
{
??? // TODO: 在此添加控件通知處理程序代碼
???
??? if(m_Now>1 &&m_Count>0)
??? {
??????? m_Now--;//如果當前記錄號不是第一條則向前移動一條
???????m_rs.MovePrev();//移動到前一條記錄
??????? CString ti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值
???????m_rs.GetFieldValue(L"Time",ti);??
???????m_rs.GetFieldValue(L"Money",mo);?
???????m_rs.GetFieldValue(L"Type",ty);??
???????m_rs.GetFieldValue(L"About",ab);?
?????? m_InID.SetWindowTextW(id);??????? //將變量顯示在相應控件中
???????m_Time.SetWindowTextW(ti);???????
???????m_Money.SetWindowTextW(mo);??????
???????m_Type.SetWindowTextW(ty);???????
???????m_About.SetWindowTextW(ab);??
??? }
}
?
void CInDlg::OnBnClickedButtonNext()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? if(m_Now<m_Count &&m_Count>0)
??? {
??????? m_Now++;
???????m_rs.MoveNext();
??????? CStringti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
? ?? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值
??????? m_rs.GetFieldValue(L"Time",ti);??
???????m_rs.GetFieldValue(L"Money",mo);?
???????m_rs.GetFieldValue(L"Type",ty);??
???????m_rs.GetFieldValue(L"About",ab);?
?? ?? m_InID.SetWindowTextW(id);??????? //將變量顯示在相應控件中
???????m_Time.SetWindowTextW(ti);???????
?? ?????m_Money.SetWindowTextW(mo);??????
???????m_Type.SetWindowTextW(ty);???????
???????m_About.SetWindowTextW(ab);??
??? }
}
?
void CInDlg::OnBnClickedButtonLast()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? if(m_Count>0)
??? {
??????? m_Now =m_Count;
?????? m_rs.MoveLast();
?????? CStringti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值
???????m_rs.GetFieldValue(L"Time",ti);??
???????m_rs.GetFieldValue(L"Money",mo);?
???????m_rs.GetFieldValue(L"Type",ty);??
???? ???m_rs.GetFieldValue(L"About",ab);?
?????? m_InID.SetWindowTextW(id);??????? //將變量顯示在相應控件中
???????m_Time.SetWindowTextW(ti);???????
???????m_Money.SetWindowTextW(mo);??????
???????m_Type.SetWindowTextW(ty);???????
???????m_About.SetWindowTextW(ab);??
??? }
}
?
void CInDlg::OnBnClickedButton2()????????? //本函數用于添加記錄
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CDatabase db;????? //定義一個對象用于對據庫進行操作
??? CString path;????? //定義一個變量用于存儲程序所處的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath()); //連接數據庫
???db.OpenEx(path);?? //初始化
??? CStringti,ty,ab,mo,id;????? // 定義變量?分別存儲時間、種類、說明、金額、本條記錄的ID
??? m_InID.GetWindowTextW(id);?? //將變量顯示在相應控件中
???m_Time.GetWindowTextW(ti);?
???m_Type.GetWindowTextW(ty);??
???m_About.GetWindowTextW(ab);
???m_Money.GetWindowTextW(mo);?
??? CString sql;?????? //定義一個對象? 用于對數據庫進行操作
??? sql.Format(L"insert into [Money]([Time],[Type],[About],[Money])values('%s','%s','%s',%s)",ti,ty,ab,mo);//將由控件獲得的變量值添加到記錄中
??? db.ExecuteSQL(sql);//執行sql語句
AfxMessageBox(L"添加記錄成功!");//提示添加記錄成功
?? db.Close();//與數據庫斷開連接
??? m_Count++;
???
}
?
void CInDlg::OnBnClickedButtonInDel()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CDatabase db;????????????? //定義一個對象用于對據庫進行操作
??? CString path;????????????? //定義一個變量用于存儲程序所處的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath());? //連接數據庫
???db.OpenEx(path);????? //初始化
??? CString id;?????????? // 定義變量? 存儲本條記錄的ID
??? m_InID.GetWindowTextW(id);?? //將變量顯示在相應控件中
??? CString sql;??????? //定義一個對象? 用于對數據庫進行操作
??? sql.Format(L"delete * from ([Money]) where ID=%s",id);//將當前記錄刪除
??? db.ExecuteSQL(sql);//執行sql語句
??? AfxMessageBox(L"刪除記錄成功!");//提示刪除記錄成功
??? db.Close();//與數據庫斷開連接
??? m_Count--;
}
//程序名稱:OuttDlg.cpp
//程序功能:完成支出數據窗口的功能。
//程序作者:劉明偉
//最后修改日期:2007-7-5
// OuttDlg.cpp : 實現文件
//
?
#include "stdafx.h"
#include "Financing.h"
#include "OuttDlg.h"
?
// COuttDlg 對話框
?
IMPLEMENT_DYNAMIC(COuttDlg, CDialog)
?
COuttDlg::COuttDlg(CWnd* pParent /*=NULL*/)
??? :CDialog(COuttDlg::IDD, pParent)
{
CString path;????????????????? //定義變量用于存儲程序的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath()); //連接數據庫
???m_db.OpenEx(path);?????????????? //初始化
???m_rs.m_pDatabase=&m_db;???????//數據庫連接關聯
???m_rs.Open(AFX_DB_USE_DEFAULT_TYPE,_T("SELECT* FROM [MoneyOut]"));//打開表
??? m_Now = 0;
??? m_Count = 0;
??? for(; !m_rs.IsEOF(); m_rs.MoveNext())//檢索表
??? {
??????? m_Count++;
??????? m_Now++;
??? }
??? if(m_Now!=1&&m_Count>0)?? //到達第一條記錄
??? {
???????m_rs.MoveFirst();
??????? m_Now=1;
??? }
}
?
COuttDlg::~COuttDlg()
{
????????m_rs.Close();m_db.Close();?? //關閉記錄集
}
?
void COuttDlg::DoDataExchange(CDataExchange* pDX)
{
??? CDialog::DoDataExchange(pDX);
??? …?? //系統生成代碼,略去
}
?
BEGIN_MESSAGE_MAP(COuttDlg, CDialog)
? //?ON_BN_CLICKED(IDC_BUTTON1, &COuttDlg::OnBnClickedButton1) ?//隱藏了添加支出類型的功能
???ON_BN_CLICKED(IDC_BUTTON2, &COuttDlg::OnBnClickedButton2)
???ON_BN_CLICKED(IDC_BUTTON3, &COuttDlg::OnBnClickedButton3)
???ON_BN_CLICKED(IDC_BUTTON4, &COuttDlg::OnBnClickedButton4)
???ON_BN_CLICKED(IDC_BUTTON5, &COuttDlg::OnBnClickedButton5)
???ON_BN_CLICKED(IDC_BUTTON6, &COuttDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_OutDel,&COuttDlg::OnBnClickedOutDel)
?
??? ON_WM_SHOWWINDOW()
END_MESSAGE_MAP()
?
?
// COuttDlg 消息處理程序
?
/*
void COuttDlg::OnBnClickedButton1()?? //此函數可用于添加收入類型,隱藏
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CDatabase db;
??? CString path;
???path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath());
???db.OpenEx(path);
??? CString ty;
???m_Type.GetWindowTextW(ty);
??? CString sql;
???sql.Format(L"insert into [Type]([Type]) values('%s')",ty);
???db.ExecuteSQL(sql);
???AfxMessageBox(L"add success");
??? db.Close();
???m_Type.AddString(ty);
}*/
?
void COuttDlg::OnBnClickedButton2()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? if(m_Count>0)
??? {
??????? m_Now = 1;
???????m_rs.MoveFirst();????? //移動到第一條記錄
??????? CStringti,ty,ab,mo,id;????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);?//為變量賦值
???????m_rs.GetFieldValue(L"Time",ti);
???????m_rs.GetFieldValue(L"Money",mo);
???????m_rs.GetFieldValue(L"Type",ty);
???????m_rs.GetFieldValue(L"About",ab);
???????m_Time.SetWindowTextW(ti);? //將變量顯示在相應控件中
???????m_Money.SetWindowTextW(mo);
???????m_Type.SetWindowTextW(ty);
???????m_About.SetWindowTextW(ab);
?????? m_OutID.SetWindowTextW(id);
??? }
}
?
void COuttDlg::OnBnClickedButton3()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? if(m_Now>1 &&m_Count>0)
??? {
??????? m_Now--;?? //如果當前記錄號不是第一條則向前移動一條
???????m_rs.MovePrev();?? //移動到前一條記錄
??????? CStringti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值??
???????m_rs.GetFieldValue(L"Time",ti);
???????m_rs.GetFieldValue(L"Money",mo);
???????m_rs.GetFieldValue(L"Type",ty);
???????m_rs.GetFieldValue(L"About",ab);
???????m_Time.SetWindowTextW(ti);????????//將變量顯示在相應控件中
? ??????m_Money.SetWindowTextW(mo);
???????m_Type.SetWindowTextW(ty);
???????m_About.SetWindowTextW(ab);
?????? m_OutID.SetWindowTextW(id);
??? }
}
?
void COuttDlg::OnBnClickedButton4()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? if(m_Now<m_Count &&m_Count>0)
??? {
????? ??m_Now++;
???????m_rs.MoveNext();
??????? CStringti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值??
???????m_rs.GetFieldValue(L"Time",ti);
???????m_rs.GetFieldValue(L"Money",mo);
??????? m_rs.GetFieldValue(L"Type",ty);
???????m_rs.GetFieldValue(L"About",ab);
???????m_Time.SetWindowTextW(ti);????????//將變量顯示在相應控件中
???????m_Money.SetWindowTextW(mo);
???????m_Type.SetWindowTextW(ty);
???????m_About.SetWindowTextW(ab);
?????? m_OutID.SetWindowTextW(id);
??? }
}
?
void COuttDlg::OnBnClickedButton5()
{
??? // TODO: 在此添加控件通知處理程序代碼
???? if(m_Count>0)
??? {
??????? m_Now =m_Count;
???????m_rs.MoveLast();
??????? CStringti,ty,ab,mo,id;?????????? // 分別存儲時間、種類、說明、金額、本條記錄的ID
?????? m_rs.GetFieldValue(L"ID",id);???? //為變量賦值??
???????m_rs.GetFieldValue(L"Time",ti);
???????m_rs.GetFieldValue(L"Money",mo);
???????m_rs.GetFieldValue(L"Type",ty);
???????m_rs.GetFieldValue(L"About",ab);
???????m_Time.SetWindowTextW(ti);????????//將變量顯示在相應控件中
???????m_Money.SetWindowTextW(mo);
???????m_Type.SetWindowTextW(ty);
???????m_About.SetWindowTextW(ab);
?????? m_OutID.SetWindowTextW(id);
??? }
}
CString COuttDlg::GetAppPath()??? //取得程序所處路徑
{
??? CString strPath;
??? WCHARexePath[MAX_PATH];
???GetModuleFileName(NULL,exePath,MAX_PATH);? //數組表示exe文件路徑
??? strPath.Format(_T("%s"),exePath);????????????????? //字符串表示exe文件路徑
???strPath=strPath.Left(strPath.ReverseFind('\\'));?????? //刪除exe文件名
??? return strPath;
}
void COuttDlg::OnBnClickedButton6()//添加記錄
{
??? // TODO: 在此添加控件通知處理程序代碼
???
??? CDatabase db;??? //定義一個對象用于對據庫進行操作
??? CString path;??? //定義一個變量用于存儲程序所處的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath()); //連接數據庫
???db.OpenEx(path);??? //初始化
??? CStringti,ty,ab,mo,id;????? // 定義變量?分別存儲時間、種類、說明、金額、本條記錄的ID
???m_Time.GetWindowTextW(ti);?? //為變量賦值
???m_Type.GetWindowTextW(ty);
???m_About.GetWindowTextW(ab);
???m_Money.GetWindowTextW(mo);
??? m_OutID.GetWindowTextW(id);
??? CString sql;?????? //定義一個對象? 用于對數據庫進行操作
??? sql.Format(L"insert into [MoneyOut]([Time],[Type],[About],[Money])values('%s','%s','%s','%s')",ti,ty,ab,mo);//將由控件獲得的變量值添加到記錄中
??? db.ExecuteSQL(sql);//執行sql語句
??? AfxMessageBox(L"添加記錄成功!");
??? db.Close();
??? m_Count++;
???
}
?
?void COuttDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
???CDialog::OnShowWindow(bShow, nStatus);
?
??? // TODO: 在此處添加消息處理程序代碼
???m_Type.ResetContent();?? //清空下拉列表中的內容
??? CDatabase db;
??? CString path;
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath());//連接數據庫
??? db.OpenEx(path);
??? CRecordset??? rs( &db );
???rs.Open(AFX_DB_USE_DEFAULT_TYPE,_T("SELECT* FROM [TypeOut]")); //從數據庫中取得類型數據
??? for(; !rs.IsEOF(); rs.MoveNext())
??? {
??????? CString str;
???????rs.GetFieldValue(L"Type",str); //將類型數據賦值給變量
??????? m_Type.AddString(str); ???//將數據填充到下拉列表中
??? }
??? rs.Close();
??? db.Close();
}
?
void COuttDlg::OnBnClickedOutDel()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CDatabase db;????????????? //定義一個對象用于對據庫進行操作
??? CString path;????????????? //定義一個變量用于存儲程序所處的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath());? //連接數據庫
???db.OpenEx(path);????? //初始化
??? CString id;?????????? // 定義變量? 存儲本條記錄的ID
??? m_OutID.GetWindowTextW(id);?? //將變量顯示在相應控件中
??? CString sql;??????? //定義一個對象? 用于對數據庫進行操作
??? sql.Format(L"delete * from ([MoneyOut]) where ID=%s",id);//將當前記錄刪除
??? db.ExecuteSQL(sql);//執行sql語句
??? AfxMessageBox(L"刪除記錄成功!");//提示刪除記錄成功
??? db.Close();//與數據庫斷開連接
??? m_Count--;
}
void COuttDlg::OnOK()
{
??? // TODO: 在此添加專用代碼和/或調用基類
???
??? CDialog::OnOK();
}
?
//程序名稱:Statistic.cpp
//程序功能:實現數據統計窗口的功能。
//程序作者:劉明偉
//最后修改日期:2007-7-5
// Statistic.cpp : 實現文件
//
#include "stdafx.h"
#include "Financing.h"
#include "Statistic.h"
?
// CStatistic 對話框
?
IMPLEMENT_DYNAMIC(CStatistic, CDialog)
?
CStatistic::CStatistic(CWnd* pParent /*=NULL*/)
??? :CDialog(CStatistic::IDD, pParent)
{
}
?
CStatistic::~CStatistic()
{
}
?
void CStatistic::DoDataExchange(CDataExchange* pDX)
{
???CDialog::DoDataExchange(pDX);
??? DDX_Control(pDX,IDC_COMBO1, m_Set);
??? DDX_Control(pDX,IDC_EDIT1, m_In);
??? DDX_Control(pDX,IDC_EDIT2, m_Out);
??? DDX_Control(pDX,IDC_EDIT3, m_IO);
}
?
BEGIN_MESSAGE_MAP(CStatistic, CDialog)
???ON_CBN_SELCHANGE(IDC_COMBO1, &CStatistic::OnCbnSelchangeCombo1)
END_MESSAGE_MAP()
?
?
// CStatistic 消息處理程序
CString CStatistic::GetAppPath()? //獲得程序所處的路徑
{
??? CString strPath;
??? WCHARexePath[MAX_PATH];
???GetModuleFileName(NULL,exePath,MAX_PATH);? //數組表示exe文件路徑
??? strPath.Format(_T("%s"),exePath);????????????????? //字符串表示exe文件路徑
???strPath=strPath.Left(strPath.ReverseFind('\\'));?????? //刪除exe文件名
??? return strPath;
}
void CStatistic::OnCbnSelchangeCombo1()
{
??? // TODO: 在此添加控件通知處理程序代碼
??? CStringin,out,sio;??
??? int io,iin,iout;
??? CDatabase db;????? //定義一個對象用于對據庫進行操作
??? CString path;????? //定義一個變量用于存儲程序所處的路徑
??? path.Format(L"Driver={Microsoft Access Driver(*.mdb)};DBQ=%s\\data.mdb", GetAppPath());? //連接數據庫
???db.OpenEx(path);? //初始化
??? CString sql;???? // 定義變量? 分別存儲時間、種類、說明、金額、本條記錄的ID
??? SYSTEMTIMEsys,sys2;
??? GetLocalTime(&sys ); //取得現在的時間
??? GetLocalTime( &sys2);//取得現在的時間
??? int i = m_Set.GetCurSel();//確定被選擇的項
??? switch(i)??????//根據選擇的項進行相應運算
??? {
??? case 0://day???? //如果選擇了“日”進行的運算
??????? if(sys.wDay>1)
??????? {
???????????sys.wDay=sys.wDay-1;
??????? }
??????? else
??????? {
??????????? if(sys.wMonth>1)
??????????? {
???????????????sys.wMonth=sys.wMonth-1;
??????????????? switch(sys.wMonth)
??????????????? {
??????????????? case 1:sys.wDay=31;break;
??????????????? case 2:sys.wDay=28;break;
??????????????? case 3:sys.wDay=31;break;
?????????????? ?case4:sys.wDay=30;break;
??????????????? case 5:sys.wDay=31;break;
??????????????? case 6:sys.wDay=30;break;
??????????????? case 7:sys.wDay=31;break;
??????????????? case 8:sys.wDay=31;break;
??????????????? case 9:sys.wDay=30;break;
??????????????? case 10:sys.wDay=31;break;
??????????????? case 11:sys.wDay=30;break;
??????????????? }
??????????? }
??????????? else
??????????? {
???????????????sys.wMonth=12;
???????????????sys.wDay=31;
???????????????sys.wYear=sys.wYear-1;
??????????? }
??????? }
?? ?????break;
??? case 1://week???????????????? //如果選擇了“周”進行的運算
??????? if(sys.wDay>7)
??????? {
???????????sys.wDay=sys.wDay-7;
??????? }
??????? else
??????? {
??????????? if(sys.wMonth>1)
??????????? {
???????????????sys.wMonth=sys.wMonth-1;
?????????? ?????switch(sys.wMonth)
??????????????? {
??????????????? case 1:sys.wDay=31-7+sys.wDay;break;
??????????????? case 2:sys.wDay=28-7+sys.wDay;break;
??????????????? case 3:sys.wDay=31-7+sys.wDay;break;
??????????????? case 4:sys.wDay=30-7+sys.wDay;break;
? ??????????????case5:sys.wDay=31-7+sys.wDay;break;
??????????????? case 6:sys.wDay=30-7+sys.wDay;break;
??????????????? case 7:sys.wDay=31-7+sys.wDay;break;
??????????????? case 8:sys.wDay=31-7+sys.wDay;break;
??????????????? case 9:sys.wDay=30-7+sys.wDay;break;
??????????????? case 10:sys.wDay=31-7+sys.wDay;break;
??????????????? case 11:sys.wDay=30-7+sys.wDay;break;
??????????????? }
??????????? }
??????????? else
??????????? {
???????????????sys.wMonth=12;
???????????????sys.wDay=31-7+sys.wDay;
?????? ?????????sys.wYear=sys.wYear-1;
??????????? }
??????? }
??????? break;
??? case 2://month??????????? //如果選擇了“月”進行的運算
??????? if(sys.wMonth>1)
??????? {
???????????sys.wMonth=sys.wMonth-1;
??????? }
??????? else
??????? {
???????????sys.wMonth=12;
?????? ?????sys.wYear=sys.wYear-1;
??????? }
??????? sys.wDay=28;
??????? break;
??? case 3://year???????????? //如果選擇了“年”進行的運算
?????? {
???????????sys.wYear=sys.wYear-1;
?????? }
??????? sys.wDay=28;
??????? break;
?
??? }
??? sql.Format(L"SELECT * FROM [Money] where [Time] between#%4d/%02d/%02d# and #%4d/%02d/%02d#"
???????????,sys.wYear,sys.wMonth,sys.wDay,sys2.wYear,sys2.wMonth,sys2.wDay);
??? CRecordset??? rs( &db );//定義CRecordset類的一個對象一對數據庫進行操作
???rs.Open(AFX_DB_USE_DEFAULT_TYPE,sql);//打開記錄集
??? iin=0;
??? for(; !rs.IsEOF(); rs.MoveNext())//檢索記錄集
??? {
???????rs.GetFieldValue(L"Money",in);//在當前表檢索字段數據
??????? int ttti;
???????ttti=_wtof(in.GetString());
??????? iin=iin+ttti;
??? }
???
??? rs.Close();//關閉記錄集
??? sql.Format(L"SELECT * FROM [MoneyOut] where [Time] between #%4d/%02d/%02d#and #%4d/%02d/%02d#"
?????????,sys.wYear,sys.wMonth,sys.wDay,sys2.wYear,sys2.wMonth,sys2.wDay);//查詢符合條件的記錄
??? CRecordset??? rs2( &db );//數據庫連接關聯
???rs2.Open(AFX_DB_USE_DEFAULT_TYPE,sql);// 打開記錄集
??? iout=0;
??? for(; !rs2.IsEOF(); rs2.MoveNext())//檢索記錄集
??? {
???????rs2.GetFieldValue(L"Money",out);//在當前表檢索字段數據
??????? int ttti;
???????ttti=_wtof(out.GetString());
??????? iout=iout+ttti;
??? }
??? rs2.Close(); //關閉記錄集
??? db.Close();? //關閉記錄集
??? in.Format(L"%d",iin);//給變量賦值
??? out.Format(L"%d",iout);
???m_In.SetWindowTextW(in);
???m_Out.SetWindowTextW(out);
??? io=iin-iout;
??? sio.Format(L"%d",io);
???m_IO.SetWindowTextW(sio);//在控件中顯示
}
//程序名稱:DrawDlg.cpp
//程序功能:實現根據收入支出數據繪圖功能,此功能尚未成功實現。
//程序作者:劉明偉
//最后修改日期:2007-7-5
-------程序功能多次努力未能成功實現,無法給出源代碼----------------
總結
以上是生活随笔為你收集整理的用C++编写个人理财软件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的性格是什么颜色——记录乐嘉的性格色彩
- 下一篇: 大漠长空孤烟直,吾自翔天遨竟游!