简单家庭财务管理系统设计Word文档格式.docx
《简单家庭财务管理系统设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《简单家庭财务管理系统设计Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
为了简单起见,本项目就实现家庭财务管理系统的支出方面进行讲解分析。
家庭财务管理系统的概要功能如下:
可以对每天的支出进行记帐,记帐要实现分类:
(1)按不同的支出类型分类。
(2)按不同的消费人员进行分类。
可以对历史数据进行查询,查询要实现的功能是:
(1)指定时间段,可以按类型进行该时间段的支出统计查询。
(2)指定时间段,可以按消费人员进行该时间段的支出统计查询。
(3)指定时间段,可以同时按类型和消费人员进行该时间段的支出统计查询。
根据前文所述的功能需求,在功能上可以分为两个模块:
记帐的功能。
查询并统计的功能。
因此,在操作界面上也应该分两个区域分别为这两个功能提供用户的操作界面:
日常功能:
日常功能就是对日常的开支进行记帐。
统计功能:
统计功能就是根据用户输入的起止时间,对特定的类型和消费人员的支出进行统计。
2.家庭财务管理系统的数据库设计
2.1数据关系分析
数据库的设计,首先应该从数据之间的相互关系入手。
如果数据库系统比较复杂,则还需要进行规范化的项目管理流程,一般的数据库系统开发流程如下:
(1)需求分析阶段
(2)概念结构设计阶段
(3)数据库详细设计阶段
(4)应用程序开发阶段
(5)数据库系统实施阶段
(6)数据库系统运行和维护阶段
2.2E-R图设计
概念模型就是对信息世界的抽象建模,狭义的信息世界可以专指数据库中的数据,那么概念模型就可以理解为对数据库数据的抽象建模。
概念模型最常用的描述方法是E-R图(“实体-联系”图)描述法,E-R图主要有3个要素:
实体:
实体是以矩形表示。
实体就是数据库数据中具有实际意义的主体,如在前文分析的实体就是“消费人员”和“消费品”。
属性:
属性用椭圆表示。
就是实体所拥有的特性,如果是在面向对象程序设计中,可以将“实体”和“属性”对应为“对象”和“对象中的数据成员”的关系。
联系:
联系用菱形表示。
联系是实体与实体之间发生的动作、从属或其他依赖关系。
2.3数据库表的生成
由E-R图生成数据库表是数据库系统研发的必要步骤,如果没有联系,只有单实体或孤立的实体的E-R图,转换方式很简单:
(1)首先将实体名写成数据库表的表名。
(2)然后将实体的属性写成数据库表的属性。
(3)根据实际含义,将设定数据库属性的类型(整型、字符串型或日期类型等)。
(4)设定主码。
Budget表:
Handler表:
Type表:
3.家庭财务管理系统的算法设计
3.1连接数据库
连接数据库的功能是所有数据库应用系统开发的必要过程,本项目采用ADO的连接方式进行连接。
连接数据库的过程如下:
初始化OLE,创建ADO连接。
调用Open()函数,打开本地的数据库文件“Home.mdb”。
为界面读取初始化数据,传递SQL语句选择出相应的数据库元组。
3.2添加数据
为数据库添加数据是数据库开发的重要功能,主要步骤如下:
调用Open()函数打开数据集。
调用AddNew()成员函数,告知系统开始添加数据。
添加数据操作。
调用Update()将添加的数据写回到磁盘的数据库文件中。
调用Close()成员函数关闭数据集。
3.3修改数据库内容
从应用程序种修改数据库的内容关键也在于传递SQL语句,使用SQL的更新语句即可,如下所示:
update表名setDateA='
某日期'
Content='
某内容'
MoneyA=某金额,Handler='
某人'
Type='
某类型'
whereID=某ID;
将该SQL语句存放在strSql字符串变量中,然后再调用Execute()函数执行即可。
代码如下:
m_pConnection->
Execute(_bstr_t(strSql),&
vAffected,adCmdText);
3.4统计数据库信息
统计数据库的信息关键在于使用SQL语句的集函数,就是对数据表中的某属性进行集操作,这里使用的集函数是“和”操作,即“SUM()”函数,代码如下:
selectSUM(MoneyA)asSumMoneyAfromBudgetwhereDateA>
=某日期andDateA<
=某日期andType=某消费品类型andHandler=某消费人;
4.软件项目开发过程
4.1开发家庭财务管理系统项目的流程
4.2根据E-R图创建数据库表
如下所示:
4.3功能研发的准备工作
在实现系统的添加、修改和统计功能之前,需要做一些准备工作,使整个项目的数据库连接和访问等能顺利进行,并使界面可以达到预期目标。
准备工作的工作流程如图所示。
4.3.1为stdafx.h头文件添加ADO连接的支持
#import"
c:
\programfiles\commonfiles\system\ado\msado15.dll"
\no_namespace\
rename("
EOF"
"
adoEOF"
)
4.3.2为界面添加控件ID
界面如下:
4.3.3添加并修改OnInitDialog()类:
代码如下:
BOOLCHomeResDlg:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
//
m_cobAnaType.AddString("
全部类型"
);
m_cobAnaHandler.AddString("
全部人"
m_cobAnaType.SetCurSel(0);
m_cobAnaHandler.SetCurSel(0);
GetSystemTime(&
m_CurTime);
m_CurTime.wDay=1;
m_DateFrom.SetTime(&
m_CurTime.wMonth+=1;
m_DateTo.SetTime(&
//初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些意想不到的错误。
jingzhouxu
try
{
//打开本地Access库Demo.mdb
m_pConnection->
Open("
Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=Home.mdb"
"
"
adModeUnknown);
catch(_com_errore)
AfxMessageBox("
数据库连接失败,确认数据库Demo.mdb是否在当前路径下!
returnFALSE;
}
//从数据库中读入经手人名单和类型名单
_RecordsetPtrpHandlerRecordset;
pHandlerRecordset.CreateInstance(__uuidof(Recordset));
try
pHandlerRecordset->
SELECT*FROMHandler"
//查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
catch(_com_error*e)
AfxMessageBox(e->
ErrorMessage());
_variant_tvar;
CStringstrName;
while(!
pHandlerRecordset->
adoEOF)
var=pHandlerRecordset->
GetCollect("
Handler"
if(var.vt!
=VT_NULL)
strName=(LPCSTR)_bstr_t(var);
m_cobHandle.AddString(strName);
m_cobAnaHandler.AddString(strName);
MoveNext();
pHandlerRecordset->
Close();
pHandlerRecordset.Release();
pHandlerRecordset=NULL;
//////////////////////////////////////////////////////////////////////////
CStringstrType;
_RecordsetPtrpTypeRecordset;
pTypeRecordset.CreateInstance(__uuidof(Recordset));
pTypeRecordset->
SELECT*FROMType"
m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
pTypeRecordset->
var=pTypeRecordset->
Type"
strType=(LPCSTR)_bstr_t(var);
m_cobType.AddString(strType);
m_cobAnaType.AddString(strType);
pTypeRecordset->
pTypeRecordset.Release();
pTypeRecordset=NULL;
//读入当月的记录
CTimeToday=CTime:
GetCurrentTime();
Load(Today.GetMonth(),Today.GetMonth()+1);
m_nHandler=0;
m_nType=0;
UpdateData(FALSE);
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
}
4.4实现算法设计
根据前文所创建的项目,在项目的对话框中设计出前文所示的界面设计。
界面上主要的功能按钮有:
“添加”按钮:
单击该按钮后,将对话框编辑控件的内容添加到数据库。
“修改”按钮:
单击该按钮后,使对话框编辑控件中与数据库对应的内容作出相应的修改。
“统计”按钮:
单击该按钮后,对指定时间段内的数据库内容,分消费品的经手人或消费品种类进行统计,并将统计结果显示在对话框相应的控件中。
4.4.1“添加”按钮的消息处理功能
双击“添加”按钮,添加该按钮的消息处理函数,代码如下:
voidCHomeResDlg:
OnBtnAdd()
UpdateData();
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->
SELECT*FROMBudget"
CStringstrDate,strType,strHandler;
GetDlgItem(IDC_DATETIMEPICKER_DATE)->
GetWindowText(strDate);
m_cobType.GetWindowText(strType);
m_cobHandle.GetWindowText(strHandler);
//添加新记录
m_pRecordset->
AddNew();
PutCollect("
DateA"
_variant_t(strDate));
Content"
_variant_t(m_strContent));
MoneyA"
_variant_t(m_fMoney));
_variant_t(strHandler));
_variant_t(strType));
Update();
m_pRecordset=NULL;
4.4.2“修改”按钮的消息处理功能
双击“修改”按钮,添加该按钮的消息处理函数,代码如下:
OnBtnModify()
//Load(m_tDate.GetMonth(),m_tDate.GetMonth()+1);
if(m_lCurID>
0)
intnCurSel=0;
intnID=0;
CStringstrDate,strType,strHandler;
m_Date.GetWindowText(strDate);
m_cobType.GetWindowText(strType);
m_cobHandle.GetWindowText(strHandler);
CStringstrSql;
strSql.Format("
updateBudgetsetDateA='
%s'
MoneyA=%f,Handler='
whereID=%d"
strDate,m_strContent,m_fMoney,strHandler,strType,m_lCurID);
_variant_tvAffected;
CTimeToday=CTime:
Load(Today.GetMonth(),Today.GetMonth()+1);
4.4.3“统计”按钮的消息处理功能
双击“统计”按钮,添加该按钮的消息处理函数,代码如下:
OnBtnAna()
CStringstrAnaType,strAnaHandler,strDateFrom,strDateTo;
m_DateFrom.GetWindowText(strDateFrom);
m_DateTo.GetWindowText(strDateTo);
m_cobAnaType.GetWindowText(strAnaType);
m_cobAnaHandler.GetWindowText(strAnaHandler);
CStringstrSql,strTemp;
strSql.Format("
=#%s#andDateA<
=#%s#"
strDateFrom,strDateTo);
if(strAnaType!
="
strTemp.Format("
andType='
strAnaType);
strSql+=strTemp;
if(strAnaHandler!
andHandler='
strAnaHandler);
strTemp.Format("
时间:
%s->
%s"
strDateFrom,strDateTo);
m_ResList.AddString(strTemp);
类型:
%s"
经手人:
_RecordsetPtrSumRecordset;
_variant_tvSum;
/*
SumRecordset.CreateInstance(__uuidof(Recordset));
SumRecordset->
Open(_bstr_t(strSql),//查询DemoTable表中所有字段
}*/
SumRecordset=m_pConnection->
vSum,adCmdText);
SumRecordset->
vSum=SumRecordset->
SumMoneyA"
if(vSum.vt!
strTemp.Format("
总计:
¥%.2f元"
(float)vSum);
m_ResList.AddString(strTemp);
else
m_ResList.AddString("
¥0.00元"
SumRecordset->
m_ResList.AddSt