自己来当“管家婆”——编一个家庭记账软件
编程爱好者
本期,笔者为大家介绍用PowerBuilder6.5编写的一个家庭记账软件,它简单易用。通过本文你可以了解到PowerBuilder是如何通过ODBC接口和SQL Anywhere数据库相连接的,以及使用PowerBuilder来设计MIS系统的简单方法。软件界面如图1所示,它的使用非常简单。

一、程序和数据库的连接
本程序采用的数据库是SQL Anywhere 5.0,它和程序的连接是通过ODBC进行的,通常在软件设计完成时需要手工配置数据源。本程序在这一点上通过代码直接把手工配置数据源的过程写在了程序里,从而避免了非专业人员使用本程序时配置数据源的麻烦。下面是应用对象的open事件中配置数据源的代码:
currentdir=Space(256)
//获取SQL Anywhere数据库目录
GetCurrentDirectoryA(256,currentdir)
strings_value_drive,s_value_starts_value_drive=currentdir+"\anywhere\wod50t.dll"
s_value_start=currentdir+"\anywhere\dbeng50.exe"
//写注册表
string s_ODBC3="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources"
RegistrySet(s_ODBC3,'jtjz','Sybase SQL Anywhere 5.0')
string s_ODBC4="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\jtjz"
RegistrySet(s_ODBC4,'AutoStop','yes')
RegistrySet(s_ODBC4,'DatabaseFile',currentdir+'\jtjz.db')
RegistrySet(s_ODBC4,'DatabaseName','jtjz')
RegistrySet(s_ODBC4,'Driver',s_value_drive)
RegistrySet(s_ODBC4,'PWD','sql')
RegistrySet(s_ODBC4,'Start',s_value_start)
RegistrySet(s_ODBC4,'UID','dba')
SQLCA.DBMS = profilestring("jtjz.ini","database","DBMS","")
SQLCA.DBParm =profilestring("jtjz.ini","database","dbparm","")
SQLCA.AutoCommit = false
connect using sqlca;//连接数据库
if sqlca.sqlcode<>0 then
messagebox("错误","不能连接到数据库!"+SQLCA.SQLERRTEXT,StopSign!)
halt
end if
open(w_jzmx)
在这段代码中GetCurrentDirectory
A()是引用的Windwos下的一个API函数,目的是返回当前应用程序的工作目录。
二、设计操作界面
如图1所示,在窗口打开时,“收入”单选钮被默认选中,表示这时录入的是你的收入情况。只单击“录入”按钮就可以进行录入了,默认情况下“操作时间”和“收入时间”都自动设为当前系统日期,收入时间可以改动。录入完毕后就可以单击“保存”按钮把数据提交到数据库中了,如果录入有误还可以用“删除”按钮来删除记录,“打印”按钮可以用来打印当前窗口中的明细。
查询功能是该软件的一大特色,单击“查询”按钮可以分别按“收入时间”、“收入摘要”和“收入金额”三个字段进行查询。如果单击“查询”按钮就会弹出如图2所示的查询条件的窗口,根据“时间”、“摘要”和“金额”三个单选钮的选择不同,对应的查询条件输入框也不相同。对于“时间”查询条件是一个日期区间段。“摘要”是按照“收入摘要”中的关键字进行查询的。“金额”也是一个数据值区间段,用来查询收入金额大于等于起始值而小于等于终止值的明细记录。

下面是“确定”按钮的clicked事件代码:
if rb_1.checked=true then//按时间查询
w_jzmx.dw_1.SetFilter("sj>=date('"+em_1.text+"')"+" and sj <=date('"+em_2.text+"')")
w_jzmx.dw_1.Filter( )
end if
if rb_2.checked=true then//按摘要查询
if sle_zhaiyao.text="" then
messagebox("","请输入关键字。")
return
else
w_jzmx.dw_1.Setfilter("zy like '"+'%'+sle_zhaiyao.text+'%'+"'")
w_jzmx.dw_1.Filter()
end if
end if
if rb_3.checked=true then//按金额查询
string Var2
string Var1
Var1 = em_3.text
Var2 = em_4.text
if em_3.text="" then Var1="0"
if em_4.text="" then Var2="0"
w_jzmx.dw_1.SetFilter(" je >= "+Var1+" and je<= "+Var2+" ")
w_jzmx.dw_1.Filter( )
end if
close(Parent)
根据三个单选钮的checked属性值是否为真来判断哪一个单选钮控件被选中了,而执行相应的查询代码。
三、 报表的生成
在收入明细和支出明细的窗口中可以完成明细记录的录入和查询。当然通过查询方式也可得到一个时间段中你的收入和支出的合计金额,但这种方式查看起来不是很直观,于是我在本程序中设计了一个按月统计的收入、支出、余额的汇总表,如图3所示。

这个窗口是在收入和支出明细窗口录入数据的前提下自动生成的,现在只显示了到2005年8月的数据,只要在明细窗口中录入9月的数据后这里就会自动加上9月的汇总数据了。通过本窗口可以一目了然地看到每个月的收入、支出以及节余情况。这个汇总报表是用SQL语句写成的一个数据窗口,其代码如下:
SELECT sr_zc_mx.ny,sum(sr_zc_mx.srje), sum(sr_zc_mx.zcje)//查询年月、收入、支出
FROM sr_zc_mx
//按年月参数分组并排序
GROUP BY sr_zc_mx.ny
ORDER BY sr_zc_mx.ny
可以看出,语句非常简单,所以在设计信息管理系统时,大家首先要把数据库中的表设计得尽可能科学合理,这样在以后写SQL语句时就会省很多劲。
“支出比例”、“收入比例”和“余额比例”三个单选钮,分别以不同的图形曲线方式显示出了每个月支出、收入以及余额的比例关系,可以很直观地看出哪个月支出多了,然后通过明细查询出具体的支出情况。
以上程序下载网址:http://www.cpcw.com/xz/37shenghuo.rar
以上程序是利用SQL Anywhere小型数据库实现典型财务程序的一个案例,对家庭用户和小型办公室用户都很有参考价值。仔细分析每部分功能代码,它都运用了数据库的规范操作和典型的SQL语句,并不难。同时可以看出,合理使用开发工具的控件(本例是报表控件)将大幅度提高开发效率。