用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++编写个人理财软件,转载请注明来源!