
既然是模拟就简单多了。“转账”就是把一个账户的钱减掉,加到另一个账户上。因为用户/商家和银行账户是分开的表,需要做表连接查询。
因为不知道你用什么数据库,连接数据库的就不写了。用户,银行和商家3模块在当前情况下就是数据库的3张表:其关键字段如下:
用户表:手机号、卡号(银行账户的卡号)
商家表:商家编号、卡号(银行账户的卡号)
银行帐户:卡号、账户余额
Dim cnn as New ADODB.Connection
Dim rst as New ADODB.Recordset
Dim rsAccount as New ADODB.Recordset
'初始化变量cnn,连接数据库
'查询余额。查询手机号”12345678900"的用户的余额。这里默认一个手机号对应一个账户
rst.Open "select 账户余额 from 银行账户 join 用户表 on 银行账户.卡号=用户表.卡号 where 用户表.手机号='"12345678900'", cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
if rst,Recordcount=0 then
msgbox '该手机对应的卡号不存在!"
else
'显示余额 rst.Fields("账户余额")
end if
rst.close
'支付转账,从用户A(手机12345678900)转500到商家B(编号222)
‘转出
rst.Open "select 银行账户.卡号 from 银行账户 join 用户表 on 银行账户.卡号=用户表.卡号 where 用户表.手机号='12345678900', cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
if rst.Recordcount=0 then
'手机号不存在或者卡号不存在
else'修改余额
rsAccount.Open "select 账户余额 from 银行账户 where 卡号='" &rst.Fields("卡号") &"'",cnn, adOpenKeyset, adLockOptimistic, adCmdText
rsAccount.Fields("账户余额")=rsAccount.Fields("账户余额")-500
rsAccount.Update
rsAccount.close
end if
’转入。同样默认一个商家编号对应一个银行账户。
rst.Open "select 银行账户.卡号 from 银行账户 join 商家表 on 银行账户.卡号=商家表.卡号 where 商家表.编号='222', cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
if rst.Recordcount=0 then
'账户不存在或者编号不存在
else'修改余额
rsAccount.Open "select 账户余额 from 银行账户 where 卡号='" &rst.Fields("卡号") &"'",cnn, adOpenKeyset, adLockOptimistic, adCmdText
rsAccount.Fields("账户余额")=rsAccount.Fields("账户余额")+500
rsAccount.Update
rsAccount.close
end if
以上代码未优化,就是个大概方法,一些细节需要自己完善,比如余额不足时的处理,比如用户已经转出,在转入商家时出错时的处理。
通常在实际转账系统中需要保证转出和转入全部完成,其中有一个出错就取消整个 *** 作。用 cnn的下列方法发起一个数据库事务(当然看你老师的要求,要求不高的可以忽视):
cnn.BeginTrans 开始事务。在对余额修改前调用。
cnn.CommitTrans 提交事务。在对余额修改完成后调用(注意是转出、转入都完成时)。
cnn.RollbackTrans 撤销事务。通常在错误处理程序里用,取消之前对记录所做的修改。
这个很简单的啊~就是当有用户有存款或取款时做以下 *** 作(1)流水记录增加记录(要记录柜员号,钱的金额,借贷方关系,储户的名字或编号或帐号,系统日期系统时间,还有一大堆参数,一般这些你们单位的同志会告诉你有哪些参数的啊~)
(2)在半夜做批处理时,把流水记录的日表去UPDATE总帐和二级明细表即可~
(3)其他还要记录什么要看你们领导的要求了,一般凡事跟着表结构走就不会错的了~(一般不要让表项空着就成)建表建库的同志一般会和你说要求的亚~如果还有不明白的可以随时问我~
偶们做支付网关的,和你这个有相似的地方~嘿嘿~
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)