银行ATM存取款机系统设计与实现.docx

上传人:b****5 文档编号:4208475 上传时间:2022-11-28 格式:DOCX 页数:31 大小:26.76KB
下载 相关 举报
银行ATM存取款机系统设计与实现.docx_第1页
第1页 / 共31页
银行ATM存取款机系统设计与实现.docx_第2页
第2页 / 共31页
银行ATM存取款机系统设计与实现.docx_第3页
第3页 / 共31页
银行ATM存取款机系统设计与实现.docx_第4页
第4页 / 共31页
银行ATM存取款机系统设计与实现.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

银行ATM存取款机系统设计与实现.docx

《银行ATM存取款机系统设计与实现.docx》由会员分享,可在线阅读,更多相关《银行ATM存取款机系统设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。

银行ATM存取款机系统设计与实现.docx

银行ATM存取款机系统设计与实现

《数据库技术与开发》

项目实训设计报告

项目名称:

《银行ATM存取款机系统设计与实现》

姓名:

范涛

学号:

21

专业:

软件工程12-2

指导教师:

刘立新

完成日期:

2014-11-20

《银行ATM存取款机系统设计与实现》

第1章:

项目背景

1、项目任务

创建数据库、创建表、创建约束

使用触发器和插入测试数据

模拟常规业务、创建视图

使用存储过程实现业务处理

利用事务实现较复杂的数据更新

2、项目技能目标

Ø使用PowerDesigner完成数据库概念模型和数据库物理模型设计。

Ø使用T-SQL语句创建数据库、表和各种约束。

Ø使用T-SQL语句编程实现常见业务。

Ø使用触发器实现多表之间的级联更新。

Ø使用事务和存储过程封装业务逻辑。

Ø使用视图简化复杂的数据查询。

Ø使用游标技术实现结果集的行集操作。

3、需求概述

某银行是一家民办的小型银行企业,现有十多万客户,公司将为该银行开发一套ATM存取款机系统,对银行日常的存取款业务进行计算机管理,以便保证数据的安全性,提高工作效率。

要求根据银行存取款业务需求设计出符合第三范式的数据库结构,使用T-SQL语言创建数据库和表,并添加表约束,进行数据的增删改查,运用逻辑结构语句、事务、视图和存储过程,按照银行的业务需求,实现各项银行日常存款、取款和转账业务。

4、开发环境

Ø数据库:

SQLSERVER2008开发版

Ø数据库建模工具:

PowerDesigner15

第2章:

创建数据库

1.创建数据库

代码如下:

createdatabasebankdb

onprimary

name=N'bankdb',

filename=N'G:

\数据库课设\bankdb.mdf',

size=5mb,

maxsize=30mb,

filegrowth=15%

logon

name=N'bankdb_log',

filename=N'G:

\数据库课设\bankdb_log.ldf',

size=2mb,

maxsize=30mb,

filegrowth=15%

2.创建各个数据表及相关的约束

(1).创建银行业务类型表

createtablebankbusinesstype

bbt_idintidentity(1,1)primarykey,

bbt_namechar(20)notnull,

bbt_commentvarchar(100)

);

(2).创建用户信息表

createtablebankcustomer

bc_idintidentity(1,1)primarykey,

bc_namechar(20)notnull,

bc_icnochar(18)notnullcheck(left(bc_icno,17)like'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'and(right(bc_icno,1)like'[0-9]'orright(bc_icno,1)like'x')),

bc_telvarchar(20)notnullcheck((bc_tellike'[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9]')or(bc_tellike'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')),

bc_addrvarchar(100)

);

(3).创建银行卡信息

createtablebankcard

(bc_nochar(19)notnull,

bc_pwdchar(6)notnull,

bc_currencychar(5)notnull,

bc_bbtidintnotnull,

bc_opendatedatenotnull,

bc_openamountmoneynotnull,

bc_reglosschar

(2),

bc_bcidintnotnull,

bc_existbalancemoneynotnull

altertablebankcard

addconstraintsp_bcno1primarykey(bc_no)

altertablebankcard

addconstraintsp_bcno2check(bc_nolike'10103576[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

altertablebankcard

addconstraintsp_bcopenamountcheck(bc_openamount>=1)

altertablebankcard

addconstraintsp_bcpwddefault('888888')forbc_pwd

altertablebankcard

addconstraintsp_bccurrencydefault('RMB')forbc_currency

altertablebankcard

addconstraintsp_bcopendatedefault(getdate())forbc_opendate

altertablebankcard

addconstraintsp_bcreglossdefault('否')forbc_regloss

(4).创建交易信息表

createtablebankdealinfo

(bd_nointidentity(1,1),

bd_bcnochar(19)notnull,

bd_dealdatedatenotnull,

bd_dealacountmoneynotnull,

bd_dealtypechar(10)notnull,

bd_dealcommentchar(100)

altertablebankdealinfo

addconstraintsp_bdnoprimarykey(bd_no)

altertablebankdealinfo

addconstraintsp_bddealdatedefault(getdate())forbd_dealdate

altertablebankdealinfo

addconstraintsp_bddealtypecheck(bd_dealtype='存入'orbd_dealtype='支取')

3.添加外键约束和生成数据库

代码如下:

usebankdb

go

altertablebankcard

addconstraintfk_bc_bbtforeignkey(bc_bbtid)referencesbankbusinesstype(bbt_id);

altertablebankcard

addconstraintfk_bc_bcforeignkey(bc_bcid)referencesBankCustomer(bc_id);

altertablebankDealInfo

addconstraintfk_bdi_bcforeignkey(bd_bcno)referencesBankCard(bc_no);

第3章:

创建触发器和插入测试数据

1.创建级联触发器

(1).创建Insert触发器:

if(object_id('tr_InsertdealInfo','tr')isnotnull)

droptriggertr_InsertdealInfo

go

createtriggertr_InsertdealInfo

onbankdealinfo

forinsert

as

declare@typechar(10),@summoney,@bdbcnochar(19);

--创建一个游标,指向inserted表

declarecursor_bankdealinfocursorforselectbd_dealtype,bd_dealacount,bd_bcnofrominserted

--打开游标

opencursor_BankDealinfo

--取游标中各个字段的值复制给各个变量

fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo

while@@fetch_status=0

begin

--判断交易记录里是存入还是支取,及时更新银行卡表的存款余额

if(rtrim(ltrim(@type))='存入')

updatebankcardsetBC_ExistBalance=BC_ExistBalance+@sumwhereBC_No=@BDBCNo;

if(rtrim(ltrim(@type))='支取')

updatebankcardsetBC_ExistBalance=BC_ExistBalance-@sumwhereBC_No=@BDBCNo;

fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo

end

closecursor_BankDealinfo

deallocatecursor_BankDealinfo

Go

(2).创建Delete触发器

if(object_id('tr_DeldealInfo','tr')isnotnull)

droptriggertr_DeldealInfo

go

createtriggertr_DeldealInfo

onbankdealinfo

fordelete

as

declare@typechar(10),@summoney,@BDBCNochar(19);

--创建一个游标,指向deleted表

declarecursor_BankDealinfocursorforselectBD_DealType,BD_DealAcount,BD_BCNofromdeleted

--打开游标

opencursor_BankDealinfo

--取游标中各个字段的值复制给各个变量

fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo

while@@fetch_status=0

begin

if(rtrim(ltrim(@type))='存入')

updatebankcardsetBC_ExistBalance=BC_ExistBalance-@sumwhereBC_No=@BDBCNo;

if(rtrim(ltrim(@type))='支取')

updatebankcardsetBC_ExistBalance=BC_ExistBalance+@sumwhereBC_No=@BDBCNo;

fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo

end

closecursor_BankDealinfo

deallocatecursor_BankDealinfo

Go

(3).创建update触发器:

if(object_id('tr_DeldealInfo','tr')isnotnull)

droptriggertr_DeldealInfo

go

createtriggertr_DeldealInfo

onbankdealinfo

forupdate

as

declare@typechar(10),@summoney,@BDBCNochar(19);

--创建一个游标,指向deleted表

declarecursor_BankDealinfocursorforselectBD_DealType,BD_DealAcount,BD_BCNofromupdated

--打开游标

opencursor_BankDealinfo

--取游标中各个字段的值复制给各个变量

fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo

while@@fetch_status=0

begin

if(rtrim(ltrim(@type))='存入')

updatebankcardsetBC_ExistBalance=BC_ExistBalance-@sumwhereBC_No=@BDBCNo;

if(rtrim(ltrim(@type))='支取')

updatebankcardsetBC_ExistBalance=BC_ExistBalance+@sumwhereBC_No=@BDBCNo;

fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo

end

closecursor_BankDealinfo

deallocatecursor_BankDealinfo

go

2.插入数据表的测试数据

1.BankBusinessType表的测试数据

代码如下:

insertintobankbusinesstype

values

('活期','无固定存期,可随时存取,存取金额不限的一种比较灵活的存款'),

('定活两便','事先不约定存期,一次性存入,一次性支取的存款'),

('通知','不约定存期,支取时需提前通知银行,约定支取日期和金额方能支取的存款'),

('整存整取1年','整笔存入,到期提取本息'),

('整存整取2年','整笔存入,到期提取本息'),

('整存整取3年','整笔存入,到期提取本息'),

('零存整取1年','事先原定金额,逐月按约定金额存入,到期支付本息'),

('零存整取2年','事先原定金额,逐月按约定金额存入,到期支付本息'),

('零存整取3年','事先原定金额,逐月按约定金额存入,到期支付本息'),

('自助转账','银行ATM机上办理银行卡之间互相划转');

select*frombankbusinesstype

结果如下图所示:

图1

2.BankCustomer表的测试数据

insertintobankcustomer

values

('小明','','','包头市昆都仑区包钢五中'),

('小黑','54','','包头昆区阿尔丁大街');

select*frombankcustomer

结果如下图所示:

图2

3.BankCard表的测试数据

declare@datedatetime

select@date=cast(DATEADD(DD,-(rand()*30),GETDATE())asdatetime)--前30天的日期

insertintoBankCard

values('1010357612345678','197611','RMB',1,@date,'1000.00','否',1,'1000.00');

select@date=cast(DATEADD(DD,-(rand()*30),GETDATE())asdatetime)

insertintoBankCard

values('1010357612345688','197711','RMB',2,@date,'1500.00','否',2,'1500.00');

select*fromBankCard

结果如下图所示:

图3

4.BankDealInfo表的测试数据

declare@date1datetime

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345678',@date1,'500.00','存入','单位1月工资')

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345678',@date1,'1500.00','存入','单位2月工资')

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345678',@date1,'600.00','支取','支付宝付款')

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345678',@date1,'700.00','支取','刷卡消费');

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345688',@date1,'3000.00','存入','单位1月工资')

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345688',@date1,'2800.00','存入','单位2月工资')

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345688',@date1,'1600.00','支取','支付宝付款')

select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)

insertintoBankDealInfo

values('1010357612345688',@date1,'900.00','支取','刷卡消费');

select*fromBankDealInfo

结果如下图所示:

图4

第四章:

模拟常规业务

1.修改客户密码

updateBankCardsetBC_Pwd=123456whereBC_No='1010357612345678';

updateBankCardsetBC_Pwd=123123whereBC_No='1010357612345688';

--修改密码后的查询显示

selectbc_noas'卡号',bc_pwdas'密码',BC_Currencyas'货币类型',BC_BBTIdas'储蓄类型',BC_OpenDateas'开户日期',BC_OpenAmountas'开户金额',BC_RegLossas'是否挂失',BC_BBTIdas'客户编号',BC_ExistBalanceas'存款余额'fromBankCard

结果如下图所示:

图5

2.办理银行卡挂失

select*fromBankCardwhereBC_No='1010357612345678';

updateBankCardsetbc_regloss='是'whereBC_No='1010357612345678';

selectBankCard.BC_Noas'卡号',BankCard.BC_Pwdas'密码',BankCard.BC_Currencyas'货币类型',BankBusinessType.BBT_Nameas'储蓄类型',BankCard.BC_OpenDateas'开户日期',BankCard.BC_OpenAmountas'开户金额',BankCard.BC_RegLossas'是否挂失',BankCustomer.BC_Nameas'客户姓名',BankCard.BC_ExistBalanceas'存款余额'fromBankCard

innerjoinBankBusinessTypeonBankCard.BC_BBTId=BankBusinessType.BBT_Id

innerjoinBankCustomeronBankCard.BC_BCId=BankCustomer.BC_Id

Go

结果如下图所示:

图6

3.统计银行资金流通余额和盈利结算

ifexists(select*fromsysobjectswherename='proc_staticsBanlanceAndProfit')

dropprocedureproc_staticsBanlanceAndProfit

go

createprocedureproc_staticsBanlanceAndProfit

as

declare@YUmoney;

declare@YINGmoney;

declare@INmoney;

declare@OUTmoney

select@IN=sum(bd_dealacount)fromBankDealInfowherertrim(ltrim(BD_DealType))='存入';

select@OUT=sum(BD_DealAcount)fromBankDealInfowherertrim(ltrim(BD_DealType))='支取';

set@YU=@IN-@OUT;

set@YING=@IN*0.008-@OUT*0.003;

print'存入总金额:

'+rtrim(ltrim(str(@IN)))+'RMB,支取总金额:

'+rtrim(ltrim(str(@OUT)))+'RMB,银行流通余额:

'+rt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1