当前位置:文档之家› 银行储蓄业务管理系统介绍(doc 22页)

银行储蓄业务管理系统介绍(doc 22页)

银行储蓄业务管理系统介绍(doc 22页)
银行储蓄业务管理系统介绍(doc 22页)

银行储蓄业务管理系统介绍(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);

相关主题
文本预览
相关文档 最新文档