银行储蓄业务管理系统介绍(doc 22页)
../temp/...../ ../temp/...../
目录
一、系统定义 (3)
二、需求分析 (3)
(一)系统综合需求
(二)系统逻辑模型
1.数据流图:
2.数据字典
三、系统设计 (5)
(一)概念结构设计
E-R图:
(二)逻辑结构设计
四、详细设计 (6)
(一)开发平台及工具
(二)数据库分析
五、源程序清单 (13)
六、设计心得 (18)
一、系统定义:
银行是一个国家正常运转必不可缺的机构,当今社会,几乎是每个人都会涉及到储蓄业务,为此,为方便用户查询和使用各种业务,可用计算机为工具对查询管理为一体的各种服务。当然,这样的一个银行储蓄业务系统就应运而生了。本系统是一个简单的储蓄系统,可以对储户的信息进行查询修改以及删除。
二、需求分析:
(一)系统综合需求
本系统是银行用户的存取款系统。主要功能是管理各个用户存取款的相关数据。
储户填写的存款单或取款单输入系统,
如果是存款,则系统记录存款人姓名,住址(或电话号码),身份证号码,存款类型,存款金额,存款日期等信息,并打印存单给储户;如果是取款,则需要输入帐号、取款金额等信息,核对正确后系统打印出清单给储户。
(二)系统逻辑模型
1.数据流图:
图1-1 系统数据流图
2.数据字典
数据名字:注册申请表
数据来源:储户
数据目的:储户信息
数据组成:姓名+密码+住址+身份证号码
数据名字:储户信息表
数据来源:储户
数据目的:身份验证
数据组成:姓名+密码+住址+身份证号码+现有金额
数据名字:利息清单
数据来源:系统
数据目的:储户
数据组成:利息+姓名+取款时间
数据名字:存单
数据来源:存款信息表
数据目的:储户
数据组成:姓名+到期时间+存入类型+存入时间+利率+存入金额
数据名字:取款单
数据来源:储户
数据目的:储户信息表
数据组成:姓名+到期时间+存入类型+存入时间
+利率+取款金额+身份证号
数据名字:存款单
数据来源:储户
数据目的:存款信息表
数据组成:姓名+到期时间+存入类型+存入时间+利率+存入金额+身份证号
表1.1 系统数据字典
三、系统设计:
(一)概念结构设计
E-R图:
(二)逻辑结构设计
四、详细设计
(一)开发平台及工具
开发工具 Microsoft Visual C++ 6.0
●DBMS:Microsoft SQL Server
2000
●建模工具: Microsoft Visio,word编辑
器
说明:为了方便的实现系统以及个人熟悉程度的因素,选择了VC++ 6.0的开发平
台。
在Windows平台上我们所学过的就只有MS SQL Server了,所以采用SQL Server2000来进行开发。
(二)银行储蓄业务数据库分析
1)本系统由三张表组成,具体如下:
表名属性(字段)名
储户表账号、身份证号、姓名、性别、身高、地址、存款余额存款单表存款单号、金额、存款方式、账号、存款日期
取款单表取款单号、金额、取款方式、账号、取款日期
系统表基本信息
2)表间关系如下:
一个存款单或取款单属于一个用户,一个用户可以拥有多次存款单或取款单。用户通过存款操作与存款单建立联系,通过取款操作与取款单建立联系。
3)数据准备
前期准备工作:
以system账户登录,创建新账户
create user dy identified by lyjn;
grant dba to dy;
connect dy/dy@orcl;
各个表的具体信息和创建表的代码如下:
字段(属性)含义字段(属性)名字段(属性)类型账号acnum V ARCHAR(5) 身份证号id NUMBER 姓名name V ARCHAR2(20)
性别sex V ARCHAR2(2)
身高height NUMBER(3,2)
地址address V ARCHAR2(20) 存款余额(亿) Balance(billion) INT CREATE TABLE luser
(
acnum VARCHAR2(5) NOT NULL ,
id NUMBER NOT NULL , name VARCHAR2(20) NOT NULL ,
sex VARCHAR2(2) CHECK(sex IN ('男','女') ) ,
height NUMBER(3,2) NOT NULL,
address VARCHAR2(20) NOT NULL ,
balance INT NOT NULL );
ALTER TABLE luser
添加主键约束
ADD CONSTRAINT XPKluser PRIMARY KEY (acnum);
字段(属性)含义字段(属性)名字段(属性)类型存款单号dps_num NUMBER 账号acnum V ARCHAR2(5) 存款时间dps_time TIMESTAMP
金额(亿) money INT
存款方式dps_way V ARCHAR2(10) CREATE TABLE depositslip
(
dps_num NUMBER NOT NULL , money INT
CHECK(money>=0) ,
dps_way VARCHAR2(10) NOT NULL ,
acnum VARCHAR2(5) NOT NULL ,
dps_time TIMESTAMP NULL );
ALTER TABLE depositslip
添加主键约束
ADD CONSTRAINT XPKdepositslip PRIMARY KEY (dps_num,acnum);
ALTER TABLE depositslip
在depositslip表中的acnum字段中添加外键约束
ADD (CONSTRAINT R_5 FOREIGN KEY (acnum) REFERENCES luser(acnum));
字段(属性)含义字段(属性)名字段(属性)类型取款单号dw_num NUMBER 账号acnum V ARCHAR2(5) 取款时间dw_time TIMESTAMP
金额(亿) Money INT
取款方式dw_way V ARCHAR2(10) CREATE TABLE drawslip
(
dw_num NUMBER NOT NULL , money INT
CHECK(money>=0),
dw_way VARCHAR2(10) NOT NULL ,
acnum VARCHAR2(5) NOT NULL ,
dw_time TIMESTAMP NULL );
ALTER TABLE drawslip
添加主键约束
ADD CONSTRAINT XPKdrawslip PRIMARY KEY (dw_num,acnum);
ALTER TABLE drawslip
在drawslip表中的acnum字段中添加外键约束
ADD (CONSTRAINT R_6 FOREIGN KEY (acnum) REFERENCES luser(acnum));
4)插入(insert)数据
1、插入储户表(luser)数据
insert into luser (ACNUM, ID, NAME, SEX,HEIGHT, ADDRESS, BALANCE) values ('00001', 3422101, '刘忠田', '男',1.72 ,'北京市朝阳区', 345); insert into luser (ACNUM, ID, NAME, SEX,HEIGHT, ADDRESS, BALANCE) values ('00002', 3422102, '周正义', '男',1.78, '天津市宝坻区', 123); insert into luser (ACNUM, ID, NAME, SEX,HEIGHT, ADDRESS, BALANCE) values ('00003', 3422103, '陈光标', '男',1.80, '南京市新街口', 333); insert into luser (ACNUM, ID, NAME, SEX,HEIGHT, ADDRESS, BALANCE) values ('00004', 3422104, '张茵', '女',1.65, '上海市黄浦区', 234); insert into luser (ACNUM, ID, NAME, SEX,HEIGHT, ADDRESS, BALANCE) values ('00005', 3422105, '陈丽华', '女',1.70, '香港市旺角区', 111);
2、插入存款单表(depositslip)数据
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98001,'00001', 120,to_date('08-08-2009','dd-mm-yyyy'), '整存
整取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98002,'00001', 300,to_date('10-08-2009','dd-mm-yyyy'), '整存
整取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98003,'00002', 100,to_date('12-08-2009','dd-mm-yyyy'), '整存
零取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98004,'00002', 150,to_date('12-09-2009','dd-mm-yyyy'), '整存
零取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98005,'00003', 200,to_date('15-08-2009','dd-mm-yyyy'), '零存整取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98006,'00003', 100,to_date('14-09-2009','dd-mm-yyyy'), '零存整取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98007,'00003', 80,to_date('23-09-2009','dd-mm-yyyy'), '零存整取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98008,'00004', 80,to_date('23-08-2009','dd-mm-yyyy'), '零存零取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98009,'00004', 180,to_date('24-09-2009','dd-mm-yyyy'), '零存零取');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98010,'00005', 190,to_date('24-08-2009','dd-mm-yyyy'), '通知存款');
insert into depositslip (DPS_NUM, ACNUM, MONEY, DPS_TIME, DPS_WAY) values (98011,'00005', 210,to_date('30-09-2009','dd-mm-yyyy'), '通知存款');
3、插入取款单表(drawslip)数据
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52001,'00001', 75,to_date('08-08-2010','dd-mm-yyyy'), '柜台');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52002,'00002', 27,to_date('08-09-2010','dd-mm-yyyy'), '取款机');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52003,'00002',100,to_date('12-10-2010','dd-mm-yyyy'), '柜台');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52004,'00003',47,to_date('15-08-2010','dd-mm-yyyy'), '取款机');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52005,'00004',26,to_date('12-09-2010','dd-mm-yyyy'), '取款机');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52006,'00005',100,to_date('23-09-2010','dd-mm-yyyy'), '柜台');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52007,'00005',150,to_date('10-10-2010','dd-mm-yyyy'), '柜台');
insert into drawslip (DW_NUM, ACNUM, MONEY, DW_TIME, DW_WAY)
values (52008,'00005',39,to_date('31-10-2010','dd-mm-yyyy'), '取款机');
5)索引
建立索引遵循的规律:
1.建立在where子句经常引用的列上,
2.经常需要排序的列上,
3.连接属性列上等
在存款单表的存款单号字段和账号字段建立组合索引
CREATE UNIQUE INDEX XPKdepositslip ON depositslip
(dps_num ASC,acnum ASC);
在存款单表的账号字段建立索引
CREATE INDEX XIF1depositslip ON depositslip
(acnum ASC);
在取款单表的取款单号字段和账号字段建立组合索引
CREATE UNIQUE INDEX XPKdrawslip ON drawslip
(dw_num ASC,acnum ASC);
在取款单表的账号字段建立索引
CREATE INDEX XIF1drawslip ON drawslip (acnum ASC);
在储户表的账户字段上建立索引,方便查询CREATE UNIQUE INDEX XPKluser ON luser (acnum ASC);
6)触发器
1、插入存款,对应储户表的相应储户的余额(balance)增加插入记录包含的金额数(money)
CREATE OR REPLACE TRIGGER OperatingDps
AFTER INSERT ON depositslip
FOR EACH ROW
DECLARE
n_ac VARCHAR2(5);
n_mo INT;
BEGIN
n_ac:=:new.acnum;
n_mo:=:new.money;
update luser set balance=balance+n_mo where luser.acnum=n_ac;
END OperatingDps;
2、删除存款,对应储户表的相应储户的余额(balance)减去所删除记录的金额数(money)
CREATE OR REPLACE TRIGGER OperatingDps2 AFTER DELETE ON depositslip
FOR EACH ROW
DECLARE
o_ac VARCHAR2(5);
o_mo INT;
BEGIN
o_ac:=:old.acnum;
o_mo:=:old.money;
update luser set balance=balance-o_mo where luser.acnum=o_ac;
END OperatingDps2;
3、插入取款,对应储户表的相应储户的余额(balance)减少插入记录包含的金额数(money)
CREATE OR REPLACE TRIGGER OperatingDw
AFTER INSERT ON drawslip
FOR EACH ROW
DECLARE
n_ac VARCHAR2(5);
n_mo INT;
BEGIN
n_ac:=:new.acnum;
n_mo:=:new.money;
update luser set balance=balance-n_mo where luser.acnum=n_ac;
END OperatingDw;
4、删除取款,对应储户表的相应储户的余额(balance)加上所删除记录的金额数(money)
CREATE OR REPLACE TRIGGER OperatingDw2
AFTER DELETE ON drawslip
FOR EACH ROW
DECLARE
o_ac VARCHAR2(5);
o_mo INT;
BEGIN
o_ac:=:old.acnum;
o_mo:=:old.money;
update luser set balance=balance+o_mo where luser.acnum=o_ac;
END OperatingDw2;
5、插入的取款金额(money)大于对应用户的余额(balance)时,系统报错CREATE OR REPLACE TRIGGER OperatingDw3
AFTER insert ON drawslip
FOR EACH ROW
DECLARE
n_ac VARCHAR2(5);
n_mo INT;
n_ba INT;
BEGIN
n_ac:=:new.acnum;
n_mo:=:new.money;
select balance into n_ba from luser where acnum=n_ac;
if n_mo>n_ba then
RAISE_APPLICATION_ERROR(-20000, '存款余额不足!请重新插入存款!');
end if;
END OperatingDw3;
五、源程序清单
#include
#include
#include
using namespace std;
const int Max=100;
void Wait();
class User //用户类的声明
{
public:
User()
{
CurrentAcount=0;
//初始化当前的账户
}
void Resert1(User *u,double A)
{
u->CurrentAcount=u->CurrentAcount+A;
}
void Resert2(User *u,double A)
{
u->CurrentAcount=u->CurrentAcount-A;
}
char *getname() //取得用户名
{
return name;
}
long getNum() //取得帐户号
{
return Num;
}
double getCurrentAcount()
{
return CurrentAcount;
}
void output() //输出相关信息
{
cout<<"用户名:"< cout<<"账号:"< cout<<"余额:"< void addUser(char *name,long Num) { strcpy(this->name,name); this->Num=Num; } void Deposit(User *u,double Acount) //存款 { u->Resert1(u,Acount); } void out(User *u,double acount) //取款 { if(acount>u->getCurrentAcount()) { cout<<"余额不足.\n"; } else { cout<<"请及时取走你的钞票.\n"; u->Resert2(u,acount);