个人记账本-副本
前言
手机自诞生以来不过数十年光景,但其商用及其更新换代的速度却让人难以置信,在谷歌Android大潮席卷市场,苹果iOS系统风靡全球的现在,以往对于虚拟现实、增强现实、高速无线网络、更绚丽的屏幕、更强悍的图形芯片以及多核处理器的畅想早已不再遥远,完全集成在一部小小的智能设备当中。在移动互联网大潮的侵袭下,想必未来的智能手机市场还将掀起一场智能化的革命。手机行业快速的变化需求对手机设计行业提出了更新的要求。
智能手机的已经融入我们的生活当中,社交我们有QQ、微信;影音我们有百度影音、优酷、土豆;金融我们有支付宝、微信支付;网购我们有淘宝、京东,各色各样应用占满了手机存储空间。
李嘉诚说过,“30岁以后,投资理财的重要性逐渐提升,中年时赚多少钱已经不重要,反而是如何管钱比较重要。”如今,随着生活水平的提高,个人投资理财在当今社会变得越来越重要。很多人没有记账的习惯,就会导致钱花完了到头来却不知道花在了什么地方。而使用记账APP,虽然不能帮我们省钱,却能让我们知道自己的钱花在了什么地方。久而久之,就会对自己的消费情况有个了解,学会更好的调配自己的资金,避免乱花钱、花冤枉钱的情况。
本文着重介绍Android记账类应用《个人记账本》,它拥有记账、钱包管理、报表生成、账本分类等功能。相比于同类产品,操作简单、界面清晰、更加简单易用。
1 绪论
1.1 研究背景
Android系统是基于Linux的智能操作系统,2007年11月,Google与84家软件开发商、硬件制造商及电信运营商组建开发手机联盟,共同研发、改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android 的源代码,也就是说Android系统是完整公开并且免费的,Android系统的快速发展,也与它的公开免费不无关系。
随着Android系统的迅猛发展,它已成为全球范围内具有广泛影响力的操作系统。它不仅仅是一款手机操作系统,它还广泛的被应用于平板电脑、电视、数码相机、可佩戴设备,这也造就了目前Android开发人才需求的快速增长。
从2007年11月5日谷歌公司正式向外界展示了这款名为Android的操作系统至今,Android已经经历了多个版本的更新,如今Android 7.0的相关新闻也层出不穷,这意味着新版本即将到来。
1.2 主要技术
1.2.1 Eclipse集成开发环境
Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java 语言开发,通过安装不同的插件,Eclipse可以支持不同的计算机语言,比如Python和C++。Eclipse本身只是一个框架平台,但是有了众多插件的支持,使得Eclipse具有很高的灵活性,许多软件开发商都以Eclipse为框架开发自己的IDE。
Eclipse的插件机制是轻型软件组件化架构。Eclipse所有的附加功能都是由插件提供的,例如支持Java以外的其他语言。已有的分离的插件已经能够支持Ruby、Python、Perl、C/C++、telnet和数据库开发。插件架构能够支持将任意的扩展加入到现有环境中,而决不仅仅限于支持各种编程语言。
Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。
1.2.2 Android技术
Android是基于Linux的自由且开放源代码的操作系统,主要用于便携设备,如平板电脑、智能手机。其系统架构采用了分层的架构,从底层到高层分别是Linux内核层、系统运行库层、应用程序框架层和应用程序层。
Android开发四大组件分别是:活动(Activity):用于表现功能。服务(Service):后台运行服务,不提供界面呈现。内容提供商(Content Provider):支持在多个应用中存储和读取数据,相当于数据库。广播接收器(BroadcastReceiver):用于接收广播。
1.2.3 SQLite
SQLite是一款轻型的、遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经有许多嵌入式产品在使用它,在嵌入式设备有限的资源中,它仅需几百K的内存空间。它支持Windows/Linux/Unix等主流操作系统,同时还能够跟很多主流的程序语言相结合,比如Java 、C#、PHP等,还有ODBC接口。比起PostgreSQL、Mysql这样的著名数据库管理系统来讲,它的处理速度毫不逊色。
1.3 论文的主要研究内容
本课题将实现一个Android平台的记账应用,它为手机用户提供了丰富的功能,便于管理生活中一些理财的问题。具体的研究内容如下:(1)介绍实现系统的主要技术,包括Android技术、SQLite数据库。
(2)使用Android技术开发记账软件。
(3)分模块实现该软件的每个子模块和UI交互。
1.4 本章小结
本章简要介绍了本次课题研究中应用的主要技术以及开发工具,也就是为什么要选择它们的原因。其中包括开发所使用的Android技术以及用于建立数据库的SQLite数据库管理系统,在接下来的开发中均会使用到这些技术与工具。
2 分析与设计
2.1 需求分析
在软件生命周期中,其他阶段都是面向软件技术方面的,只有本阶段是面向用户的。需求分析是对用户的业务活动进行分析的,以便确定在用户的业务环境中软件系统需要“做什么”。
软件需求包括两部分:功能性需求和非功能性需求。虽然功能性需求是对软件系统的一项基本需求,但却并不是唯一的需求。除功能性需求外,软件质量属性的特性,称为系统的非功能性需求。这些特性包括:系统的易用性、执行速度、可靠性,处理异常情况的能力与方式等。在决定系统的成功或失败的因素中,满足非功能性需求往往比满足功能性需求更为重要。
有研究表明,客户对系统的不满意很多因素是因为设计者没有与客户进行良好的沟通而造成的,所以编写需求分析报告要求无歧义性、完整性、可验证性、一致性、可追踪性、运行和维护阶段的可使用性。下面是在我们经过调研后得出的客户需求:
(1)明细界面:显示当前年、月、周、日的收支情况,提供“流水明细”“记一笔”按钮进入对应的功能模块。
(2)钱包界面:管理用户的账户,如现金、支付宝、借记卡、信用卡,查询剩余金额,还可进行转账功能。
(3)报表界面:按时间、分类型地对用户的收支情况进行统计分析。
(4)更多界面:可以设置软件密码,只有密码正确了才能进入该系统,否则无法操作账本内的数据,还有清空数据的功能。
2.2 系统整体设计
根据以上的分析,该软件可按功能集合进行划分,整体结构如图2-1所示:
图2-1 系统结构图
2.3 数据库设计
2.3.1 账本数据库
根据系统设计的分析,本系统需要钱包管理、账本管理、成员管理、收支类型管理、收支明细管理、密码管理这6张表。
账户管理表,需要记录账户名称以及余额。
2.4 本章小结
本章首先对系统进行了需求分析,将客户端分为四个大模块来进行管理,分别是明细、钱包、报表、更多。从四大模块入手,再到各个小功能,逐一实现。同时根据各功能模块的需求,分析哪些数据是需要存储的,从而对数据库进行初步的设计。
3 系统的实现
3.1 系统功能模块实现
MainActivity作为整个程序的入口,采用Fragment来管理明细、钱包、报表,更多四个模块,同时将已经建立好的数据库文件导入,以供存储查询使用。
3.1.1 明细模块
根据上面的分析,在明细界面需要显示年、月、周、日的收支情况,以及需要提供切换账本、记一笔、查看流水明细三个按钮。
(1)显示收支情况:当APP启动的时候,默认进入明细界面,此时需要去查询收支情况,如下代码是查询月收入的语句:
dbHelper.queryMonth(DateUtils.ParseDateToString(calendar.getTime(), "yyyy-MM"), 1, booksId)
其中DateUtils的ParseDateToString是将Date类型的日期转化为指定格式的String类型,因为queryMonth方法的日期参数(即第一个参数)类型被定义为String类型,所以需要统一。第二个参数则是代表收支,“1”为收入,“2”为支出。第三个参数是账本ID。使用这个方法,就查询不同账本在不同月份的收支情况了。其他的年收支、周收支、日收支与此相似,不再赘述。
(2)切换账本:我们实现了一个自定义的弹窗类AlertDialogText,它可以帮助我们显示想要的展示的内容。首先,需要查询数据库中有多少本账本可以给用户选择,于是,我们执行了数据库查询:
booksList = dbHelper.queryBooksList();
queryBooksList方法将查询到的数据赋值给了booksList,然后设置Adapter,Adapter规定了每一个item的样式:
adapterBooks = new QuickAdapter
https://www.wendangku.net/doc/bb8867234.html,yout.item_text_view) {
protected void convert(BaseAdapterHelper helper, Books item) {
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_name, item.books);
}
};
接着为adapater添加数据源:adapterBooks.addAll(booksList);
Adapter已经设置完毕,可以进行展示了。我们为账本按钮添加点击事件,在点击事件中弹出一个窗口进行展示:
tvBooks.setOnClickListener(clickListener);
private OnClickListener clickListener = new OnClickListener(){
@Override
public void onClick(View v) {
switch (v.getId()) {
case https://www.wendangku.net/doc/bb8867234.html,_books:
alertDialogText = new AlertDialogText(
getActivity(), "选择账本", "");
alertDialogText.setGoneButton();
alertDialogText.setListViewAdapter(adapterBooks,
itemClickListener, null);
break;
}
}
};
实现一个弹窗展示就完成了,当用户点击账本切换按钮的时候就会弹出一个窗口,显示了当前所有账本,用户即可点击切换。
(3)记一笔:记一笔是系统中一个重要的功能,无论是想要记录收入状况还是支出状况都可以在此完成。可以设置时间、收入或支出、金额、钱包、成员、类型,对于成员和类型,系统默认提供一些标签,如果用户觉得没有合适的,还可以添加自定义标签。
类型选择、添加、删除等操作,使用了一个GridView直接展示在界面底部,而非前面使用到的弹出窗口,首先查询所有类型,再为设置好每一行的样式,然后为GridView设置Adapter,设置点击事件与长按监听事件,点击的时候即选中当前类型,按住item的时候会弹出删除确认窗口:
typeList = dbHelper.queryTypeList(newDetail.books_id, 1);
adapterType = new QuickAdapter
protected void convert(BaseAdapterHelper helper, Type item) {
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_name, item.type);
}
};
adapterType.addAll(typeList);
gridView.setAdapter(adapterType);
gridView.setOnItemClickListener(itemClickListener);
gridView.setOnItemLongClickListener(itemLongClickListener);
以下是删除功能实现代码,先弹出一个窗口询问用户是否确认要删除,避免误操作造成了不必要的损失,当用户点击确认按钮即确认要删除当前数据,执行后给出成功或失败的提示,告诉用户结果:
private OnItemLongClickListener itemLongClickListener =
new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView> parent, View view,
int position, long id) {
final int pos = position;
if (parent.getAdapter() == adapterType) {
alertDialogText = new AlertDialogText(AddDetailActivity.this, "提示",
"是否要删除类型:" + adapterType.getItem(pos).type + "?");
alertDialogText.setButtonConfirm("确定", new OnClickListener() {
@Override
public void onClick(View v) {
if (dbHelper.deleteType(adapterType.getItem(pos).id) > 0) {
typeList.remove(adapterType.getItem(pos));
adapterType.remove(adapterType.getItem(pos));
alertDialogText.dismiss();
Toast.makeText(AddDetailActivity.this, "类型删除成功",
Toast.LENGTH_LONG).show();
}else{
Toast.makeText(AddDetailActivity.this, "类型删除失败",
Toast.LENGTH_LONG).show();
}
}
});
}
return true;
}};
接下来是添加自定义标签的代码,只需要获取用户输入的名称,并且添加到数据库就可以了,当然,还需要输入内容不能空,添加成功后还要刷新Adapter:
if (typeList.indexOf(adapterType.getItem(i)) == typeList.size() - 1) {
alertDialogText = new AlertDialogText(AddDetailActivity.this,
"添加类型", "");
alertDialogText.setEditTextMsg("", 10);
alertDialogText.setButtonConfirm("确定", new OnClickListener() {
@Override
public void onClick(View v) {
if (alertDialogText.getEditTextMsg() == null ||
alertDialogText.getEditTextMsg().length() == 0) {
Toast.makeText(AddDetailActivity.this, "名称不能为空",
Toast.LENGTH_LONG).show();
return;
}
dbHelper.insertType(alertDialogText.getEditTextMsg(),
newDetail.books_id, newDetail.in_out);
typeList = dbHelper.queryTypeList(newDetail.books_id,
newDetail.in_out);
typeList.add(addT);
adapterType.clear();
adapterType.addAll(typeList);
Toast.makeText(AddDetailActivity.this, "类型添加成功",
Toast.LENGTH_LONG).show();
alertDialogText.dismiss();
}
});
return;
}
(4)流水明细:该界面显示了用户的所有记录,可以按时间查询,使用ListView展示,如果发现某条记录写错了,也可进行删除,重新记录。
3.1.2 钱包模块
在这个界面所要展示的则是一个账户列表,其中显示账户名称和余额,所以使用ListView来作为显示的控件。第一步,查询所有账户资料:accountList = dbHelpser.queryAccountList();
设置Adapter,里面除了设置要显示的数据之外,还为每一行设置一个颜色背景,而颜色则是随机的,用random实现:
adapterAccount = new QuickAdapter
https://www.wendangku.net/doc/bb8867234.html,yout.item_account) {
@Override
protected void convert(BaseAdapterHelper helper, Account item) {
helper.setBackgroundColor(https://www.wendangku.net/doc/bb8867234.html,yout_root, getResources()
.getColor(colors[random.nextInt(max)%(max-min+1) + min]));
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_account_name, ">> " + item.acount);
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_account_blance, "¥" +
DoubleUtils.getFormatTwo(item.balance));
}
};
3.1.3 报表模块
报表功能实现按收支类型查询指定时间内的收支状况,给出百分比柱状图,直接展示了用户在各类型上的收支,同时也统计出所有金额总和。百分比柱状图是用ProgressBar来实现的。例如查询一个月内的收入报表,那么就查询出该月的所有类型的收入金额,进行统计,将某类型的金额除以总金额,得出条状图的百分比。
根据账本、收入或支出、开始时间、结束时间四个条件来查询总金额:
sumMoney = dbHelper.queryReportSumMoney(DetailFragment.booksId, inOut, startDate, endDate);
接着设置Adapter:
adapterReport = new QuickAdapter
https://www.wendangku.net/doc/bb8867234.html,yout.item_report_form) {
@Override
protected void convert(BaseAdapterHelper helper, Report item) {
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_name, item.type);
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_money, "¥" +
DoubleUtils.getFormatTwo(item.money));
helper.setText(https://www.wendangku.net/doc/bb8867234.html,_proportion,
DoubleUtils.getFormatOne((item.money/sumMoney) * 100) + "%");
// 设置条状图百分比
helper.setProgress(R.id.progressBar,
(int)((item.money/sumMoney) * 100));
// 设置文字颜色,收入为红,支出为绿
if (selectPos == 0) {
helper.setTextColor(https://www.wendangku.net/doc/bb8867234.html,_money,
getResources().getColor(R.color.rule_red_dark));
}else{
helper.setTextColor(https://www.wendangku.net/doc/bb8867234.html,_money,
getResources().getColor(R.color.rule_green_light));
}
}
};
3.1.4 更多模块
(1)设置密码:既然是一个账本,有时为了避免他人查看或操作自己的账本,就需要密码功能的存在了。一旦打开密码功能,那么用户就需要输入正确的密码才能进入程序的首页,才能继续才做,密码错误是无法进入的,密码设定长度为4,当输入框的内容长度等于4的时候会自动结束输入,以下是设置密码功能实现:
if (type.equals("set")) {
if (tvTip.getText().toString().equals("请输入4位密码")) {
passFirst = edPass.getText().toString();
tvTip.setText("请再次输入密码");
edPass.setText("");
return;
}
if (tvTip.getText().toString().equals("请再次输入密码")) {
if (passFirst.equals(edPass.getText().toString())) {
// 两次密码相同,存入数据库,设置成功
Toast.makeText(PasswordActivity.this, "密码设置成功", Toast.LENGTH_LONG).show();
dbHelper.insertPass(passFirst);
finishActivity();
}else{
// 两次输入不同则要求重新输入
Toast.makeText(PasswordActivity.this, "密码设置失败", Toast.LENGTH_LONG).show();
tvTip.setText("请输入4位密码");
edPass.setText("");
passFirst = "";
}
}
}
设置好密码之后,每次启动程序就需要验证了,当密码正确的时候则关闭密码验证界面,错误则给出提示,让用户重新输入:
if (type.equals("check")) {
Pass pass = dbHelper.queryPass();
if (pass != null && pass.pass.equals(edPass.getText().toString())) {
finishActivity();
}else{
Toast.makeText(PasswordActivity.this, "密码错误,请重新输入", Toast.LENGTH_LONG).show();
edPass.setText("");
}
}
(2)清空数据:该功能解决的问题是,当用户想初始化系统数据的时候可以方便地解决,无需到手机系统的程序设置里面去情况数据,而且普通手机用户也不一定知道可以这么做。清空数据的实现很简单,只要把数据库数据删除就可以了:
public boolean deleteDatabase(Context context){
return context.deleteDatabase("/data/data/" + context.getPackageName() + "/databases/" + DBNAME);
}
3.2 数据库访问的实现
现在的主流移动设备如iPhone、Android等都是使用SQLite作为复杂数据的存储引擎,对于Android平台而言,系统提供了丰富的API来供开发人员操作SQLite,帮助开发人员完成对数据的存取。
本系统的数据库是在电脑上创建,并初始化默认数据的,所以需要把该数据库文件导入到项目中。当程序第一次运行的时候,会判断项目目录下存不存在数据库文件,如不存在,则导入到项目中,如果存在,则无需导入,以下是实现代码:
InputStream is = this.context.getResources().openRawResource(DB_ID);
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
Android系统提供了一个管理数据库的工具类SQLiteOpenHelper,利用该类,我们可以对数据库的创建、更新以及增删改查进行管理。通过继承SQLiteOpenHelper可以打造我们需要的功能,利用SQLiteDatabase对象的rawQuery( )、insert( )、update( )、delete( )等方法来对数据进程查询、添加、更新和删除等操作,如要查询某个账户的余额:
public double queryAccountMoney(int id){
double money = 0;
Cursor cursor = sqlDb.rawQuery("select balance from " +
Account.class.getSimpleName().toLowerCase() + " where id = " + id, null);
while (cursor.moveToNext()) {
money = cursor.getDouble(0);
}
cursor.close();
return money;
}
此方法将会从account表查询id等于指定值的账户余额balance并返回结果,在查询结束时要记得关闭Cursor,以防内存内漏。
看完了查询功能之后,再来看插入数据的方法,以下方法是新增一条类型的数据,即自定义类型标签的时候所调用的方法:
public long insertType(String type, int booksId, int inOut){
ContentValues contentValues = new ContentValues();
contentValues.put("type", type);
contentValues.put("in_out", inOut);
contentValues.put("books_id", booksId);
return sqlDb.insert(Type.class.getSimpleName().toLowerCase(), null,
contentValues);
}
还有删除与更新的方法:
public int deleteMember(int id){
return sqlDb.delete(Member.class.getSimpleName().toLowerCase(),
"id = ?", new String[]{String.valueOf(id)});
}
public int updateAccountMoney(int id, double balacne){
ContentValues values = new ContentValues();
values.put("balance", balacne);
return sqlDb.update(Account.class.getSimpleName().toLowerCase(),
values, "id = ?", new String[]{String.valueOf(id)});
}
3.3 文件结构和功能
竭诚为您提供优质文档/双击可除个人记账表格模板下载 篇一:个人日常生活开支记账表 20(个人记账表格模板下载)16年10月花销 备注: 篇二:家庭excel记账表格模板的设计思路和方法 家庭excel记账账本模板的设计思路和方法 ---从流水账到复式记账 结婚成家之后,老婆也开始学习记账管理家庭财务了。一开始的时候老婆用的是流水帐,记录简单的进出金额,所以就用excel做了一张简单的表格。使用了一年多,发现流水账的方式问题很大。主要是: 1.现在都流行用信用卡了,用信用卡消费的时候,并没有使用现金。现金是要在还款期时,统一扣除的。可能在我们对账的时候,信用卡还没扣款,造成现金虚多,要做手工的调整。 2.公司公务的开支很多,占有了一大笔现金,但实际上这些钱,随后公司可以报销下来的。这种预缴性质的账务,在做流水账的时候淹没掉了。在报销前,根本想不到公司欠
了个人多少钱。 3.还有现在两个人有很多卡,借记卡、信用卡。在网上有好几个虚拟账户,比如支付宝之类的。并不只有现金一种资产。对账的时候,要把所有的账户余额加总起来,如果与账务不符,根本不知道是哪个账户出现了问题。 4.老婆在淘宝有时候也买卖些产品,进货、出货一般都不会即时支付的。就会产生很多应收应付。 流水账记账方法显然对付不过来了,所以需要考虑复式记账法,所谓的复式记账法,就是在发生一笔收支的时候,在资金变动的账户中记一笔,同时在这笔收支应该归类到的类别账户中也记一笔。这样查资金账户可以了解到资金余额;而查类别账户,可以对类别下所发生的账务情况一目了然。 复式记账的确比流水账在财务管理上要好很多,那么具体如何实现呢?我的设计思路是把账务分成3大块:第一块呢,是实际的资产类别账户,记录的是真正的“真金白银”,这一般对应的是各种银行卡、储蓄账户、证券账户、虚拟货币。第二块呢,是收支归类的类别账户。财务管理就是对收支类别的管理,这样对收支就有分门别类的控制。通常来说,家庭的收支类别可以分类如下(示例): 收入类:薪水、奖金、利息收入、礼金收入 支出类别,有基本的“衣食住行”:食品、服装、居住 支出、交通费。有车族还会有:汽油费、修理费。此外还有
家庭记账分类的常用方法有哪些 家庭记账的分类 家庭日常开支 日常开支账是家庭理财中的第一本账,也是最关键的一本账。注意划分收入和支出,区分它是流入或流出哪个具体账户的。对综合收支事项,进行分解。如将一笔支出分拆为生活费、休闲、利息支出。这样,可方便地查看账户余额,以及对不同账户进行统计汇总及分析,清楚地了解家庭详细的资金流动明细状况。一般来讲,一个家庭的日常收支可以用以下一些账户来统筹:家庭共用的现金(备用金)、各个家庭成员手上的现金、活期存款、信用卡、个人支票。 在做日常开支账时,切忌拖沓延迟。最好在收支发生后及时进行记账。这样可以防止遗漏,因为时间久了,很可能就忘了此笔收支,就算能想起,也容易产生金额的误差。这种不准确的账目记录就失去了记账的意义。另外,及时记账可保证实时监视账户余额,如信用卡透支额。如发现账户透支或余额不够,及时处理可以减少不必要的利息支出或罚款。 家庭交易账 做好了日常收支账后,就要开始关注其他投资交易的情况了,
例如基金账、国债账等等。不同类型的交易,要对应不同的账户。这与日常开支的记账原则完全一致。所有投资的交易记录都要载入这本账目中。比如,定期存款要载入存取款记录,保险则要说明缴纳保费、理赔给付、退返保费、分红等。 家庭预算账 记账只是起步,是为了更好地做好预算。家庭预算是对家庭未来一定时期收入和支出的计划。做好这本账的前提是已经有了日常开支账和交易账。参考过去收支和投资情况,定期(如月底、季度底、年底)比较每项支出的实际与预算,找出那些超标支出项目和结余项目。下一期的预算据此做出调整,从而保证家庭理财目标的实现。 预算关注家庭的理财目标,因为大多数目标都与积累资金有关。使用家庭预算账可以用来监控结余资金的实现。如果没有此预算计划,则很难实现当初设立的理财目标,不管是长期的还是短期的。由于家庭收入基本固定,因此家庭预算主要就是做好支出预算。支出预算又分为可控制预算和不可控制预算,诸如房租、公用事业费用、房贷利息等都是不可控制预算。每月的家用、交际、交通等费用则是可控的,要对这些支出好好筹划,合理、合算地花钱,使每月可用于投资的节余稳定在同一水平,这样才能更快捷高效地实现理财目标。
家庭Excel记账账本模板的设计思路和方法 ---从流水账到复式记账 结婚成家之后,老婆也开始学习记账管理家庭财务了。一开始的时候老婆用的是流水帐,记录简单的进出金额,所以就用EXCEL做了一张简单的表格。使用了一年多,发现流水账的方式问题很大。主要的是: 1. 现在都流行用信用卡了,用信用卡消费的时候,并没有使用现金。现金是要在还款期时,统一扣除的。可能在我们对账的时候,信用卡还没扣款,造成现金虚多,要做手工的调整。 2. 公司公务的开支很多,占有了一大笔现金,但实际上这些钱,随后公司可以报销下来的。这种预缴性质的账务,在做流水账的时候淹没掉了。在报销前,根本想不到公司欠了个人多少钱。 3. 还有现在两个人有很多卡,借记卡、信用卡。在网上有好几个虚拟账户,比如支付宝之类的。并不只有现金一种资产。对账的时候,要把所有的账户余额加总起来,如果与账务不符,根本不知道是哪个账户出现了问题。 4. 老婆在淘宝有时候也买卖些产品,进货、出货一般都不会即时支付的。就会产生很多应收应付。 流水账记账方法显然对付不过来了,所以需要考虑复式记账法,所谓的复式记账法,就是在发生一笔收支的时候,在资金变动的账户中记一笔,同时在这笔收支应该归类到的类别账户中也记一笔。这样查资金账户可以了解到资金余额;而查类别账户,可以对类别下所发生的账务情况一目了然。 复式记账的确比流水账在财务管理上要好很多,那么具体如何实现呢?我的设计思路是把账务分成3大块:第一块呢,是实际的资产类别账户,记录的是真正的“真金白银”,这一般对应的是各种银行卡、储蓄账户、证券账户、虚拟货币。第二块呢,是收支归类的类别账户。财务管理就是对收支类别的管理,这样对收支就有分门别类的控制。通常来说,家庭的收支类别可以分类如下(示例): 收入类:薪水、奖金、利息收入、礼金收入 支出类别,有基本的“衣食住行”:食品、服装、居住支出、交通费。有车族还会有:汽油费、修理费。此外还有购物、教育费、旅游、孝敬长辈等等。每个人都可以根据自己的生活方式,设置自己的收支类别。每个类别的大项下面又可以分为几个小项,例如“居住支出”可以有“水费”“电费”“上网费”等,这里不做具体示意了。 第三块呢,是更大的项目归类。例如:日常可以归一类,装修可以另外分出一类,开销比较大的旅游啊,或者大型的PARTY开销啊,也可以归为一类。或者按人员做项目归类也是可以的。