1556.计算机科学与技术学院数据库课程设计报告银行管理系统.doc
第一章 绪论2§1.1 引言2§1.2 内容梗要2第二章 需求分析3§2.1 信息要求3§2.2 处理要求4 安全性与完整性要求6第三章 概念结构设计7§3.1 E-R图7一、实体集及属性描述7二、函数依赖7三、E-R图及实体集属性的计算方法8§3.2 表的冗余及外码约束9一、表的冗余9二、外码约束9第四章 逻辑结构设计10函数依赖的极小化处理10§4.2 E-R图到关系模型及其优化11§4.3 工作流程及用户子模式设计12一、管理员的工作流程及其子模式:12二、用户工作流程及子模式设计12第五章 数据库的实施与维护13管理员模块的功能模块分析及代码讲解13一、功能模块和功能概要13二、结合源代码和操作界面详细分析14客户模块的功能模块分析及代码讲解20一、客户模块的功能模块总轮廓及功能概要20二、结合源代码和操作界面详细分析21结束语29参考文献30第一章 绪论§1.1 引言随着数据处理的不断进步和计算机网络的迅速发展,使数据库应用系统不仅在功能而且在结构上都有了深刻的变化,而且运用在生活的每一个方面。通过学习关系代数,关系演算,函数依赖,关系模式分解,关系模式的规范化让我们建立了扎实的关系数据库理论基础。而在掌握基本理论的基础上掌握关系数据库的设计方法,掌握现代信息系统的开发方法也显得尤为必要。目前在关系数据库中用得最多的SQL数据库,开发数据库的语言工具多数用DELPHI.。所以对于计算机专业的学生来说掌握数据库应用的基本技术,熟悉编程语言与SQL数据库的结合运用是我们计算机专业学生之必备本领。本次课程设计是以银行管理系统为模拟模型,运用DELPHI编程语言结合SQL数据库所开发系统。§1.2 内容梗要此次课程设计针对设计要求主要要做以下工作,根据要求提炼数据库所需的信息,弄清楚数据库要实现的功能,及其完整性和安全性要求。由需求分析和依赖关系确立实体集及关系表,设立外码约束。创建适当的视图和事务。结合与用户的交互信息搭建友善的界面,根据功能的不同确立不同的模块,合理运用DELPHI语言和调用SQL语句达到数据库操作的目的。信息提取与处理见第二章内容。概念结构设计见第三章内容。逻辑机构设计见第四章内容,具体功能分析及代码详解见第五章内容。结合此次课程设计的过程将几个值得关注的问题列举如下:一、SQL中所要注意的问题: 数据库的建立,根据所需信息合理设立表。 确立外码约束,建关系图。 根据与用户所交互的信息,创造方便的视图以便于查询显示。 保证一些操作的原子性,即要创建事务。二、DELPHI中所注意的问题DELPHI中所遇到的问题主要怎样运用DELPHI开发工具设计出交互性好的界面,合理组织各单元文件之间的调用问题,及在DELPHI中调用SQL语句问题等等。第二章 需求分析§2.1 信息要求一、 客户对于客户我们应该知道他的客户号,客户名,信用度,最大的经济支付能力。二、 存款功能对于一个客户,他在一个银行有且只有一个存款账号。但可在不同的银行都有存款,所以对于一个账号,我们需要知道其所在银行类型,账号,密码,存款额,最近存款日期。(假定存款利率都一样)三、 取款和透支对于客户取款,我们要知道他在用哪个卡型取款,即哪个银行,同时应该验证身份信息(卡号,密码)要知道该卡上的存款额,及此次的取款额。根据卡上的金额与所取金额的差值决定是否属于透支类型。若属于透支类型,需要知道客户以前的透支记录,即哪张卡上(卡型)什么时间(上一次透支日期)透支多少(金额)。若可以透支需根据客户的信誉度和经济能力确定用户的最大可透支额,用户根据其信息来透支所需金额。四、 贷款我们需要知道贷款类别(卡型)即哪个银行上贷款,然后根据客户的信誉度和经济承受能力来确定最大可贷多少款子给客户。同时我们应该给客户一个贷款号,根据其贷款的年数来确定客户的贷款利率,对于贷款我们还应该保存其贷款时间,还贷时间等。五、 还贷1 对于贷款的还贷:我们应该支持分期还贷服务,这样我们需要记录客户的每次还贷记录,即还贷的顺序号,此次还贷金额。2 对于透支的偿还:处理方法是,将下一次的存款额作为偿还透支的金额,直到透支额全部还清。六、 转账需要知道转账的卡型,卡号,密码(验证身份)。需要判断对方的卡型(确定转账费率问题),卡号(判断该卡是否存在)。如果转账金额大于该卡现有金额则转账失败。§2.2 处理要求一、 存款的情况当用户在此次存款的卡上有透支额且没有还时,这次存款的金额将全部或部分作为偿还透支的金额(视透支的金额而定)。且存款或偿还透支操作需满足原子性,即要把这类操作设计成事务,要么全部执行,要么全部不执行。还应注意在这次存款前把该卡上已有的存款的利息算出来作为该卡上已有的本金。(我在本次设计中把存款利率按日计算,设为0.005)二、 取款的情况要判断此次取款的金额与卡上现存的金额的大小,如果取款额大于现存额则应该当作透支处理,接着应该判断该用户能不能透支,这主要依据他上次的透支额是否还清,如果还清了,则允许透支,否则不许。在允许透支的前提下,应该给出用户最大允许的透支额,这就要查询该用户的信誉度(A)和经济能力(B),透支主要是由信誉度决定的,在此次课程设计中我设置最大透支额1000×A;(初始时用户的信誉度都设为10,以后视还透支的期限来设置信誉度)。这里还应注意在每次取款前,应该把前面所存款项的利息算出来作为此卡上已有的本金。三、 贷款的情况贷款主要是给出用户的最大可贷款额,这主要由用户的经济能力(B)决定。而在此次设计中用户的经济能力BMAX(用户曾经一次的存款额)×10。还有用户的贷款应该不同于透支,应根据不同的贷款年限来设置贷款的利率。且应该支持分期付款。贷款应给出独立的贷款号。四、 偿还透支的情况这种情况主要发生在用户有透支且又在存款的条件下,即用户没有刻意地去还透支,而是在存款中不知不觉的还了。但应该注意上次透支的时间和这次存款的时间不应该超过最迟偿还透支期限(本次设计为100天),如果超过了,就将用户的信誉度(A)减1。当用户透支额全部还完的时候就删除透支记录。五、 偿还贷款的情况贷款可以分期支付,每次支付前都要把前面贷款的利息算出来作为此次贷款应还的金额。六、 转账的情况用户的转账额不能大于卡上现存金额,同时应该确定是同行转账还是异行转账以便收取不同的费率,同行则为0.02,异行为0.05。批注:无论存款,取款,贷款,还贷,还是转账都设计为事务,以保证原子性。在此次课程设计中为便于用户或管理员查阅信息,我把存/取款日志保存下来,还有还贷日志。§2.3 安全性与完整性要求一、 安全性1 用户和管理员的权限设置:用户只能存款,取款,转账,还有查询存款情况和还贷情况,同时也可以修改自己的资料(譬如密码),不具有修改和查阅银行内部资料的权利。但银行管理员则可以,可以增添管理员,查阅银行的存取状况等。2 非法数据的输入:每个字段信息都有自己确定的类型,不能插入不合乎该类型的数据。可以在DELPHI程序中屏蔽掉,也可以在SQL数据库中作错误处理。3 用户查询情况:在用户的查询过程中一些数据应该屏蔽掉,比如用户在查询自己的存款状况时就应该屏蔽掉改客户的密码等。所以可以在查询语句中加以处理,也可以创建视图来实现数据的屏蔽。4 某些操作需要身份认证:取款,转账,修改资料等。二、 完整性要求:数据完整性是指数据的精确性和可靠性,首先就是实体的完整性,就是指每一行记录在表中是唯一的实体,不能插入有重复主码的记录。再一个就是参照完整性,是指两个表的主关键字和外关键字的数据对应一致,防止数据的丢失或者无意义的数据在数据库中的扩散。表现在:a 禁止在表中插入包含主表中不存在的关键字的数据行。b 禁止删除在从表中的有对应记录的主表记录。完整性问题可以通过一些工具来实现,如:规则,约束,触发器等。第三章 概念结构设计§3.1 E-R图一、实体集及属性描述实体1:customer(客户)属性:customer_id name trust_abi(信誉度) pay_abi(经济能力)实体2:bank(银行)属性:card_type(卡型银行名称)adress(银行所在地) asset(银行现有存款)实体3:fund_bill(存款单)属性:card_type card_no keyword fortune_amount(存款金额) deposite_date(上次的存款日期)实体4:loan_pack(贷款)属性:loan_pack_no(贷款号) card_type(银行)loan_money payoff_date borrow_date rest_money(为了支持分期付款而设立的) rate(贷款利率)实体5:overdraft(透支)属性:card_type card_no amount date(透支的时间) 实体6:fetch_depo_log(存款/取款日志)属性: card_type dat amount dep_fet(存款/取款)实体7:payoff_pro(还贷日志)属性:loan_pack_no payback_no payback_amount card_type 二、函数依赖customer_id->name customer_id->trust_abi customer_id->pay_abi card_type->assetcard_type card_no->keyword card_type card_no->fortune_amount card_type card_no->deposite_date loan_pack_no card_type->loan_money loan_pack_no card_type-> patoff_date loan_pack_no card_type-> borrow-date loan_pack_no card_type->rest_money loan_pack_no card_type->ratecard_type card_no->amount card_type card_no->datescard_type dat ->amount dep_fetloan_pack_no payback_no->payback_amount card_type三、E-R图及实体集属性的计算方法Deposite_datecustomerTrust_abinameCustomer_idPay_abiFund_billCard_typeCard_nokeywordFortune_amouttLoan_packLoan_pack_noCard_typeCard_noLoan_moneyrateBorrow_datePayoff_dateRest_moneyoverdraftCard_typeCard_noamountdatePayoff_proPayback_noamountFetch_depo_logDep_fetamountdateFund_billBankCard_typeAssetAddressCustomer部分属性的计算方法:trust_abi:初始为10(最大),然后依据每次所还透支的天数是否超过100天而确定是否减1pay_abimax曾经最大的一次存款额×10批注:着重加黑的方框表示弱实体。§3.2 表的冗余及外码约束一、表的冗余在还贷日志实体和存取款日志实体中,这两个实体都是弱实体集,故需要连同强实体集的主码一起够成该实体的主码。Loan_pack的主码是card_type loan_pack_no,所以payoff_pro的主码为card_type,loan_pack_no ,payback_no。fund_bill的主码是card_type, card_no故fetch_depo_log的主码为card_type,card_no,fetch_depo_log。二、外码约束参照实体被参照实体实体外码实体外码Fund_billCard_typeBankCard_typeLoan_packCard_typeBankCard_typeOverdraftCard_noFund_billCard_noPayoff_proLoan_pack_noLoan_packLoan_pack_no第四章 逻辑结构设计§函数依赖的极小化处理由§中的函数依赖及各实体属性得如下函数依赖: customer_id->namecustomer_id->trust_abicustomer_id->pay_abicustomer_id-> name,trust_abi,pay_abicard_type card_no->keyword card_type card_no->fortune_amountcard_type card_no->deposite_datecard_type card_no->keyword,fortune_amountdeposite_dateloan_pack_no,card_type-> loan_moneyloan_pack_no,card_type-> patoff_dateloan_pack_no card_type-> borrow-dateloan_pack_no card_type->rest_moneyloan_pack_no card_type->rateloan_pack_no,card_type->loan_money, patoff_dateborrow-date, rest_moneyratecard_type card_no->amountcard_type card_no->datescard_type card_no-> amount, dates§4.2 E-R图到关系模型及其优化由函数依赖关系及E-R图得关系模型如下:实体集:customer-schema=(customer_id,name,trust_abi,pay_abi)fund_bill-schema=(card_type,card_no,keyword,fortune-amount,date)overdraft-schema-(card_type,card_no,amount,date)bank-schema=(card-type,address,asset)payoff_pro-schema=(loan_pack_no,payback_no,amount,card_type)注:由于payoff_pro是完全参与customer的所以customer与payoff_pro的关系模式可以并作payoff_pro 的实体集模式故payoff_pro-schema=(loan_pack_no,payback_no,amount,card_type,customer_id)loan_packschema(loan_pack_no,card_type,loan_money,payoff_date,borrow_date,rest_money,rate)联系集:customerfundschema(customer_id,card_type,card_no)customer_loanschema(customer_id,loan_pack_no,card_type)函数依赖关系如下图:§4.3 工作流程及用户子模式设计一、管理员的工作流程及其子模式:管理员工作界面管理员资料设置银行服务区管理员登录密码修改区新增管理员区删除管理员区银行服务区开设银行银行业务查询开设账户客户业务查询消户二、用户工作流程及子模式设计用户工作界面客户查询区客户存款/取款区客户转账/贷款区用户进入客户密码修改还贷区客户查询区余额查询客户贷款查询客户还贷记录查询第五章 数据库的实施与维护整个数据库的功能展开是以菜单式的呈现给用户:§一、功能模块和功能概要管理员工作界面管理员资料设置银行服务密码修改区 功能简单,分析省略新增管理员区 功能简单,分析省略删除管理员区 功能简单,分析省略开设银行 功能简单,分析省略银行业务查询 见分析一开设账户 见分析二客户业务查询 见分析三消户 见分析四以上显示的是各级菜单的关联情况,在管理员资料设置中所用到的只是一些非常单一的SQL语句,不涉及事务性操作。在密码修改区,新增管理员区,删除管理员区只是进行了一些非法数据的屏蔽,和用DELPHI语言调用SQL中的一些更新(UPDATE),插入(INSERT),删除(DELETE)等操作。在开设银行功能中可以添加银行,添加的银行会在下次运行程序的时候出现。另外在消户操作中是通过调用存储过程实现的,用事务实现操作的原子性。在设计上综合了日常银行管理员所常有的一些功能,实现方面主要是在SQL进行事务处理,在DELPHI中是调用存储过程。二、结合源代码和操作界面详细分析分析一、银行业务查询:这一部分主要是供银行管理员查阅当前各个银行有多少储蓄的,所以一些信息对管理员来说是没有必要知道的,也无需知道如银行所在地等。所在这一部分别用了视图,屏蔽掉数据库中的某些内容。视图代码如下:k_viewASSELECT Card_type AS 银行名称, SUM(Asset) AS 总存款额, COUNT(Card_no) AS 总用户数FROM (SELECT Bank.Card_type AS Card_type, Asset, Card_no FROM Bank, Customer_Fund WHERE Bank.Card_type = Customer_Fund.Card_type) DERIVEDTBLGROUP BY Card_type操作界面如下:图1调用视图的程序:(如果选择的是中国农业银行)if(comboBox1.Text='中国农业银行')then begin with ADOQuery1 do begin ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from Bank_view where (银行名称=:a)'); ADOQuery1.Parameters0.Value:='中国农业银行' ADOQuery1.Open; end; end;选择其他银行的代码如上雷同。其中Bank_view为创建的视图名。分析二、开设账户:功能简介:这一部分是给用户开户的,它可以给一个客户在其指定的银行开一个账户,并生成一个卡号,同时显示该银行卡的初始密码为“888888”。程序在执行时先要对所输入的客户号进行检测,判断该客户是不是已经存在。所以在开始屏蔽掉了输入用户名这一项。如果该用户不存在则显示提示用户输入用户名,对已存在的用户就没有必要存在这一步。需要解决的问题:对已存在客户在新一家银行开户的情况的处理问题。还有给用户随机生成卡号的问题。解决方案:由于开设一个新的账户,需要在多个表中插入数据。故需要进行原子性操作。所以用了事务来处理。由于用户可以在不同的银行都有账户,所以针对一个已经存在的用户,如果再在另外一家银行开设账户的情况处理将不同于新增一个用户然后开设账户的情况。于是针对这两个情况,我分别写了两个存储过程,kaihu1和kaihu2,存储过程的代码如下:Kaihu1Kaihu2create procedure kaihu1 cus_id char(10), name varchar(50), trust_abi int, pay_abi float, Card_type varchar(50), card_no char(13), key char(10), amount float, date datetimeasbegin transactioninsert into customervalues(cus_id,name,trust_abi, pay_abi)if Error<>0 goto proinsert into Fund_bill values(Card_type,card_no,key,amount,date)if Error<>0 goto proinsert into customer_Fund values(cus_id,Card_type,card_no)if Error<>0 goto procommit transactionreturn 0pro:Rollback Transactionreturn 1GOcreate procedure kaihu2 cus_id char(10), Card_type varchar(50), card_no char(13), key char(10), amount float, date datetimeasbegin transactioninsert into customer_Fund values(cus_id,Card_type,card_no)if Error<>0 goto proinsert into Fund_bill values(Card_type,card_no,key,amount,date)if Error<>0 goto procommit transactionreturn 0pro:Rollback Transactionreturn 1GO存储过程的分析:对于kaihu1这个存储过程,是在该用户以前不存在的情况下而新开账户所用的存储过程。它要在customer表中插入用户的基本信息,包括初始化用户的信誉度trust_abi10,经济能力pay_abi0。还要在关系表customer_fund中插入客户对应的卡号及卡的类型。还要在fund_bill中插入初始化信息,如用户的密码,存款额fortune_amount,开户日期date等。而kaihu2是在已存在的开户中另外在另一家银行开设账户,该客户的基本信息已有,故相比与kaihu1少了向customer表中插入用户基本信息。其他的类似与kaihu1。对随机生成客户对应卡号问题的解决方案:卡号形式为“字母CK(存款的首字母)+日期+指定位数数据”。在生成字符串时,首先从数据表中查询最大的字符串,利用MAX函数。如果返回为空(NULL),可以将有数字组成的字符串设置为“001”,然后将指定的字符串(如:CK20060220)与之连接组成新的字符串“CK20060220001”;如果返回不为空,如返回“CK20060220034”,则截取字符串的后几位字符,即由数字组成的字符。将其转换为整数,在加1在转换为字符串(如35)。然后判断该字符串占几位,如果占一位,则在前面加“00”,两位加“0”,三位就不加。最后组成新的字符串(CK20060220035).源代码如下:s:='CK'+FormatDateTime('yyyymmdd',Now(); with adoquery1 do begin adoquery1.SQL.Clear; adoquery1.SQL.Add('select max(Card_no) as ss from Fund_bill'); adoquery1.Open; end; /选择最大的卡号 if(adoquery1.FieldByName('ss').Value=null)then s:=s+'001' else begin m:=Trim(adoquery1.fieldByName('ss').Value); i:=strToint(Trim(copy(m,11,5); if i<10 then s:=s+'00'+inttostr(i+1) else if i<100 then s:=s+'0'+inttostr(i+1) else s:=s+inttostr(i+1); end;下面是“开设账户”的工作界面:(图2)图2分析三、客户业务查询功能简介:在这里的客户业务查询中,主要是实现数据库中的模糊查询和组合查询。主要还是对银行业务的查询。在组合查询中,选中一项的查询结果没有选中两项的查询结果细。需要解决的问题:这一功能的实现主要是涉及到界面的制作问题,即,怎样实现组合查询的问题。还有就是模糊查询的语句书写。解决方案:在实现组合查询的功能时,用了DELPHI中的CHECKBOX控件。来判断CHECKBOX后的选项是否作为组合查询的条件之一。然后利用这些条件进行查询。程序运行的界面如下:图3图4而实现这一部分的代码就主要是几个查询语句:adoquery1.SQL.Clear;组合查询时再加上其他条件 str:='select card_type,card_no,fortune_amount as amount from fund_bill where card_type='''+combobox4.Text+'''' adoquery1.SQL.Add(str); adoquery1.Open;模糊查询方面主要是对SQL语法的了解,具体就是like的用法。这一模块基本不存在难度。以下是工作界面:图5分析四、消户模块:功能简介:这是管理员删除客户记录的一个模块,它清除客户在数据库的所有相关信息。所以这也是几个操作的组合。故需要用事务处理,调用存储过程。需要解决的问题:如果用户有透支情况就不许管理员删除客户。如果用户卡上还有余额,则应该把客户卡上的金额连同利息也一同取出来给用户。解决方案:在消户以前应该对用户的卡上是否有余额,是否处于透支状态进行查询。并且在操作时应该调用存储过程,以下是存储过程的源码。消除以前的存/取款日志消除在银行的金额这一过程的工作界面如图6图6§一、客户模块的功能模块总轮廓及功能概要1 模块总轮廓用户服务区客户存款/取款区客户转账/贷款区客户查询区客户密码修改/还贷区余额查询贷款查询还贷记录查询见分析五(主要介绍)见分析六(主要介绍)功能简单见分析七2 功能概要这一模块是实现银行数据库管理系统的核心。是银行的主要功能的体现。在客户存/取款区域设计到利率的计算问题,特别是在取款的时候,要考虑是否透支的情况,及怎样计算用户的最大透支额的问题。在客户转账/贷款区,要实现转账费用的收取,还有贷款号的随机生成,还要根据用户不同的贷款年限分配给贷款不同的利率,在贷款时候还要根据用户的经济能力,给出用户的最大贷款额。用户的所贷款项不能超过这一限制。在还贷区能支持分期付款的功能。二、结合源代码和操作界面详细分析分析五:客户存/取款功能简介:存/取款需要解决的问题:存款由于在数据库设计的时候,把偿还透支放在存款的过程中了,就是如果你有透支,那么你这次的存款将先用来偿还透支,在偿还透支的时候还要比较这次的还款距离上次透支的时间是否超过100天(默认设置透支的最迟还透支额是100天),如果过了100天,则将客户的信誉度减1。同时还要计算你这次是否全部还清了透支。所以存款的情况可以分为以下几种: 没有透支 有透支,但这次存款没还清 有透支,且这次存款还清了。取款由于透支是在所取款额小于用户卡上的金额,且没有透支的情况下,在预给的最大透支额范围内的取款过程。故需要解决以下问题: 用户此次的取款是否属于透支情况。 根据用户的信誉度用户的最大透支额为多少 怎样保证一系列的操作的原子性解决方案兼代码分析:存款存款的不同情况应分别用不同的存储过程。因为,不同的情况要写入到数据库的信息不同。所写的表也不同。故在开始向数据库写入数据时,应该判断属于哪一种情况。同时存款时还应解决以前所存款的利息问题。这本次课程设计中我的利息按天计算。并且每次存款/取款前都要计算利息并把以前的本金和利息一起作为此次操作的本金。以下是几种情况的事务存储过程: 没有透支加入此次的存款额先计算利息,并写回根据是不是最大的一次存款额,来更新用户的经济能力加入存款日志调用上述存储过程时的条件判断程序如下:adoquery1.SQL.Clear;adoquery1.SQL.Add('select amount as tto from overdraft where (card_type=:a and card_no=:b)');adoquery1.Parameters0.Value:=trim(combobox1.Text);adoquery1.Parameters1.Value:=Edit1.Text;adoquery1.Open;先在overdraft表中查询存不存在与所输入卡型和卡号相同的记录,如有,则表明有透支。否则没有透支。调用上述存储过程的程序为:(主要是传递存储过程的参数)ADOStoredProc1.ProcedureName:='Deposit_t_w'ADOStoredProc1.Parameters.Refresh;adostoredProc1.Parameters.ParamByName('type').Value:=trim(combobox1.Text);adostoredProc1.Parameters.ParamByName('Number').Value:=Edit1.Text;adostoredProc1.Parameters.ParamByName('date').Value:=Now();adostoredProc1.Parameters.ParamByName('money1').Value:=strtofloat(Edit2.Text)adostoredProc1.Parameters.ParamByName('id').Value:=id;adostoredProc1.Parameters.ParamByName('TT').Value:=tt;adostoredProc1.ExecProc;Application.MessageBox('存款成功!','提示',0+64);以下是以以前有2000元存款的CK20060219001卡号为例说存款的工作界面:(图7,图8)此处的20是算的利息图7如果以前有存款则把截至到存款这天的利息一并算出来作为其原来的本金。利息的计算是按日计算,利率约定为0.005。显示此次存款额与以前本金与利息的总和图8有透支,但透支额小于存款额即这一次存款能还清全部透支额存储过程如下:(分析见图中的注释)还清了透支,则删除透支记录如果超过了还透支期限(100),则信誉度减1把余下的款额存入银行写入存款日志在存储过程中把需要更新修改的地方全部更新。而且插入删除要满足外码约束,就是更新的顺序要与约束的顺序一致。调用存储过程时也只是传递参数。下面以有透支记录的“CK20060220006”为例说明此种情况的存款情况。该透支记录为工作界面如下图9,图 10,图11(界面分析见图上注释)提示用户的透支额图9一次还清透支额后多余转化为存款图10 有透支,但这次的存款不能还清。存储过程的操作如下:更新透支额,减除还去的一部分如果超过了还透支期限(100天),则信誉度减1在执行上则以卡号为CK20060219003为例说明这种情况,该卡的透支记录为:当我存储6000元后,其调用其存储过程的结果在数据库中反映如下:总体来说,存款过程的几种情况不外乎上面3中。所做的工作主要是事务的存储过程的创立和DELPHI中条件的判断。整个数据的处理主要来自FUND_BILL,因为我们要通过FUND_BILL内容来确定此种存款属于那种情况。还有计算其中的利率。根据数据的处理情况再把结果写入到不同的表中,主要是CUSTOMER,FETCH_DEPO_LOG.分析六、客户转账/贷款区功能简介:转账/贷款需要解决的问题:转账费率的收取,要判断是否是跨行转账。还有转账金额不能超过该卡上的存款金额。贷款主要是贷款号的生成,及根据用户不同的贷款年限确定其贷款利率问题。解决方案:对于转账费率的判断主要是前提条件的确定。主要还在于转账操作的原子性注定其必须用事务操作。所以重点在于转账存储过程的书写,怎样以事务的形式实现转账功能。同时还应该注意转账前对卡上金额利息的计算。转账功能的存储过程书写如下:减去被转去,注意费率的收取,flag1>同行转账加入转账额计算利息下面以数据库中的两组数据展示,这两组数据的原记录如下:转账的工作界面如下:注意卡号为CK20060219002银行的转账后的结果,在数据苦衷显示为:图 11