还剩99页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
天津丰源汽车连锁服务有限公司成立于1988年,由最初从事汽车及汽车配件进出口贸易,发展成为现在拥有5家3000~5000m2汽车用品直营连锁超市、一家3500m2一类大修资质的汽车修理厂、3家三类快修店、一家二手车交易公司、一个汽车锁业公司、一个爱车俱乐部、一个汽车电子技术培训学校的大型联合企业2001年引进国外汽车用品连锁超市的经营模式,借鉴正规美式仓储超市的经营理念及国内大型民用超市的管理经验,开办了大型汽车用品连锁超市2001年~2004年,连续开办了5家直营连锁店公司计划在2010年前再发展20~40家连锁店,除了占领天津市场外,还要进军外埠市场
4.
1.1 用户发展战略
1.横向发展战略利用自身的优势,涉足与汽车相关的所有领域,包括汽车销售、汽车进出口贸易、二手车销售、爱车俱乐部、汽车装饰用品加工生产及开办汽车电子学校等
2.纵向发展战略 依托领先的专业品质和16年的行业经验,构筑天津乃至华北地区汽车用品连锁超市网络 沿袭欧美风尚,创造丰源车居文化,引导有车族的消费观向着更高品味发展 拓展丰源汽车用品经营范围,向“高、精、尖、全”发展;不断开发汽车服务领域,以高质量的服务,力争作汽车行业的“龙头”
3.公司发展目标 5年之内再开设20~40家连锁超市,占领天津市场 以天津为基地,进军外埠市场,力争10年内在华北地区赢得一定的市场占有率
4.
1.2 项目整体目标对企业的各个层面进行全面、细致、规范的管理为实现管理手段的科学化、现代化和规范化建立一套先进的信息管理系统通过本系统的使用,能够达到以下目标 精确、实时地反映和准确处理公司各项业务活动,实现企业商品“进、销、调、耗、存、结”以及汽车维修、美容、加工的一体化管理 对汽车维修、美容、加工等环节进行精细化管理 对商品进行条码管理,从商品入库、出库到盘点,统一通过条码进行管理,从而杜绝人为错误的操作和由此导致的盘点数据不正确的问题 有效控制商品的采购,避免商品短缺或重复进货,提高资金利用率 优化商品结构,减少资金占用 合理控制库存,提高库存周转率 彻底解决信息孤岛问题,将各分店、各部门的信息完全共享,为公司将来的快速扩张提供强有力的支持 利用视窗卡对会员进行智能化、人性化的管理,提高公司的形象 及时、准确地将企业各类信息加工处理后反馈给公司的最高管理层,提供可靠、完整、科学的决策依据 加强对员工管理考核的科学性,提高劳动效率,充分调动员工的积极性和创造性 对于公司组织机构的调整、人员职务的变化、业务流程的重新设计及业务操作细节的调整,系统能够有足够的应变机制和可扩展性,从而快速地适应公司的编号财务管理作为企业管理的组成部分,与经济价值或财富的保值增值有关,是关于创造财富的决策,企业生存、发展、获利的总目标离不开财务的筹资、投资以及对资金的运用管理另一方面,财务管理目标是制定生产目标、销售目标等一系列目标的基础和前提,这使得财务管理在企业管理中处于一个核心地位,财务管理目标将从根本上反映企业的总目标所以确立一个合理的财务管理目标对企业的长远发展有着极为重要的意义
4.
2.1 财务管理的任务近来,美国接二连三发生的著名企业财务作假事件,不仅沉重地打击了美国经济和投资者的信心,同时也在全球经济一体化的今天,警示着中国企业的决策者们,要让更多的职业经理人具有一双能够识别伪装的慧眼,使企业能够防患于未然,将风险降至最小当前中国许多企业面临着许许多多的问题,然而比较具有普遍性的是企业的经营决策仅凭经验感性判断,缺乏必要的理论指导和定量分析,财务会计信息资源未能得到充分利用财务管理是为实现企业的目标服务的,并受财务管理的内容制约基本任务是依法合理筹资并有效地利用企业各项资产,最终提高效益具体来说,企业的财务管理任务包括以下几方面内容1依法合理筹集资金,满足企业资金需要量企业进行生产经营活动需要必备的资金额,企业财务管理的首要任务是合理地从各种渠道,采用种种方式合理地筹集到生产经营活动所需要的资金这项任务有两个面向,一是要正确确定企业的资金需求量,二是要选择好获得资金的渠道和方式因为企业筹资有多种渠道和方式可供选择,在进行比较选择时主要考虑资金成本,偿还期限,担保条件可能性和资金供应者的其他具体要求,并考虑其对企业投资收益和风险影响,据此选择确定企业筹资的最佳组合方式2有效地分配和使用企业资金,提高资金利用效果财务管理部门应规划性地,合理地安排各类资产,使其形成合理的资产结构要使货币资产保持在最佳的水平上,要避免存货资产占用过多,要及时解决资金使用过程中出现的问题,加速资金周转,提高资金的利用效果3分配企业的收益,协调各方面的经济关系税后利润按照规定的顺序进行分配,在分配中处理好各方面的经济关系,以调动企业、员工、投资者各方面的积极性4实行财务监督,维护财经法规财务监督是利用货币形式对企业的经济活动进行监督,它是通过对财务收支的审核控制和对财务指标的检查分析,及时发现生产经营活动存在的问题,及时进行处理实行财务监督,能够促使企业在严格地规范化的范围内生产经营,维护法律制度上的企业完整性
4.
2.2 会计学的理论基础会计学是一门专门的学科,涉及众多内容,这里不可能一一深入介绍,下面仅介绍一些原理性的知识,通过这些介绍读者基本可以了解会计学的基本理论,从而对财务管理有一个基本的认识1会计的对象会计的一个显著特点是以货币形式对经济活动进行反映,而会计的对象就是会计核算和监督的内容,因此概括地说,会计对象是扩大再生产过程中的资金运动,企业的会计对象是企业经营活动中的资金运动企业的资金运动在经营活动中表现为各种经济业务,因此企业会计对象又具体表现为反映资金运动的企业经营活动中的经济业务会计对象具体表象的经济业务,按其性质的分类,就形成会计对象的要素会计对象要素主要包括资产、负债、所有者权益、收入、费用、利润等2会计的职能会计职能是会计应发挥的作用或应有的功能会计的基本职能有两项,即会计核算职能和会计监督职能会计核算是以货币为主要计量单位,对企业、事业等单位一定时期的经济活动进行真实、准确、完整和及时的记录、计算和报告会计核算的内容是会计对象要素,具体表现为经济活动中的各种经济业务,包括 款项和有价证券的收付 财物的收发、增减和使用 债权债务的发生和结算 资本、基金的增减和经费的收支 收入、费用、成本的计算 财务成果的计算和处理 其他需要办理会计手续、进行会计核算的事项会计核算要求做到真实、准确、完整和及时会计核算是一个过程,在企业中,经济业务发生后,要填写原始凭证,编制记帐凭证,根据记帐凭证登记会计帐簿,根据会计帐簿和有关资料编制会计报表会计监督是指依据监督标准,对企业、事业等单位的资金运动进行的指导、控制和检查会计监督的对象是资金运动,而资金运动在企业中主要负责筹集资金、使用资金和收回资金会计对资金运动的监督主要表现在 监督经济业务的真实性 监督财务收支的合法性 监督公共财产的完整性3会计核算方法在会计核算方法体系中,主要的方法有
①设置会计科目和帐户会计科目就是对会计对象的具体内容进行分类核算的项目,而设置会计科目就是在设计会计制度时事先规定这些项目,然后根据它在帐目中开立帐户,分类、连续地记录各项经济业务,反映由于各经济业务的发生而引起的各会计要素的增减变动情况和结果,为经营管理提供各种类型的会计指标
②复式记帐复式记帐是与单式记帐相对应的一种记帐方法,这种记帐方法的特点是对每一项经济业务都要以相等的金额同时记入两个或两个以上的有关帐户,例如我们用银行存款购买材料按照复式记帐法就应该一方面记材料的增加,另一方面记银行存款的减少它的优点就是通过帐户的对应关系,可以了解有关经济业务内容的来龙去脉,通过帐户的平衡关系,可以检查有关业务的记录是否正确
③填制和审核会计凭证会计凭证是记录经济业务,明确经济责任的书面证明,也是登记帐簿的依据业务发生以后,首先要取得凭证,凭证必须经过会计部门或有关部门审核,只有经过审核并认为正确无误的会计凭证才能作为记帐的依据,而作为会计核算的方法,填制和审核凭证不仅为经济管理提供真实可靠的数据资料,也是实行会计监督的一个重要方面
④登记会计帐簿帐簿是用来全面、连续、系统地记录各项业务的簿籍,是保存会计数据资料的重要工具而登记帐簿就是将会计凭证记录的经济业务,序时分类的记入有关簿籍中设置的各个帐户登记帐簿必须以凭证为根据并定期进行结帐、对帐以便为编制会计报表提供完整而系统的会计数据
⑤成本计算成本计算就是指在生产经营过程中按照一定的对象归集和分配发生的各种费用支出,以确定该对象的总成本和单位成本的一种专门方法通过成本计算可以确定材料的采购成本、产品的生产成本和销售成本,也就是说,在这个生产经营过程当中,既要计算材料的采购成本,也要计算产品的生产成本和销售成本通过成本计算,可以反映和监督生产经营过程当中发生的各项费用是否节约或超支,并据此确定企业的经营盈亏
⑥财产清查财产清查是指通过盘点实物、核对帐目,保持帐实相符的一种方法在清查当中如果发现财产物资和货币资金的实有数与帐面结存数额不一致,应该及时查明原因,通过一定的审批手续进行处理,并调整帐簿记录,使帐面数额与结存数额保持一致从而保证会计核算资料的正确性和真实性
⑦编制会计报表会计报表是根据帐簿记录定期编制的它是一种总括并反映了企业或行政事业单位在特定时点月末、季末、年末和一定时期月、季、年的财务状况、经营成果以及成本费用等的书面文件会计报表提供的资料不仅是分析考核财务成本计划和预算执行情况,以及编制下期财务成本计划和预算的重要依据,也是进行经营决策和国民经济综合平衡工作必要的参考资料这些方法反映了会计核算过程在会计核算过程中,填制和审核会计凭证是开始环节登记会计帐簿是中间环节,编制会计报表是终结环节在一个会计期间所发生的所有经济业务都要经这三个环节进行处理,将大量的经济业务转换为系统的会计信息,这个转换过程也就是从填制和审核凭证到登记帐簿,直到编制出会计报表,周而复始的变化过程就是一般所讲的会计循环经济业务发生后,经办人员要添置或取得原始凭证,经会计人员审核整理后,按照设置的会计科目,运用复式记帐法编制记帐凭证并据以登记帐簿,要依据凭证和帐簿记录对生产经营过程中发生的各项费用进行成本计算,并依据财产清查对帐簿记录加以核实,在保证帐实相符的基础上定期编制会计报表4会计科目我国企业会计准则将企业会计要素划分为资产、负债、所有者权益、收入、费用和利润六个要素,这些要素对应不同的会计科目会计科目是对会计对象具体内容及会计要素进一步分类核算的项目为了全面系统地反映和监督各项会计要素的增减变动情况,分门别类地为经济管理提供会计核算资料,就需要设置会计科目设置会计科目就是通过会计制度预先规定这些项目的名称,并限定其核算的内容范围,它是设置帐户、处理帐务所必须遵守的规则和依据,是正确组织会计核算的一个重要条件例如,为反映和监督各项资产的增减变动,设置了现金、材料、长期投资、固定资产等科目;为反映和监督负债和所有者权益的增减变动,设置了短期借款、应付帐款、长期借款和资本公积、盈余公积等科目为反映和监督收入费用和利润的增减变动设置了产品销售收入、生产成本,本年利润和利润分配等科目5帐户设置会计科目只是规定了对会计对象具体内容进行分类核算的项目,而为了及时、连续、系统地记录由于经营业务的发生而引起的会计要素的增减变动,提供各种会计信息,还必须根据规定的会计科目在帐簿中开设帐户帐户是对会计要素进行分类核算的工具,它应该以会计科目作为它的名称并具有一定的格式帐户的设置也与帐户的级次有关,也就是根据总分类科目开设总分类帐户,根据明细科目开设明细帐户由于总分类帐户提供的是总括核算指标,因而一般的只用货币计量而明细帐户提供的是明细分类核算指标,因而除了用货币量度外,有的还用实物量度,进行辅助计量既然帐户是用来分类记录经营业务的,就必须具有一定的结构由于经济业务发生所引起的各项会计要素的变动,从数量上来看,不外乎是增加和减少两种情况因此帐户结构也相应地分为两个基本部分,划分为左右两方,以一方登记增加额,另一方登记减少额如图
4.1所示,图
4.2是银行存款和应付帐款的帐户实例帐户要依附于帐簿开设,每一个帐户只表现为帐簿中的某章或某些帐页,它们一般应该包括帐户的名称、日期和摘要、增加和减少的金额及余额、凭证号数等图
4.1 帐户结构图
4.2 帐户实例6会计科目与帐户的关系会计帐户和会计科目是两个既有区别又相互联系的概念,它们的联系是帐户是根据会计科目设置的会计科目就是帐户的名称,设置会计科目和开设帐户的目的都是为了分类提供会计信息,两者所反映的经济内容是一致的它们的区别是会计科目仅是分类核算的项目,而帐户既有名称又有具体结构;会计科目是进行分类核算的依据,而帐户则是记录经济业务的载体在实际工作中,会计科目和帐户往往作为同义词来理解,互相通用,不加区别7复式记帐原理记帐方法是在帐户中登记经济业务的方法经济业务的发生会引起各有关会计要素的增减变动为将这些经济业务记录在有关的帐户中,曾采用过单式记帐和复式记帐两种方法单式记帐是指对发生的经济业务只在一个帐户中进行记录的记帐方法,例如用银行存款购买材料的业务,发生后,采用单式记帐法只在帐户中记录银行存款的付出业务,而对材料的收入业务却不在帐户中记录与单式记帐不同,复式记帐是指对发生的每一项经济业务都以相等的金额,在相互关联的两个或两个以上帐户中进行记录的记帐方法例如上述用银行存款购买材料的业务,按照复式记帐则应以相等的金额,一方面在银行的存款帐户中记录银行存款的付出业务;另一方面在材料帐户中记录材料的收入业务8借贷记帐法借贷记帐法是以借贷作为记帐符号,反映各项会计要素增减变动情况的一种记帐方法,是各种复式记帐方法中应用得最广泛的一种方法从上面的定义可以看出,借贷记帐法是一种复式记帐法,它的特点是以借贷作为记帐符号,反映各项会计要素增减变动情况借贷记帐法的记帐规则是“有借必有贷,借贷必相等”也就是说,由于资金运动的数量变化不外乎增加或减少,一个要素项目的金额增加引起的是同类性质的另一个或几个项目的金额减少,或另一类性质的某一个或几个项目的金额增加或减少,而不同性质要素项目帐户的金额增减恰恰是用不同的记帐符号“借”或“贷”来表示的因此借贷记帐法下对于每一笔经济业务的帐务处理都必然是既要用“借”方反映增加项目的金额,又要用“贷”方反映减少项目的金额,这就叫做“有借必有贷,借贷必相等”,如图
4.3所示9会计分录会计分录就是标明某项经济业务的应借应贷帐户及其金额的记录,所有的财务管理软件都要有“会计分录”的功能,就是以借贷记帐法输入所有的企业经济业务注意会计分录的书写格式一般是借方在上贷方在下,而且贷方应该向右错开一格若有多个借方或多个贷方,则借贷方各自应该对齐会计分录的实例如图
4.3所示图
4.3 借贷记帐法会计分录10试算表与试算平衡把整个期间一个月或一年的会计分录,从会计凭证全部过入分类帐后,各分类帐就已经记录和反映了当期的经济业务为了验证各分类帐登记和过帐的会计处理的正确性,根据“有借必有贷,借贷必相等”的平衡原理,编制“试算表”进行试算平衡,同时也为编制财务报表作好了准备,如图
4.4所示图
4.4 试算表11结帐与会计报表为了总结一定会计期间财务状况和经营成果的大小,企业一般在会计期末进行结帐结帐是一项将帐簿记录定期结算清楚的帐务工作结帐后会形成该会计期间的会计报表,常用的会计报表有损溢表和资产负债表,分别如图
4.5和
4.6所示图
4.5 损溢表图
4.6 资产负债表根据以上对财务管理内容的分析和会计基础知识的介绍,一个标准的财务管理系统应该包括如图
4.7所示的几大功能除此之外系统还应包括信息系统必须具备的通用功能,例如系统管理、权限设置、数据备份与恢复等,这些功能的实现可以参考第1章其中每个功能都由若干相关联的子功能模块组成图
4.7 财务管理系统应包括的基本功能财务管理系统的基本流程如图
4.8所示图
4.8 财务管理系统基本流程
4.
3.1 基础资料维护“基础资料维护”用于对会计科目、核算项目以及凭证、帐簿、固定资产等项目进行初始化设置,这些设置一般不轻易改动,包含的功能模块如图
4.9所示图
4.9 “基础资料维护”功能模块其中“会计科目”是基础资料的重点,财务软件的使用离不开科目的正确设置,其内容包括科目代码、科目名称、助记码、科目类别、是否存货科目、余额方向、数量单位等
4.
3.2 凭证管理“凭证管理”用于完成凭证制定、审核、记帐、查询等功能,自动生成各种会计帐,包含的功能模块如图
4.10所示图
4.10 “凭证管理”功能模块其中“凭证输入”是凭证管理的重点,在凭证输入模块中将实际业务的分录输入到计算机,内容包括凭证状态、会计期间、凭证字号、凭证编号、顺序号、日期、附单据、审核、过帐、制单、借方合计、贷方合计、过帐状态、顺序号码等一张凭证对应多个分录,分录内容包括分录编号、会计期间、凭证字号、凭证编号、摘要、科目代码、借方、贷方、数量、单价、结算方式、结算号、结算日期等
4.
3.3 帐簿管理“帐簿管理”用于提供各种帐务处理查询筛选的功能,包含的功能模块如图
4.11所示总帐可按科目级别、币别、科目范围等查询;明细帐可按期间范围、币别、科目范围查询;还提供多栏帐、数量金额明细帐、核算项目分类总帐等帐簿报表图
4.11 “帐簿管理”功能模块
4.
3.4 报表管理“报表管理”用于报表的定义、编制和输出企业会计核算的结果最后需要用报表的形式反映出来,一般包括帐务报表处理、汇总报表处理、合并报表处理等一般财务系统会预设资产负债表、损益表、利润分配表等各类报表模板,如图
4.12所示,简化报表操作过程图
4.12 “报表管理”功能模块
4.
3.5 期末处理“期末处理”是系统总结某一会计期间的经营活动情况,转至下一期的必做事项同时该模块在结帐前,按企业财务管理和成本计算的要求,必须进行制造费用、产成品成本的结转、期末调汇及损益结转等工作,包含的功能模块如图
4.13所示图
4.13 “期末处理”功能模块
4.
3.6 往来管理“往来管理”用于对企业的往来帐款进行全面核算、管理、分析、预测、决策一般包括往来单位管理、经济业务的管理、往来帐龄分析等模块、往来帐款的核销、坏帐处理等功能,如图
4.14所示图
4.14 “往来管理”功能模块
4.
3.7 出纳管理出纳是会计中十分重要的一个岗位,它担负着现金、银行存款的收付职能“出纳管理”既可同总帐系统联合起来使用,也可单独提供给出纳人员使用一般包括现金帐管理、银行存款帐管理、票据管理等,如图
4.15所示图
4.15 “出纳管理”功能模块出纳系统与帐务系统功能分离但数据却可紧密连结共享,合理的数据共享模式可使得会计与出纳人员更能高效的独立工作
4.
3.8 工资管理“工资管理”用于进行企业工资的发放和核算,工资动态变动管理,工资费用计提与分配、银行代发等;一般包括基础设置、工资结构设置、工资变动管理、工资数据处理、工资报表管理等功能,如图
4.16所示 图
4.16 “工资管理”功能模块
4.
3.9 固定资产管理“固定资产管理”用于管理、核算固定资产增减变化、变动、以及折旧的计提、转帐等,一般包括如图
4.17所示的功能模块允许不同固定资产采用不同的折旧方法,提供标准的折旧方法,提供固定资产卡片自定义设置功能和灵活的报表查询系统图
4.17 “固定资产管理”功能模块
4.
3.10 财务分析“财务分析”是财务管理的重要组成部分,在核算的基础上以财务报表和其他资料为依据和起点,采用专门方法,系统分析和评价企业的过去和现在的经营成果、财务状况及其变动,对帐务数据作进一步的加工、整理、分析和研究,将大量的报表数据转换成对决策有用的信息,是管理层进行日常及重大决策的好帮手,包含的功能模块如图
4.18所示图
4.18 “财务分析”功能模块“财务状况分析”对截止报告期的资产、负债及所有者权益的结构、比例及变化趋势等情况进行分析,可分为结构分析、比较分析、趋势分析三种分析方法结构分析对资产、负债及所有者权益中每一具体项目占该类项目以及与总体项目的结构、比重进行分析,从而揭示该类财务指标的结构是否合理;比较分析能对同口径指标名称相同、计算方法相同指标在任意两个会计期间或一个会计期间与它的预算值之间进行比较,借以反映其增减变动情况;趋势分析反映某一财务指标,如资产总计、流动资产合计、银行存款等在年度内月份之间、季度之间和年度之间变化的趋势“损溢分析”对本期、本年累计及任一会计期间的盈利状况和盈利能力进行分析对损益分析也可分为结构分析、比较分析、趋势分析三种分析方法根据以上需求分析,一个基本的财务管理系统数据库中大致包括100多张数据表,分别存放相应子功能的数据信息,其中“科目表”是关键的表,用于存放科目的信息其他涉及科目信息的数据表,都只记录科目的代码,根据作为外键的“科目代码”字段相对应因此“科目表”和其他数据表间的关系是1∶N的关系
4.
4.1 财务管理系统E-R图图
4.19所示为财务管理系统E-R图图
4.19 财务管理系统E-R图
4.
4.2 财务管理系统数据表清单配书光盘中“\Chap4\建库脚本\财务管理系统.sql”文件提供了创建数据库所有表的脚本,下面我们仅列出一些重要表的名称及其用途供读者参考表
4.1其中每张表所包含的字段读者可以自己查看建库脚本和前面的需求分析表
4.1 财务管理系统数据表清单数据表名称数据表用途科目表保存企业财务的科目设置信息科目余额表保存财务帐户科目的余额信息分录表用于凭证管理中的分录输入凭证表用于凭证输入管理分录历史表分录输入确认后数据放入历史凭证历史表凭证输入确认后数据放入历史明细帐簿用于企业财务明细帐簿的输入分类帐簿用于企业财务分类帐簿的输入本年明细帐簿年度明细帐簿的汇总本年分类帐簿年度明分类簿的汇总历史明细帐簿保存明细帐簿历史历史分类帐簿保存分类帐簿历史财务状况变动表保存企业财务的财务状况变动表信息年终损益表保存企业财务的年终损溢表信息年终资产负债表保存企业财务的年终资产负债表信息固定资产清单保存企业的固定资产基础资料信息变动资料表保存企业的固定资产的变动信息变动资料历史表保存企业的固定资产变动历史折旧分配表保存固定资产折旧分配的方法固定资产变动情况表保存计算固定资产变动情况固定资产折旧表存储用来生成转帐凭证的本期折旧数据,在计提折旧时生成数据固定资产折旧登记表存储固折旧方式、使用期间、预计工作总量、月折旧率等折旧工作量登记表按工作量折旧的固定资产的工作量输入折旧工作量历史表保存固定资产工作量历史固定资产折旧汇总表统计用表固定资产处理情况表统计用表固定资产构成分析表统计用表员工清单保存企业员工信息工资清单保存员工工资的明细项目工资表保存当月员工工资信息,由员工清单和工资清单计算生成工资费用分配表按各部门职务为类别对员工工资费用分配银行代发工资文件过帐时生成,保存银行代发工资的历史信息工资汇总表统计用表工资发放表保存转帐后工资发放历史工资统计表统计用表基于以上需求分析和数据库分析,读者对一个标准的财务管理系统应该有了一个全面的认识下面我们将实例说明如何利用Delphi完成系统的开发
4.
5.1 实例功能由于篇幅有限,本实例详细介绍如图
4.20所示的功能的开发过程,并简化其中各功能图
4.20 详细介绍的功能模块所包含的属性,其他功能读者完全可以参照这些功能的开发方法完成开发需要强调的是,由于用户登录和权限管理的功能各个系统实现的方法是一致的,这里就不在详细介绍,具体实现方法参看第1章
4.
5.2 系统流程图系统流程图如图
4.21所示图
4.21 系统流程图根据实例介绍,“科目表”是系统的关键表,其他各表均与“科目表”通过“科目代码”字段进行多对一的关联系统共需要11张表,用途分别如表
4.2所示表
4.2 系统数据表及其用途数据表名称数据表用途科目表保存企业财务的科目设置信息帐簿初始化表正式使用系统前初始化科目的期初余额凭证表输入会计凭证,分录表的主表分录表输入会计分录,分录表的从表科目余额表保存各个会计期间的科目借、贷、余额情况凭证表历史保存过帐后的凭证历史分录表历史保存过帐后的分录历史本期明细帐簿保存当前会计期间的明细帐簿数据本期汇总帐簿保存当前会计期间的明细帐簿数据,期末结帐后期末变成新会计期间的期初资产负债表统计用表,用于计算资产负债表系统参数表系统运行所需的参数信息
4.
6.1 创建数据库打开SQLServer企业管理器,新建一个数据库,名称为caiwubook利用配书光盘中的脚本代码“\Chap4\建库脚本\财务管理系统实例程序.sql”文件创建数据库对象,完成数据库的设计也可以利用“\Chap4\建库脚本\caiwubook.bak”文件直接恢复数据库,这样数据库中存在初始的科目信息和系统参数数据数据后面几小节我们将列出几个重点的数据表的建库脚本,其他数据表的脚本请参考脚本文件
4.
6.2 创建“科目表”数据表创建“科目表”数据表的SQL脚本如下CREATETABLE[dbo].[科目表] [科目代码][char]20NOTNULL [科目名称][char]20NULL [助记码][char]20NULL [科目类别][char]20NULL [是否存货科目][char]10NULL [余额方向][char]4NULL [数量单位][char]10NULLON[PRIMARY]GO
4.
6.3 创建“凭证表”和“分录表”数据表创建“凭证表”数据表的SQL脚本如下CREATETABLE[dbo].[凭证表] [凭证编号][char]10NOTNULL [会计期间][int]NULL [凭证字号][char]2NULL [日期][datetime]NULL [附单据][int]NULL [制单][char]20NULL [借方合计][money]NULL [贷方合计][money]NULL [过帐状态][char]4NULL [凭证状态][char]10NULLON[PRIMARY]GO 创建“分录表”数据表的SQL脚本如下CREATETABLE[dbo].[分录表] [编号][int]IDENTITY11NOTNULL [凭证编号][char]10NOTNULL [摘要][char]40NULL [科目代码][char]20NULL [借方][money]NULL [贷方][money]NULL [数量][int]NULL [单价][money]NULL [结算方式][char]10NULL [结算号][int]NULL [结算日期][datetime]NULLON[PRIMARY]GO
4.
6.4 创建其他关键数据表以下是其他关键数据表的创建脚本,其他数据表可以参看配书光盘中的相关内容CREATETABLE[dbo].[科目余额表] [科目代码][char]20NULL [期初借方余额][money]NULL [期初贷方余额][money]NULL [本期借方发生额][money]NULL [本期贷方发生额][money]NULL [本年借方累计发生额][money]NULL [本年贷方累计发生额][money]NULL [本期借方余额][money]NULL [本期贷方余额][money]NULL [最后结算分录][int]NULL [会计期间][int]NULL [余额方向][char]4NULL [内部编号][int]IDENTITY11NOTNULLON[PRIMARY]GO CREATETABLE[dbo].[资产负债表] [会计期间][int]NOTNULL [现金及现金等价物][money]NULL [应收帐款][money]NULL [坏帐准备][money]NULL [应收帐款净值][money]NULL [流动资产总计][money]NULL [固定资产原值][money]NULL [累计折旧][money]NULL [固定资产总计][money]NULL [其他资产][money]NULL [资产总计][money]NULL [应付帐款][money]NULL [预收帐款][money]NULL [应付工资][money]NULL [其他负债][money]NULL [负债总计][money]NULL [实收资本][money]NULL [资本公积][money]NULL [赢余公积][money]NULL [未分配利润][money]NULL [所有者权益总计][money]NULL [负债及所有者权益总计][money]NULLON[PRIMARY]GO
4.
6.5 创建主键及外键等表约束在查询分析器中通过如下代码创建数据表的主键及外键等表约束--主键、外键关联字段ALTERTABLE[dbo].[科目表]WITHNOCHECKADD PRIMARYKEY CLUSTERED [科目代码] ON[PRIMARY]GO ALTERTABLE[dbo].[凭证表]WITHNOCHECKADD CONSTRAINT[PK_凭证表]PRIMARYKEY CLUSTERED [凭证编号] ON[PRIMARY]GO ALTERTABLE[dbo].[分录表]WITHNOCHECKADD CONSTRAINT[PK_分录表]PRIMARYKEY CLUSTERED [编号] ON[PRIMARY]GO ALTERTABLE[dbo].[帐簿初始化表]WITHNOCHECKADD PRIMARYKEY CLUSTERED [科目代码] ON[PRIMARY]GO ALTERTABLE[dbo].[本期汇总帐簿]WITHNOCHECKADD CONSTRAINT[PK_本期汇总帐簿]PRIMARYKEY CLUSTERED [科目代码] ON[PRIMARY]GO ALTERTABLE[dbo].[分录表]ADD CONSTRAINT[FK_分录表_凭证表]FOREIGNKEY [凭证编号] REFERENCES[dbo].[凭证表] [凭证编号] CONSTRAINT[分录表_科目代码_fk]FOREIGNKEY [科目代码] REFERENCES[dbo].[科目表] [科目代码] GO-------------------------------------------其他外键、主键等约束参看配书光盘脚本
4.
6.6 创建存储过程系统使用了“sf_初始化帐户”、“sf_启用帐户”、“sf_凭证过帐”、“sf_期末结帐”和“sf_计算资产负债表”5个存储过程,实现的功能分别为新建帐套、启用帐套、凭证过帐确认、期末结帐和运算指定会计期间的资产负债表等功能具体计算方法在下面的脚本中有详细的注释,读者可以参考这些注释createprocsf_初始化帐户asbegintran --清除原来数据,从新建立帐户 deletefrom帐簿初始化表 --设置帐户初始基本数据 insertinto帐簿初始化表 科目代码科目名称累计借方累计贷方期初余额余额方向 select科目代码科目名称000余额方向from科目表 --设置初始信息 update系统参数表set取值=datepartmmgetdate where参数名称=会计期间开始月份 update系统参数表set取值=datepartmmgetdate where参数名称=当前会计期间commitGO createprocsf_启用帐户asbegintran --清除原来数据,从新建立帐户 deletefrom科目余额表 deletefrom本期汇总帐簿 deletefrom本期明细帐簿 deletefrom分录表 deletefrom分录表历史 deletefrom凭证表 deletefrom凭证表历史 --设置本期汇总帐簿及科目余额表 insertinto本期汇总帐簿select科目代码0期初余额 0000期初余额余额方向from帐簿初始化表 update本期汇总帐簿set会计期间=b.取值from 系统参数表asbwhere参数名称=当前会计期间 insertinto科目余额表科目代码期初借方余额期初贷方余额 本期借方发生额本期贷方发生额本年借方累计发生额 本年贷方累计发生额本期借方余额本期贷方余额 余额方向 select科目代码累计借方累计贷方0000 casewhen余额方向=借方then期初余额else0end casewhen余额方向=贷方then期初余额else0end 余额方向from帐簿初始化表 update科目余额表set会计期间=b.取值from 系统参数表asbwhere参数名称=当前会计期间commitGO createprocsf_凭证过帐asbegintran --设置本期汇总帐簿信息 update本期汇总帐簿set本期借方合计=本期借方合计+b.借方 本期贷方合计=本期贷方合计+b.贷方 本年借方累计=本年借方累计+b.借方 本年贷方累计=本年贷方累计+b.贷方 余额=余额+casewhen余额方向=借方then借方-贷方 else贷方-借方end from本期汇总帐簿asa select科目代码sum借方as借方sum贷方as贷方 from分录表asf凭证表aspwheref.凭证编号=p.凭证编号 groupbyf.科目代码asb wherea.科目代码=b.科目代码 --设置本期明细帐簿信息 insertinto本期明细帐簿分录编号会计期间凭证字号凭证编号摘要 科目代码借方贷方数量单价结算方式结算号结算日期 select编号会计期间凭证字号p.凭证编号摘要科目代码借方贷方数量单价 结算方式结算号结算日期from凭证表asp分录表asfwheref.凭证编号=p. 凭证编号 --计算余额 update本期明细帐簿 set余额方向=a.余额方向from科目表asa where本期明细帐簿.科目代码=a.科目代码 --通过游标循环计算余额 declare@bhint@dmchar20@jfmoney@dfmoney declare@fxchar4@bjchar4@yemoney@kjqjint declaremycursorcursorforselect内部编号科目代码 借方贷方余额方向余额标记会计期间from本期明细帐簿 where余额标记isnull orderby内部编号 openmycursor fetchnextfrommycursorinto@bh@dm@jf@df@fx@bj@kjqj while@@fetch_status=0 begin select@ye=余额from本期明细帐簿where内部编号inselectmax内部编号from 本期明细帐簿where内部编号@bhand科目代码=@dmand余额标记=是 --没有,本期第一条明细,从科目余额表取余额 if@yeisnull select@ye=casewhen余额方向=借方then 本期借方余额-本期贷方余额else 本期贷方余额-本期借方余额end from科目余额表where会计期间=@kjqj and科目代码=@dm select@ye=isnull@ye0 update本期明细帐簿 set余额=casewhen@fx=借方then @ye+@jf-@dfelse @ye+@df-@jfend 余额标记=是 where内部编号=@bh fetchnextfrommycursorinto@bh@dm@jf@df@fx@bj@kjqj end closemycursor deallocatemycursor --更改状态 update凭证表set过帐状态=已过 --放入历史 insertinto凭证表历史select*from凭证表 insertinto分录表历史select*from分录表 --清除已过帐数据,注意,应放到程序中清除,因为要统计凭证张数/分录张数和金额 --统计后删除 --deletefrom分录表 --deletefrom凭证表commitGO createprocsf_期末结帐asbegintran --先将没有过帐的凭证过帐 execsf_凭证过帐 declare@kjqjint --当前会计期间 select@kjqj=会计期间from本期汇总帐簿 --计算科目余额表,可以统计资产负债表/损溢表等 update科目余额表set本期借方发生额=b.本期借方合计本期贷方发生额=b.本期贷方合计 会计期间=b.会计期间余额方向=b.余额方向 from 科目余额表asa本期汇总帐簿asb wherea.科目代码=b.科目代码anda.会计期间=b.会计期间 update科目余额表set 本年借方累计发生额=本年借方累计发生额+本期借方发生额 本年贷方累计发生额=本年贷方累计发生额+本期贷方发生额 本期借方余额=期初借方余额+本期借方发生额 本期贷方余额=期初贷方余额+本期贷方发生额 where会计期间=@kjqj --更新会计期间 update系统参数表set取值=取值+1where参数名称=当前会计期间 --将本期汇总帐簿和明细帐簿倒入历史,实例程序不演示 ---------------------------------------------- --清除汇总帐簿和明细帐簿,进入新的会计期间 update本期汇总帐簿set会计期间=会计期间+1期初余额=余额 本期借方合计=0本期贷方合计=0余额=0 deletefrom本期明细帐簿 --新会计期间的科目余额表 insertinto科目余额表科目代码期初借方余额期初贷方余额本期借方发生额 本期贷方发生额本年借方累计发生额本年贷方累计发生额本期借方余额 本期贷方余额余额方向会计期间 select科目代码本期借方余额本期贷方余额0000 本期借方余额本期贷方余额余额方向会计期间+1 from科目余额表where会计期间=@kjqjcommitGO createprocsf_计算资产负债表@kjqjintasbegintran --计算资产负债表,这里提供计算的方法仅供演示 --没有列出的明细项目都归到其他资产和其他负债里 --注意,这里按照科目代码统计,主要说明资产负债表的含意和计算方法 --如果科目代码不是这样,则该存储过程需要作相应的修改 deletefrom资产负债表where会计期间=@kjqj insertinto资产负债表会计期间values@kjqj update资产负债表set现金及现金等价物=b.金额from资产负债表asa selectsumisnull本期借方余额0-isnull本期贷方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=101and科目代码=111 asbwherea.会计期间=@kjqj update资产负债表set应收帐款=b.金额from资产负债表asa selectsumisnull本期借方余额0-isnull本期贷方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=121and科目代码=129and科目代码125 asbwherea.会计期间=@kjqj --注意坏帐准备为贷方 update资产负债表set坏帐准备=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=125 asbwherea.会计期间=@kjqj update资产负债表set应收帐款净值=应收帐款-坏帐准备 update资产负债表set流动资产总计=现金及现金等价物+应收帐款净值 update资产负债表set固定资产原值=b.金额from资产负债表asa selectsumisnull本期借方余额0-isnull本期贷方余额0as金额 from科目余额表where会计期间=@kjqjand科目代码=171 asbwherea.会计期间=@kjqj --注意累计折旧为贷方 update资产负债表set累计折旧=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand科目代码=175 asbwherea.会计期间=@kjqj update资产负债表set固定资产总计=固定资产原值-累计折旧 update资产负债表set其他资产=b.金额from资产负债表asa selectsumisnull本期借方余额0-isnull本期贷方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=131and科目代码=195and科目代码171 and科目代码175 asbwherea.会计期间=@kjqj update资产负债表set资产总计=流动资产总计+固定资产总计+其他资产 --计算负债及所有者权益 --负债类级别都是贷方金额 update资产负债表set应付帐款=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=201and科目代码=204 asbwherea.会计期间=@kjqj update资产负债表set预收帐款=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=206 asbwherea.会计期间=@kjqj update资产负债表set应付工资=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand科目代码=215 asbwherea.会计期间=@kjqj update资产负债表set其他负债=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=209and科目代码=281and科目代码215 asbwherea.会计期间=@kjqj update资产负债表set负债总计=应付帐款+预收帐款+应付工资+其他负债 --计算所有者权益 update资产负债表set实收资本=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand科目代码=301 asbwherea.会计期间=@kjqj update资产负债表set资本公积=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand科目代码=311 asbwherea.会计期间=@kjqj update资产负债表set赢余公积=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand科目代码=313 asbwherea.会计期间=@kjqj update资产负债表set未分配利润=b.金额from资产负债表asa selectsumisnull本期贷方余额0-isnull本期借方余额0as金额 from科目余额表where会计期间=@kjqjand 科目代码=321or科目代码=322 asbwherea.会计期间=@kjqj update资产负债表set所有者权益总计=实收资本+资本公积+ 赢余公积+未分配利润 update资产负债表set负债及所有者权益总计=负债总计+所有者权益总计commitGO实例的程序结构仍然为MDI模式,这种开发模式结构清晰简单,易于理解,每一个功能对应一个子窗体
4.
7.1 程序运行结果本实例运行后的效果如图
4.22所示选择菜单中的各菜单项就可以进入各相应功能窗口图
4.22 实例运行效果1选择【基础数据管理】|【科目设置】菜单命令,进入【会计科目设置】功能窗体,如图
4.23所示在这个窗体中,可以对会计科目的各项基础信息进行管理其中【科目类别】选项组表示该科目所属的类别,有资产、负债、权益、损溢和成本5个选项,一般资产类科目余额方向为借方,负债和权益科目余额方向为贷方,但这也不绝对,其中也有例外的情况,如“坏帐准备”的科目余额方向则为贷方图
4.23 会计科目设置功能该窗体中还设有搜索功能,在窗体中的文本框内输入科目代码,科目名称或类别中的任何一项或几项,再单击【搜索】按钮,即可在窗体左边的表格中得到与设定的搜索条件相符合的结果同时窗体中还显示当前表格中的数据总数在浏览情况下,除搜索一栏的文本框外,窗体中的表格,数据文本框和选项组中的数据都是不可编辑状态的,只有当【新增】或者【修改】按钮被按下后才可以使用,当单击【保存】或【取消】按钮提交后,它们又恢复只读状态需要对数据表中的数据进行修改或者新增数据时,单击相应的按钮,输入新信息后单击【保存】按钮即可需要删除一条信息,单击【删除】按钮2科目设置完成后,选择【基础数据管理】|【帐户设置】菜单命令,进入【帐户设置期初数据录入】功能窗体,如图
4.24所示图
4.24 帐户设置功能该功能模块有【建立新帐簿】、【启用帐簿】和【试算平衡】3个按钮【建立新帐簿】按钮用于建立一个新的初始帐簿,单击该按钮,系统在后台调用“sf_初始化帐户”存储过程,删除“帐簿初始化表”原有的信息,根据“科目表”重新创建“帐簿初始化表”并在窗体中显示在表格中输入各科目的初始信息和系统参数信息,完成后通过【启用帐簿】按钮启用新的帐簿【启用帐簿】按钮先检查当前帐簿试算是否平衡,如果平衡在后台调用“sf_启用帐户”存储过程,启用新定义的帐簿,如果不平衡,会提示用户查阅试算平衡表,检查输入的初始化信息并修改,直到试算平衡才能启用新定义的帐簿需要注意的是,启用新定义的帐簿会删除系统中历史的所有数据【试算平衡】按钮可以随时查看当前的帐簿信息是否平衡,当试算不平衡时,窗体下方的表格将变为红色,向用户发出试算不平衡的警告如图
4.25和
4.26所示从窗体下方的合计金额可以看出不平衡的原因图
4.25 试算结果不平衡图
4.26 试算结果平衡3启用帐簿后可以进行凭证录入的工作选择【凭证管理】|【凭证输入】菜单命令,进入【会计凭证输入】功能窗体,如图
4.27所示,在其中输入凭证和会计分录信息若单击【新增】按钮,系统自动新建一个凭证,凭证号和会计期间等信息自动生成,其中的会计期间是“系统参数表”中的“当前会计期间”,日期是系统的当前日期,窗体后台程序对凭证编号自动进行计算保证新输入的凭证号不和以前已有的凭证编号冲突在下方的StringGrid中,双击“科目名称”列,将弹出一个包括科目设置的基本信息的窗体,在该窗体表格中的任意一栏双击,将选中的科目名称和科目代码自动输入到【会计凭证输入】窗体中的StringGrid中并关闭该选择窗体,如需添加多条分录信息,则可以再次双击“科目名称”列,重复前面的操作逐项输入分录的信息,完成后单击【保存】按钮,系统先检查借贷双方是否平衡,如果平衡给予保存需要修改某个凭证的信息,选择相应的凭证,单击【修改】按钮,修改完成后单击【保存】按钮即可,如图
4.27和图
4.28所示图
4.27 会计凭证输入功能图
4.28 科目名称选择窗体在保存会计凭证设置时,程序也会进行计算,核查分录表中的数据是否平衡,如果各项分录数据的借贷双方合计不等,程序将提示用户进行修改,直到平衡这样,就完成了会计凭证的输入工作,需要对凭证进行过帐凭证过帐就是确认输入的会计凭证,过帐后的凭证不能在进行修改4选择【凭证管理】|【凭证过帐】菜单命令,系统提示是否过帐,如图
4.29所示单击【是】按钮,系统在后台调用“sf_凭证过帐”存储过程,对凭证进行过帐,计算本期汇总帐簿和明细帐簿过帐完成后系统提示过帐成功,并显示过帐的凭证数及借贷方金额等反馈信息,如图
4.30所示图
4.29 凭证过帐功能图
4.30 凭证过帐后的反馈信息5可以分别选择【帐簿查询】|【总分类帐】和【帐簿查询】|【明细帐】命令,进入本期【总分类帐查询】和【明细帐查询】功能在【总分类帐查询】窗体中,可以通过选中【无发生金额布显示】单选框来确定是否要对表格中的数据进行过滤,只显示那些发生了金额的项目,如图
4.31所示图
4.31 总分类帐查询6【明细帐查询】窗体的表中显示的是所有的明细帐单,用户可以将左边的列表框中现有所有明细帐单的科目名称逐个添加到右边的列表框中,从而控制在表格中显示哪些明细帐单,如图
4.32和图
4.33所示图
4.32 明细帐查询图
4.33 明细帐单项过滤当前会计期间内的所有凭证过帐完成后,可以进行月末结帐操作,转入下一会计期间,结帐前首先要进行试算平衡的检查7选择【结帐及报表】|【试算平衡表】菜单命令,可以看到当前帐目的平衡信息,如图
4.34所示这里的试算平衡表与前面初始化帐簿中的试算平衡表是有所差别的初始化帐簿的试算平衡,需要根据初始化的信息反算期初信息,而结帐阶段的试算平衡表主要反映在凭证过帐之后结帐时的统计信息对比图
4.34和图
4.26就可以发现其区别试算结果平衡后选择【结帐及报表】|【期末结帐】菜单命令,系统在后台调用“sf_期末结帐”存储过程,进行结帐操作图
4.34 试算平衡功能8结帐后可以查询当月的资产负债表,选择【结帐及报表】|【资产负债表】菜单命令,系统先提示输入统计的会计期间,默认是当前会计期间,确定后调用“sf_计算资产负债表”存储过程计算资产负债表,然后在报表窗体中显示报表,如图
4.35所示图
4.35 资产负债表启动Delphi,采用默认设置新建一个工程,并将工程保存为“economic.dpr”选择Project|Options…菜单命令,在Application选项卡中修改工程的Title属性为“财务管理系统”,并为项目选择一个.exe程序的图标,本例我们在配书光盘的\Chap4\icon目录下选择caiwu.ico文件1利用系统默认生成的窗体作为主窗体,并为其添加主菜单控件和其他控件,布局如图
4.36所示将该窗体设置为MDI的主窗体,正如我们在第3章中所做的那样图
4.36 系统主窗体窗体及其控件的属性设置如表
4.3所示表
4.3 主窗体属性设置控件类型对象控件名属 性取值说明TFormMainNamemain Caption财务管理系统 FormStylefsMDIForm PositionpoDesktopCenterTADOCommandADOCommandConnectionString连接方法如
1.
7.3节所述,数据库设置为caiwubookTADOQueryADOQuery1ConnectionString连接方法如
1.
7.3节所述,数据库设置为caiwubook SQLselectcountdistinct凭证编号凭证数sum借方借方金额sum贷方贷方金额from分录表TADOQueryADOQuery3ConnectionString连接方法如
1.
7.3节所述,数据库设置为caiwubook SQLselect*from系统参数表2窗体的主菜单属性设置如图
4.37所示3为各菜单的添加如下功能代码typeTtable=array[
0..2]ofstring;//…此处为系统窗体构件声明,省略… public {Publicdeclarations} //para用于保存系统参数,FindForm用于寻找MDI子窗体,//setpara用于更新para的值 para:Ttable; functionFindFormcaption:string:bool; proceduresetpara; end; var main:Tmain; para:Ttable; implementation {$R*.dfm}usesSecSettingFormAccountSettingFormDocuInputFormTotalAccountFormDetailAccountFormSumAccountFormFinalReportForm; //-----------通过用户定义的函数,判断窗体是否存在--------------------functionTmain.FindFormcaption:string:bool;vari:integer;begin fori:=0tomain.MDIChildCountdo begin //通过对窗体标题判断窗体是否存在 ifmain.MDIChildren[i].Caption=captionthen begin //如果窗体已存在,则恢复窗体,并返回true SendMessagemdichildren[i].HandleWM_SYSCOMMANDSC_restore0; mdichildren[i].Enabled:=true; mdichildren[i].Show; mdichildren[i].SetFocus; result:=true; break; end else //如窗体不存在,则返回false,程序将创建窗体 result:=false; endend; //----该函数的作用是保存系统参数表中的参数,并在调用前更新---procedureTmain.setpara;var i:integer;begin adoquery
3.Active:=false; adoquery
3.Active:=true; i:=0;whilenotadoquery
3.Eofdo begin //保存系统参数 para[i]:=adoquery
3.FieldByName取值.AsString; i:=i+1; adoquery
3.Next; end;end; //----------------显示会计科目设置窗体-------------------procedureTmain.N2ClickSender:TObject;varnewform:TSecSetting;beginiffindForm会计科目设置=falsethen begin //若窗体不存在,则创建窗体 newform:=Tsecsetting.Createapplication; newform.Caption:=会计科目设置; end;end; //----------------显示帐户设置窗体-------------------procedureTmain.N3ClickSender:TObject;varnewform:TaccountSetting;begin iffindForm帐户设置期初数据录入=falsethen begin //若窗体不存在,则创建窗体 newform:=TaccountSetting.Createapplication; newform.Caption:=帐户设置期初数据录入; end;end; //----------------显示凭证设置窗体-------------------procedureTmain.N5ClickSender:TObject;varnewform:TDocuInput;begin iffindForm会计凭证输入=falsethen begin //若窗体不存在,则创建窗体 newform:=Tdocuinput.Createapplication; newform.Caption:=会计凭证输入; end;end; //----------------显示总分类帐查询窗体-------------------procedureTmain.N8ClickSender:TObject;varnewform:Ttotalaccount;begin iffindForm总分类帐查询=falsethen begin //若窗体不存在,则创建窗体 newform:=Ttotalaccount.Createapplication; newform.Caption:=总分类帐查询; end;end;//----------------显示明细帐查询窗体-------------------procedureTmain.N9ClickSender:TObject;varnewform:Tdetailaccount;begin iffindForm明细帐查询=falsethen begin //若窗体不存在,则创建窗体 newform:=Tdetailaccount.Createapplication; newform.Caption:=明细帐查询; end;end; //----------------显示试算平衡表窗体-------------------procedureTmain.N11ClickSender:TObject;varnewform:Tsumaccount;begin iffindForm试算平衡表正式使用=falsethen begin //若窗体不存在,则创建窗体 newform:=Tsumaccount.Createapplication; newform.Caption:=试算平衡表正式使用; //在正式平衡表中使用 newform.foruse; end;end; //----------------执行凭证过帐储存过程---------------------procedureTmain.N6ClickSender:TObject;varpnuminputsumoutputsum:string;begin ifapplication.MessageBox凭证过帐后即不可修改,是否确认过帐?确认MB_OKCANCEL=IDOKthenbegin//获得分录表中的统计数据adoquery
1.Active:=false;adoquery
1.Active:=true;pnum:=adoquery
1.FieldByName凭证数.AsString;inputsum:=adoquery
1.FieldByName借方金额.AsString;outputsum:=adoquery
1.FieldByName贷方金额.AsString;//执行储存过程,实现凭证过帐tryadocommand
1.CommandText:=execsf_凭证过帐;adocommand
1.Execute;exceptshowmessage过帐失败;exit;end;//显示成功信息,并显示统计数据showmessage过帐成功+#13+#13+过帐凭证数目为:+pnum+#13+借方金额合计:+inputsum+#13+贷方金额合计+outputsum;//删除分录表和凭证表adocommand
1.CommandText:=deletefrom分录表;adocommand
1.Execute;adocommand
1.CommandText:=deletefrom凭证表; adocommand
1.Execute;end;end; //-----执行期末结帐的储存过程--------procedureTmain.N12ClickSender:TObject;begin ifapplication.MessageBox结帐将进入下一个会计期间,是否结帐?确认 MB_OKCANCEL=IDOKthen begin try adocommand
1.CommandText:=execsf_期末结帐; adocommand
1.Execute; except showmessage结帐失败; exit; end; showmessage结帐成功; end;end; //--------资产负债报表的生成和打印----------procedureTmain.N13ClickSender:TObject;varindex:integer;inputstring:string;newform:TFinalReport;begin //取得当前会计期间的值 setpara; index:=strtointpara
[2]; //提示用户输入要显示的会计期间 inputstring:=InputBox请选择所要统计的会计期间会计期间inttostrindex-1; index:=strtointinputstring; //计算资产负债表 adocommand
1.CommandText:=execsf_计算资产负债表+inputstring+; adocommand
1.Execute; //显示报表窗体,这里不需要再查找是否已有报表窗体 //这是因为每次调用的报表窗体都可能显示不同的会计期间 newform:=TFinalReport.Createapplication; newform.SetPeriodindex; newform.QuickRep
1.Preview;end; //------关闭窗体--------------------procedureTmain.N15ClickSender:TObject;beginclose;end; 以上是主窗体的所有代码,与第3章中主窗体代码有区别的是我们自己编写了一个FindForm函数来查找一个MDI子窗体是否存在,使用专门的函数可以大大地压缩代码规模,使程序显得简练同时,我们在主窗体执行储存过程中还是使用了try…except语句,这样做可以在储存过程出现错误时提示用户读者可以在自己的程序中选择使用在前面的章节中,无论我们的程序是多文档还是多窗口结构,使用到的窗体都是预先定义好,并在编写程序时就加载到了工程文件之中的在这里我们将要用到DLL,DLL是Dynamic-Link Libraries动态链接库的缩写,它包含代码、数据和资源,可以被其他程序共享,使用DLL应用程序能够在程序运行期间动态地调入代码,而不是在编译期间静态地链接代码可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用程序或者其他DLL调用DLL为应用程序间的资源共享提供了方便,同时也是多语言混合编程的重要手段由此可见学习使用DLL是Windows程序员必须掌握的一项重要技术使用DLL从效果上看很像使用单元Unit,因为程序员可以在一个程序模块中调用别的Unit中声明且定义的过程、函数,甚至变量如果一个程序模块中用uses语句应用别的Unit,那么编译程序在编译该模块时便会连同被调用的Unit一同编译,并且把编译后得到的课执行文件连接到本模块的可执行文件上即编译后的一个工程Project只有一个可执行文件,但是可以包含多个单元的执行代码当Unit被多个Project所引用,则它的执行代码将会出现在多个Project的可执行代码中如果多个Project同时运行,那么Unit的代码会随着Project多次被调入内存,内存资源被多个重复的代码段所占用,既浪费空间,又影响程序的允许速度用DLL就可以解决这个问题DLL被某个可project编译后仍然是独立的,当多个project调用某个dll文件时,只有第一个调用dll的project才把DLL的执行代码调入内存,其他的Project并不把Dll调入而是增加其引用次数,并与第一个Project一起共享某个DLL的执行代码例如,在本章中我们将设计一个DLL,它本身有一个窗体,在外部程序调用它时,依靠外部变量输入的变量来判断调用数据库中的哪个表,并有一个函数负责返回双击某数据栏后该数据栏的内容使用这个DLL,我们可以在程序中通过调用它来浏览财务管理数据库中的任何一个表,并可以通过双击来选择某一栏的内容读者可以在读完本节后回顾前面三章中我们如何处理类似的任务,例如在第1章中进货单和销售单对于双击选择商品名称,编号的处理,再和本节中的处理方法加以比较,就可以看到DLL的巨大作用至于DLL更深层次的问题,不属于本书的讨论范围,这里不再叙述在本章中,我们用到的DLL非常简单,我们使用它的目的在于向读者介绍这样一种方法,其功能完全可以单独建立一个MDI子窗体来替代,在以后的章节中我们将越来越多地用到这些高级技术1首先重新打开Delphi,选择File|New|Other...,在弹出的窗口中的New选项卡中选择DLLWizard并单击OK,如图
4.38所示,将建立一个新的工程2将这个新的工程保存为sec.dpr,再新建一个窗体Form,将其Name属性改为dllSec,并保存该窗体文件为dllForm.pas查看工程的代码,可以看到如下程序librarysec;uses SysUtils Classes //此处是加入工程的unit,dllSec是该Unit的Name,而dllForm是该Unit保存的文件名 dllFormindllForm.pas{dllSec}; {$R*.res}exports//这是将要输出供外部调用的函数showdllformindex1;beginend.图
4.38 建立DLL工程文件3在新建的Form放置如图
4.39所示的控件图
4.39 将在dll调用的窗体该窗体的控件设置如表
4.4所示表
4.4 主窗体属性设置控件类型对象控件名属 性取值说明TFormDllSecNamedllSec Caption选择 续表控件类型对象控件名属 性取值说明TADOTableADOTableConnectionString连接方法如
1.
7.3节所述,数据库设置为caiwubookTDataSourceDataSource1DataSetADOTable1TDBGridDBGrid1DataSourceDataSource1 该窗体所要完成的任务是调用该dll的程序向窗体输入要链接的数据表的表名,当数据表链接成功后可以通过双击DBGrid的某栏向调用该窗体的程序返回表中的某一项值,并关闭窗体4为该窗体的设置处理代码如下unitdllForm;interfaceuses WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms DialogsDBGridsDBGridsADODB; type TdllSec=classTForm ADOTable1:TADOTable; DBGrid1:TDBGrid; DataSource1:TDataSource; procedureDBGrid1DblClickSender:TObject; procedureFormShowSender:TObject; private {Privatedeclarations} public {Publicdeclarations} end; //此函数负责取得当前应用程序的句柄并显示窗体,它是供外部调用的函数functionshowdllformAhandle:Thandle;Acaption:string;tablename:string:string;stdcall;var//用此变量向调用dll的程序返回值 resultstr:string;implementation {$R*.dfm}functionshowdllformAhandle:Thandle;Acaption:string;tablename:string:string;stdcall;varnewform:Tdllsec;begin//取得句柄application.Handle:=Ahandle;//建立窗体newform:=Tdllsec.Createapplication;newform.Caption:=Acaption+双击选择;//建立数据库链接newform.ADOTable
1.TableName:=tablename;newform.ADOTable
1.Active:=true;//显示窗体try newform.ShowModal;//返回双击所选择的结果 result:=resultstr; //释放该窗体finallynewform.Free;end;end; //-------双击选择数据栏返回数值---------procedureTdllSec.DBGrid1DblClickSender:TObject;beginresultstr:=dbgrid
1.Fields
[0].Text;close;end; //--------设置表宽度----------procedureTdllSec.FormShowSender:TObject;vari:integer;beginfori:=0todbgrid
1.FieldCount-1do dbgrid
1.Columns[i].Width:=64;end;end. 此时按F9键运行该工程的话,就会得到如图
4.40所示的信息图
4.40 直接运行dll得到的信息这是因为调试.dll时需要一个宿主程序,如果编译后直接运行,就会得到这个提示,解决这一问题需要写一个调用这个.dll的.exe程序,编译后将它的路径填到Run|Parameters菜单的Host app...输入条中但是实际上,如果直接按F9或编译允许DLL工程后,即便是弹出了上面的对话框,若读者浏览该工程所储存目录,就可以发现已经生成了一个sec.dll动态链接库,这就是我们在下面的程序中要用到的DLL,就可以直接调用了新建一个窗体,将窗体的Name属性设置为“SecSetting”,Caption属性设置为“会计科目设置”1单击Project|Options...菜单命令,将SecSetting窗体从自动创建的窗体列表中删除,将窗体保存为“SetSettingForm.pas”为窗体添加如图
4.41所示的控件其中除搜索栏的编辑框属于Edit控件外,其他编辑框都使用DBEdit控件,所有数据库控件的DataSet都设置为DataSource1各控件属性如表
4.5所示图
4.41 会计科目设置窗体表
4.5 会计科目设置窗体控件清单控件类型对象控件名属 性取值说明TFormSetSettingNameSecSetting Caption会计科目设置 FormStylefsMDIChild PositionpoDesktopCenterDataSourceDataSource1DataSourceADOQuery1TADOQueryADOQuery1ConnectionString连接方法如
1.
7.3节所述,数据库设置为caiwubook SQLselect*from科目表 ActiveTrueTADOQueryADOQuery3ConnectionString连接方法如
1.
7.3节所述,数据库设置为caiwubookTDBRadioGroupDBRadioGroup1Items资产 负债 权益 损溢 成本TDBRadioGroupDBRadioGroup2Items借方贷方 2这里需要说明的是窗体中ImageList和ToolBar中ToolButton的设置方法首先双击这个控件,弹出如图
4.42所示的对话框,单击Add..按钮,将配书光盘中\Chap4\ocons目录下的图标一一添加,从对话框中的Images框中可以看到添加的图标然后将ToolBar的Images属性设为ImageList1后,在ToolBar上再右击,在弹出的菜单中选择NewButton或NewSeparator可以在工具栏上添加按钮或分割符,按钮的图标就是刚才在ImageList中加入的图标了图
4.42 设置ImageList3需要注意的一点是在设置DBRadioGroup1的Items属性时,由于数据库中的项目都是10个字符长度,因此可能出现无法正常显示的情况,这时只要将Items中每项后面补上足够的空格即可 public {Publicdeclarations} procedureSetToolBarisEnable:bool; end; var SecSetting:TSecSetting; implementation {$R*.dfm}//---------------设置关闭窗体的模式-----------------procedureTSecSetting.FormCloseSender:TObject;varAction:TCloseAction;beginaction:=cafree;end; //--------------设置表格宽度----------------procedureTSecSetting.DataSource1DataChangeSender:TObject; Field:TField;begin //显示数据数量 label
2.Caption:=inttostradoquery
1.RecordCount; //设置数据表宽度 dbgrid
1.Columns
[0].Width:=60; dbgrid
1.Columns
[1].Width:=90;end; //-----------专门写一个函数来实现工具栏按钮的设置,让代码更加简练----------------procedureTSecSetting.SetToolBarisEnable:bool;begin ifisEnable=truethen begin //将首记录等记录移动按钮设置为不可用 toolbutton
1.Enabled:=false; toolbutton
2.Enabled:=false; toolbutton
3.Enabled:=false; toolbutton
4.Enabled:=false; //将新增、修改等按钮设置为不可用 toolbutton
6.Enabled:=false; toolbutton
7.Enabled:=false; toolbutton
8.Enabled:=false; //将保存和取消按钮设置为可用 toolbutton
10.Enabled:=true; toolbutton
11.Enabled:=true; //将窗体内的数据显示控件设为可读 dbedit
1.ReadOnly:=false; dbedit
2.ReadOnly:=false; dbedit
3.ReadOnly:=false; dbradiogroup
1.ReadOnly:=false; dbradiogroup
2.ReadOnly:=false; end; ifisEnable=falsethen begin //将首记录等记录移动按钮设置为可用 toolbutton
1.Enabled:=true; toolbutton
2.Enabled:=true; toolbutton
3.Enabled:=true; toolbutton
4.Enabled:=true; //将新增修改等按钮设置为可用 toolbutton
6.Enabled:=true; toolbutton
7.Enabled:=true; toolbutton
8.Enabled:=true; //将保存和取消按钮设置为不可用 toolbutton
10.Enabled:=false; toolbutton
11.Enabled:=false; //将窗体内的数据显示控件设为只读 dbedit
1.ReadOnly:=true; dbedit
2.ReadOnly:=true; dbedit
3.ReadOnly:=true; dbradiogroup
1.ReadOnly:=true; dbradiogroup
2.ReadOnly:=true; end;end; //---------------新增记录----------------procedureTSecSetting.ToolButton6ClickSender:TObject;beginSetToolBartrue;datasource
1.DataSet.Insert;end; //---------------修改记录----------------procedureTSecSetting.ToolButton7ClickSender:TObject;beginSetToolBartrue;datasource
1.DataSet.Edit;end; //---------------删除记录----------------procedureTSecSetting.ToolButton8ClickSender:TObject;begin ifapplication.MessageBox删除该条记录?财务管理系统MB_OKCANCEL=IDOKthen datasource
1.DataSet.Delete;end; //---------------首记录----------------procedureTSecSetting.ToolButton1ClickSender:TObject;begin datasource
1.DataSet.First;end; //---------------上记录----------------procedureTSecSetting.ToolButton2ClickSender:TObject;begin datasource
1.DataSet.Prior;end; //---------------下记录----------------procedureTSecSetting.ToolButton3ClickSender:TObject;begin datasource
1.DataSet.Next;end; //---------------尾记录----------------procedureTSecSetting.ToolButton4ClickSender:TObject;begin datasource
1.DataSet.Last;end; //---------------关闭窗体----------------procedureTSecSetting.ToolButton13ClickSender:TObject;beginclose;end; //---------------保存记录----------------procedureTSecSetting.ToolButton10ClickSender:TObject;begin //检查科目代码是否已输入ifdbedit
2.Text=then begin showmessage科目代码不允许为空值; exit; end; datasource
1.DataSet.Post; SetToolBarfalse;end; //---------------取消操作----------------procedureTSecSetting.ToolButton11ClickSender:TObject;begin datasource
1.DataSet.Cancel; SetToolBarfalse;end; //----------查询数据并显示-------------procedureTSecSetting.BitBtn1ClickSender:TObject;beginadoquery
1.Close;adoquery
1.SQL.Clear;adoquery
1.SQL.Addselect*from科目表where科目代码like%+edit
1.Text+%and;adoquery
1.SQL.Add科目名称like%+edit
2.Text+%and科目类别like%+edit
3.Text+%;adoquery
1.Open;end;
4.
7.6 完成帐户设置功能1新建一个窗体,将窗体的Name属性设置为“AccountSetting”,选择Project|Options...菜单命令,将SecSetting窗体从自动创建的窗体列表中删除,将窗体保存为“AccountSettingForm.pas”该窗体的控件布局和设置如图
4.43所示其中所有ADO控件的ConnectionString在前面几章中已多次提及,因此在此后的内容中将不再一一列出它们的此项属性图
4.43 帐户设置窗体2窗体的控件设置如表
4.6所示表
4.6 帐户设置窗体控件属性控件类型对象名属 性取值说明TADOTableADOTable1TableName帐簿初始化表 ActivetrueTADOTableADOTable1TableName系统参数表 ActivetrueDataSouceDataSource1DataSetADOTable1DataSouceDataSource2DataSetADOTable2TBitBtnBitBtn1Caption建立新帐簿TBitBtnBitBtn2Caption启用帐簿TBitBtnBitBtn3Caption试算平衡TDBGridDBGrid1DataSourceDataSource1TDBGridDBGrid2DataSourceDataSource2 3分别双击DBGrid1和DBGrid2,为其指定显示的字段,如图
4.44所示图
4.44 DBGrid1和DBGrid2的字段4将“科目代码”、“科目名称”、“余额方向”和“编号”、“参数名称”字段的ReadOnly属性设置为“true”,因为这些字段是不允许用户修改的;将这些字段的Color属性设置为“clMoneyGreen”,从而和可编辑的字段区分开来单击【试算平衡】按钮将创建一个新的窗体来显示初始化帐本后试算平衡的结果,这个新窗体还同时担负显示过帐后试算平衡的结果,因此需要专门设计5新建一个窗体,名为“SumAccount”,将它从自动创建的窗体列表中删除,并为其添加如图
4.45所示的控件,控件属性如表
4.7所示图
4.45 试算平衡窗体表
4.7 试算平衡窗体控件属性设置控件类型对象名属 性取值说明TformSumAccountNameSumAccountTFormSumAccountCaption试算平衡表 续表控件类型对象名属 性取值说明TADOQueryADOQuery1SQLselect科目代码科目名称casewhen余额方向=借方then期初余额else0end-累计借方as期初借方casewhen余额方向=贷方then期初余额else0end-累计贷方as期初贷方 累计借方as本期发生借方累计贷方as本期发生贷方 casewhen余额方向=借方then期初余额else0endas期末借方 casewhen余额方向=贷方then期初余额else0endas期末贷方from帐簿初始化表where累计借方0or累计贷方0or期初余额0 ActiveTrueDataSourceDataSource1DataSetADOQuery1DBGridDBGrid1DataSourceDataSource1StringGridStringGrid1ColCount8 RowCount2 6试算平衡表和帐户设置窗体的的事件处理代码如下//---------------------以下为试算平衡表的事件处理代码--------------------private {Privatedeclarations} //统计计算是否平衡 proceduresumtable; public {Publicdeclarations} //当使用后结帐时所调用的函数 procedureforuse; //初始化帐本时使用 procedureforinitial; end; var SumAccount:TSumAccount;implementationusesMainForm; {$R*.dfm} procedureTSumAccount.FormCloseSender:TObject;varAction:TCloseAction;beginaction:=cafree;end; //------设置窗体宽度和过滤条件---------procedureTSumAccount.DataSource1DataChangeSender:TObject; Field:TField;begin //设置过滤条件 datasource
1.DataSet.Filter:=本期发生借方0OR本期发生贷方0OR期初借方0 OR期初贷方0OR期末借方0OR期末贷方0; datasource
1.DataSet.Filtered:=true; //设置表的列宽dbgrid
1.Columns
[0].Width:=48;dbgrid
1.Columns
[1].Width:=100;dbgrid
1.Columns
[2].Width:=64;dbgrid
1.Columns
[3].Width:=64;dbgrid
1.Columns
[4].Width:=64;dbgrid
1.Columns
[5].Width:=64;dbgrid
1.Columns
[6].Width:=64;dbgrid
1.Columns
[7].Width:=64;end; //----------------初始化表的设置------------procedureTSumAccount.FormShowSender:TObject;begin//设置表格表头显示与宽度stringgrid
1.Cells
[10]:=是否平衡;stringgrid
1.Cells
[20]:=期初借方;stringgrid
1.Cells
[30]:=期初贷方;stringgrid
1.Cells
[40]:=本期发生借方;stringgrid
1.Cells
[50]:=本期发生贷方;stringgrid
1.Cells
[60]:=期末借方;stringgrid
1.Cells
[70]:=期末贷方;stringgrid
1.Cells
[01]:=合计;stringgrid
1.ColWidths
[0]:=48;stringgrid
1.ColWidths
[1]:=64;stringgrid
1.ColWidths
[2]:=64;stringgrid
1.ColWidths
[3]:=64;stringgrid
1.ColWidths
[4]:=128;stringgrid
1.ColWidths
[5]:=128;stringgrid
1.ColWidths
[6]:=64;stringgrid
1.ColWidths
[7]:=64;stringgrid
1.RowHeights
[0]:=20;stringgrid
1.RowHeights
[1]:=20;end; //------------在初始化时统计工作的完成-----------procedureTSumAccount.forinitial;begin//根据不同的状态设置SQL代码,以计算不同的平衡情况 adoquery
1.Close; adoquery
1.SQL.Clear; adoquery
1.SQL.Addselect科目代码科目名称; adoquery
1.SQL.Addcasewhen余额方向=借方then期初余额else0end-累计借方; adoquery
1.SQL.Addas期初借方; adoquery
1.SQL.Addcasewhen余额方向=贷方then期初余额else0end-累计贷方; adoquery
1.SQL.Addas期初贷方; adoquery
1.SQL.Add累计借方as本期发生借方累计贷方as本期发生贷方; adoquery
1.SQL.Add casewhen余额方向=借方then期初余额else0endas期末借方; adoquery
1.SQL.Add casewhen余额方向=贷方then期初余额else0endas期末贷方; adoquery
1.SQL.Addfrom帐簿初始化表where累计借方0or累计贷方0or期初余额0; adoquery
1.Open; //统计数据 sumtable;end; //------------在正式使用时统计工作的完成-----------procedureTSumAccount.foruse;begin//根据不同的状态设置SQL代码,以计算不同的平衡情况 adoquery
1.Close; adoquery
1.SQL.Clear; adoquery
1.SQL.Addselecta.科目代码b.科目名称; adoquery
1.SQL.Addcasewhena.余额方向=借方then期初余额else0end; adoquery
1.SQL.Addas期初借方; adoquery
1.SQL.Addcasewhena.余额方向=贷方then期初余额else0end; adoquery
1.SQL.Addas期初贷方; adoquery
1.SQL.Add本期借方合计as本期发生借方本期贷方合计as本期发生贷方; adoquery
1.SQL.Addcasewhena.余额方向=借方then余额else0endas期末借方; adoquery
1.SQL.Addcasewhena.余额方向=贷方then余额else0endas期末贷方; adoquery
1.SQL.Addfrom本期汇总帐簿asa科目表asb ; adoquery
1.SQL.Addwherea.科目代码=b.科目代码and本期借方合计0; adoquery
1.SQL.Addor本期贷方合计0or期初余额0or余额0; adoquery
1.Open; //统计数据 sumtable;end; //-----------------对数据进行统计---------------procedureTSumAccount.sumtable;varcounti:integer;val1val2val3val4val5val6:double;begin //计算平衡表中的记录数count:=datasource
1.DataSet.RecordCount;//统计信息,判断是否试算平衡val1:=0;val2:=0;val3:=0;val4:=0;val5:=0;val6:=0;whilenotdatasource
1.DataSet.Eofdo begin val1:=strtofloatdbgrid
1.Fields
[2].Text+val1; val2:=strtofloatdbgrid
1.Fields
[3].Text+val2; val3:=strtofloatdbgrid
1.Fields
[4].Text+val3; val4:=strtofloatdbgrid
1.Fields
[5].Text+val4; val5:=strtofloatdbgrid
1.Fields
[6].Text+val5; val6:=strtofloatdbgrid
1.Fields
[7].Text+val6; datasource
1.DataSet.Next; end;//显示统计结果stringgrid
1.Cells
[11]:=是否平衡;stringgrid
1.Cells
[21]:=floattostrval1;stringgrid
1.Cells
[31]:=floattostrval2;stringgrid
1.Cells
[41]:=floattostrval3;stringgrid
1.Cells
[51]:=floattostrval4;stringgrid
1.Cells
[61]:=floattostrval5;stringgrid
1.Cells
[71]:=floattostrval6;ifval1val2orval3val4orval5val6then begin stringgrid
1.Cells
[11]:=不平衡; stringgrid
1.Font.Color:=clred; end else stringgrid
1.Cells
[11]:=平衡;end;//-------------------------------------------------------------------//-----------------以下是帐户设置窗体的代码------------------------------implementation {$R*.dfm}usessumaccountform;procedureTAccountSetting.FormCloseSender:TObject; varAction:TCloseAction;beginaction:=cafree;end; //-------------设置表格-----------------procedureTAccountSetting.DataSource1DataChangeSender:TObject; Field:TField;begin //设置帐簿初始化表列宽 dbgrid
1.Columns
[0].Width:=64; dbgrid
1.Columns
[1].Width:=100; dbgrid
1.Columns
[2].Width:=64; dbgrid
1.Columns
[3].Width:=64; dbgrid
1.Columns
[4].Width:=64; dbgrid
1.Columns
[5].Width:=64;end; procedureTAccountSetting.DataSource2DataChangeSender:TObject、Field:TField;begin//设置系统参数表列宽 dbgrid
2.Columns
[0].Width:=32; dbgrid
2.Columns
[1].Width:=112; dbgrid
2.Columns
[2].Width:=32;end; //-----------------初始化帐户-----------------------procedureTAccountSetting.BitBtn1ClickSender:TObject;begin //执行储存过程,初始化帐户 adocommand
1.CommandText:=EXECsf_初始化帐户; ifapplication.MessageBox是否清除原帐簿信息,并初始化新帐簿?确认MB_OKCANCEL=IDOKthen adocommand
1.Execute; //刷新数据表 adotable
1.Active:=false; adotable
1.Active:=true; adotable
2.Active:=false; adotable
2.Active:=true;end; //--------------------启用新帐户-----------------procedureTAccountSetting.BitBtn2ClickSender:TObject;begin//判断是否试算平衡adoquery
1.Close;adoquery
1.SQL.Clear;adoquery
1.SQL.Addselectsum累计借方借方sum累计贷方贷方from帐簿初始化表;adoquery
1.Open;ifadoquery
1.FieldByName借方.AsStringadoquery
1.FieldByName贷方.AsStringthen begin showmessage新帐簿初始化不平衡,请检查试算平衡表后重新输入; exit; end;//如果试算平衡,则可以新建帐簿ifapplication.MessageBox试算结果平衡,启用新帐簿将删除所有历史记录+#13+是否继续?确认MB_OKCANCEL=IDOKthen begin //执行储存过程,启用帐户 adocommand
1.CommandText:=EXECsf_启用帐户; adocommand
1.Execute; //刷新数据表 adotable
1.Active:=false; adotable
1.Active:=true; adotable
2.Active:=false; adotable
2.Active:=true; //显示帐户启用成功消息 showmessage新帐户启用成功; end;end; //显示初始化时的试算平衡表procedureTAccountSetting.BitBtn3ClickSender:TObject;var newform:Tsumaccount;begin //创建试算平衡窗体 newform:=Tsumaccount.Createapplication; newform.Caption:=试算平衡表初始化; //在初始化时使用 newform.forinitial; end;1新建一个窗体,将窗体的Name属性设置为“DocuInput”,选择Project|Options...菜单命令,将DocuInp窗体从自动创建的窗体列表中删除,将窗体保存为“DocuInputForm.pas”该窗体的控件布局和设置如图
4.46所示图
4.46 凭证输入窗体 该窗体是本实例中比较重要也比较复杂的一个窗体由于每个凭证项均可对应多个分录数据,因此,用StringGrid来输入和编辑各个凭证项下属的分录数据比较合适,这种关系在一定程度上类似于我们在第1章中进销存实例中处理的进货单和进货单明细的关系另外,当工具栏中的【修改】、【保存】等按钮被按下时,实际上是对两个表进行操作,由于凭证表和分录表之间存在的约束关系,因此代码中对两个表的操作顺序要特别注意各控件的属性设置如表
4.8所示,窗体中除搜索栏中的编辑框为Edit控件之外,其他所有编辑框都是DBEdit控件,其DataSource属性都设置为DataSource1,DataField设置为与其相邻的文本中的内容,一个DBCombobox的DataSource和DataSource属性和DBEdit相同,其Items字段中添加收、付、转这3项表
4.8 凭证输入窗体控件属性设置控件类型对象名属 性取值说明TFormDocuInputNameDocuInput Caption会计凭证输入TADOQueryADOQuery1SQLselect*from凭证表orderby凭证编号 ActiveTrueTADOQueryADOQuery2SQLselectdistinct*from分录表 ActiveTrueTDataSourceDataSource1DataSetADOQuery1TDataSourceDataSource2DataSetADOQuery2TADOQueryADOQuery3SQLselectdistincta.*from分录表a凭证表bwherea.凭证编号=000001 ActiveTrueTDBGridDBGrid1DataSourceDataSource1 ReadOnlyTrue 2设置凭证输入窗体的代码如下 public {Publicdeclarations} procedureSetToolBarisEnable:bool; procedureSumAccount; //执行新增和编辑操作后,保存时会执行不同的代码 procedureOpTypeopname:string; end;//对将要从dll中的调用的函数的声明typeTshowdllform=functionAhandle:Thandle;Acaption:string;tablename:string:string;stdcall;Ttable=array[
1..20]ofstring;var DocuInput:TDocuInput; maxnumrecordnumcurRowcurCol:integer; mytable:Ttable; op:string;implementation{$R*.dfm}procedureTDocuInput.FormCloseSender:TObject;varAction:TCloseAction;beginaction:=cafree;end; //----------------初始化表----------------------procedureTDocuInput.DataSource1DataChangeSender:TObject; Field:TField; var ij:integer;begin //设置数据表宽度 dbgrid
1.Columns
[0].Width:=48; dbgrid
1.Columns
[1].Width:=64; dbgrid
1.Columns
[2].Width:=64; //显示与凭证编号对应的分录表 adoquery
2.Close; adoquery
2.SQL.Clear; adoquery
2.SQL.Addselectdistincta.*c.科目名称from分录表a凭证表b科目表c wherea.凭证编号=+dbedit
1.Text+anda.科目代码=c.科目代码orderby编号; adoquery
2.Open; //初始化表,将表格清空 fori:=1to20do forj:=0to4do ifopinsertthen stringgrid
1.Cells[ji]:=; //将分录表数据读入表格,并保存编号数据以供后面的数据库操作使用 i:=1; recordnum:=0; whilenotadoquery
2.Eofdo begin stringgrid
1.Cells[0i]:=adoquery
2.fieldbyname科目代码.AsString; stringgrid
1.Cells[1i]:=adoquery
2.fieldbyname科目名称.AsString; stringgrid
1.Cells[2i]:=adoquery
2.fieldbyname借方.AsString; stringgrid
1.Cells[3i]:=adoquery
2.fieldbyname贷方.AsString; stringgrid
1.Cells[4i]:=adoquery
2.fieldbyname摘要.AsString; mytable[i]:=adoquery
2.fieldbyname编号.AsString; i:=i+1; recordnum:=recordnum+1; adoquery
2.Next; end; //设置分录表的列宽度 stringgrid
1.ColWidths
[0]:=48; stringgrid
1.ColWidths
[1]:=116; stringgrid
1.ColWidths
[2]:=64; stringgrid
1.ColWidths
[3]:=64; stringgrid
1.ColWidths
[4]:=150; //显示凭证数 label
2.Caption:=inttostrdatasource
1.DataSet.RecordCount; end; //-----------------设置工具栏按钮--------------------procedureTDocuInput.SetToolBarisEnable:bool;begin ifisEnable=truethen begin //将首记录等记录移动按钮设置为不可用 toolbutton
1.Enabled:=false; toolbutton
2.Enabled:=false; toolbutton
3.Enabled:=false; toolbutton
4.Enabled:=false; //将新增、修改等按钮设置为不可用 toolbutton
6.Enabled:=false; toolbutton
7.Enabled:=false; toolbutton
8.Enabled:=false; //将保存和取消按钮设置为可用 toolbutton
10.Enabled:=true; toolbutton
11.Enabled:=true; //将窗体内的数据显示控件设为可修改 dbedit
2.Enabled:=true; dbedit
3.Enabled:=true; dbcombobox
1.Enabled:=true; stringgrid
1.Enabled:=true; dbgrid
1.Enabled:=false; end; ifisEnable=falsethen begin //将首记录等记录移动按钮设置为可用 toolbutton
1.Enabled:=true; toolbutton
2.Enabled:=true; toolbutton
3.Enabled:=true; toolbutton
4.Enabled:=true; //将新增、修改等按钮设置为可用 toolbutton
6.Enabled:=true; toolbutton
7.Enabled:=true; toolbutton
8.Enabled:=true; //将保存和取消按钮设置为不可用 toolbutton
10.Enabled:=false; toolbutton
11.Enabled:=false; //将窗体内的数据显示控件设为不可修改 dbedit
2.Enabled:=false; dbedit
3.Enabled:=false; dbcombobox
1.Enabled:=false; dbgrid
1.Enabled:=true; stringgrid
1.Enabled:=false; end;end; //---------------新增记录----------------procedureTDocuInput.ToolButton6ClickSender:TObject;vartotalnum:string;begin//刷新数据,得到凭证数据中最大编码并加一,防止编码重复adoquery
3.Close;adoquery
3.SQL.Clear;adoquery
3.SQL.Addselectmax凭证编号最大编号from凭证表;adoquery
3.Open;totalnum:=adoquery
3.FieldByName最大编号.Asstring;totalnum:=copytotalnum16;iftotalnum=thentotalnum:=0;totalnum:=inttostrstrtointtotalnum+1;//开始新增SetToolBartrue;datasource
1.DataSet.Insert;//组成六位的凭证编码iflengthtotalnum=1then dbedit
1.Text:=00000+totalnum;iflengthtotalnum=2then dbedit
1.Text:=0000+totalnum;iflengthtotalnum=3then dbedit
1.Text:=000+totalnum;//默认凭证字号dbcombobox
1.SelText:=收;//加入当前日期dbedit
2.Text:=datetostrdate;//默认会计期间main.setpara;dbedit
4.Text:=main.para
[2];//默认过帐状态dbedit
5.Text:=未过;//设置操作类型op:=insert;end;//---------------修改记录----------------procedureTDocuInput.ToolButton7ClickSender:TObject;beginSetToolBartrue;datasource
1.DataSet.Edit;//设置操作类型op:=edit;end; //---------------删除记录----------------procedureTDocuInput.ToolButton8ClickSender:TObject;begin ifapplication.MessageBox删除该条记录?财务管理系统MB_OKCANCEL=IDOKthen begin //先删除分录表记录,再删除凭证记录 adocommand
1.CommandText:=deletefrom分录表where凭证编号=+dbedit
1.Text+; adocommand
1.Execute; datasource
1.DataSet.Delete; end;end; //---------------首记录----------------procedureTDocuInput.ToolButton1ClickSender:TObject;begin datasource
1.DataSet.First;end; //---------------上记录----------------procedureTDocuInput.ToolButton2ClickSender:TObject;begin datasource
1.DataSet.Prior;end; //---------------下记录----------------procedureTDocuInput.ToolButton3ClickSender:TObject;begin datasource
1.DataSet.Next;end; //---------------尾记录----------------procedureTDocuInput.ToolButton4ClickSender:TObject;begin datasource
1.DataSet.Last;end; procedureTDocuInput.ToolButton13ClickSender:TObject;beginclose;end; //---------------保存记录----------------procedureTDocuInput.ToolButton10ClickSender:TObject;begin ifdbedit
6.Textdbedit
7.Textthen showmessage借贷双方不平衡,请检查 else begin ifop=insertthen begin datasource
1.DataSet.Post; opTypeop; end; ifop=editthen begin opTypeop; datasource
1.DataSet.Post; end; SetToolBarfalse; //清除操作标识符 op:=; end;end; //---------------取消操作----------------procedureTDocuInput.ToolButton11ClickSender:TObject;begin datasource
1.DataSet.Cancel; SetToolBarfalse; //清除操作标识符 op:=;end; //----------查询数据并显示-------------procedureTDocuInput.BitBtn1ClickSender:TObject;beginadoquery
1.Close;adoquery
1.SQL.Clear;adoquery
1.SQL.Addselect*from凭证表where凭证编号like%+edit
1.Text+%and;adoquery
1.SQL.Add会计期间like%+edit
2.Text+%and日期like%+edit
3.Text+%;adoquery
1.Open;end; //----------------为凭证录入分录表-----------------procedureTDocuInput.BitBtn4ClickSender:TObject;begin datasource
2.DataSet.Delete;end; //----------统计分录表中的各项信息以储存到数据库----------procedureTDocuInput.SumAccount;varsumoutputsuminput:double;i:integer;beginsuminput:=0;sumoutput:=0;//统计借贷双方的数额fori:=1to20do ifstringgrid
1.Cells[2i]andstringgrid
1.Cells[3i]then begin suminput:=suminput+strtofloatstringgrid
1.Cells[2i]; sumoutput:=sumoutput+strtofloatstringgrid
1.Cells[3i]; end;dbedit
6.Text:=floattostrsuminput;dbedit
7.Text:=floattostrsumoutput;end; procedureTDocuInput.DBEdit9ExitSender:TObject;beginSumAccount;end; //------------设置分录表表头-------procedureTDocuInput.FormShowSender:TObject;begin stringgrid
1.Cells
[00]:=科目编码; stringgrid
1.Cells
[10]:=科目名称双击选择; stringgrid
1.Cells
[20]:=借方; stringgrid
1.Cells
[30]:=贷方; stringgrid
1.Cells
[40]:=摘要;end; //----当在分录表中输入时,不允许在上面有空行的情况下输入一行新的数据----procedureTDocuInput.StringGrid1SelectCellSender:TObject;ACol ARow:Integer;varCanSelect:Boolean;begin//防止在输入数据时上面有空行ifstringgrid
1.Cells[0Arow-1]=then begin showmessage请先完成上行中空的项目; exit; end;//保存选取的单元行列值curRow:=ARow;curCol:=ACol;ifcurCol=4andcurCol=2then stringgrid
1.Options:=stringgrid
1.Options+[goEditing];//防止选中标题栏ifARow=0thencurRow:=ARow+1;//统计借贷双方信息sumAccount;end; //---在输入分录表时调用DLL中的表格,选择科目名称和号码-----procedureTDocuInput.StringGrid1DblClickSender:TObject;varshowForm:TShowDllForm;module:Thandle;begin //只有双击指定列才有效 ifcurCol1thenexit; //读入DLL module:=loadlibrarysec.dll; //如果读入错误,则module会是一个小于32的错误代码 //由此可以判断是否读入成功 ifmodule32thenexit; @showForm:=getprocaddressmodulepchar1; if@showForm=nilthenexit; //通过DLL传递参数 stringgrid
1.Cells[0curRow]:=showFormapplication.Handle选择科目名称科目表; //为科目代码添加科目名称 adoquery
3.Close; adoquery
3.SQL.Clear; adoquery
3.SQL.Addselect科目名称from科目表where科目代码 =+stringgrid
1.Cells[0curRow]+; adoquery
3.Open; stringgrid
1.Cells[1curRow]:=adoquery
3.fieldbyname科目名称.AsString; end; //------------对分录表进行插入和修改时所执行的操作--------------------------procedureTDocuInput.OpTypeopname:string;var i:integer; inputvaloutputvaloldnum:string;begin//如果是新增凭证,则直接将分录表中的数据逐条插入 ifopname=insertthen begin fori:=1to20do begin //如果表格中为空,则跳出循环 ifstringgrid
1.Cells[0i]=thencontinue; inputval:=stringgrid
1.cells[2i]; outputval:=stringgrid
1.cells[3i]; //插入数据,由于借方和贷方数据在sqlserver中为money,故需要进行转换 adocommand
1.CommandText:=insertinto分录表[凭证编号][科目代码] [借方][贷方][摘要]values+dbedit
1.Text+ +stringgrid
1.Cells[0i]+cast+inputval+asmoney cast+outputval+asmoney+stringgrid
1.Cells[4i]+; adocommand
1.Execute; end; end; ifopname=editthen begin fori:=1to20do begin ifstringgrid
1.Cells[0i]=thencontinue; inputval:=stringgrid
1.cells[2i]; outputval:=stringgrid
1.cells[3i]; //对凭证所属的分录表原有数据进行更新 ifi=recordnumthen adocommand
1.CommandText:=update分录表set[科目代码] =+stringgrid
1.cells[0i]+[借方]=cast+inputval+asmoney [贷方]=cast+outputval+asmoney[摘要]=+stringgrid
1.Cells[4i] +where编号=+mytable[i]+ else //插入凭证所属的分录表中的新数据 adocommand
1.CommandText:=insertinto分录表[凭证编号][科目代码] [借方][贷方][摘要]values+dbedit
1.Text+ +stringgrid
1.Cells[0i]+cast+inputval+asmoney cast+outputval+asmoney+stringgrid
1.Cells[4i]+; adocommand
1.Execute; end; end;end;凭证过帐功能是依靠在程序中调用“sf_凭证过帐”存储过程完成的,由SQLServer在后台执行,因此不需要再制作窗体界面在程序主窗体中【凭证过帐】菜单的响应函数中添加相应的处理代码,完成凭证过帐的功能具体代码参看
4.
7.3节代码中N8Click部分的函数代码其功能为“显示总分类帐查询窗体”1新建一个窗体,将窗体的Name属性设置为“TotalAccount”,选择Project|Options...菜单命令,将TotalAccount窗体从自动创建的窗体列表中删除,将窗体保存为“TotalAccountForm.pas”该窗体的控件布局和设置如图
4.47所示图
4.47 总分类帐查询窗体2窗体控件属性设置如表
4.9所示表
4.9 总分类帐查询窗体控件属性设置控件类型对象名属 性取值说明TFormTotalAccountNameTotalAccount Caption总分类帐查询TADOQueryADOQuery1SQLselecta.*b.科目名称from本期汇总帐簿a科目表bwherea.科目代码=b.科目代码 续表控件类型对象名属 性取值说明 ActiveTrueTDataSourceDataSource1DataSetADOQuery1TDBGridDBGrid1DataSourceDataSource1 ReadOnlyTrueTADOQueryADOQuery3SQLselectdistincta.*from分录表a凭证表bwherea.凭证编号=000001 ActiveTrueStringGridStringGrid1ColCount5 RowCount20 总分类查询主要实现的是查询总分类帐,不需要编辑,所以【编辑】、【新增】等按钮在这里用不到,设置为false,同时,由于凭证过帐时将大量没有发生金额的数据也放入了数据表中,为了用户查阅时方便,这里设置了一个过滤数据的功能,当窗体中的【无发生金额不显示】单选框被选中时,只有余额不为0的数据项被显示在表格中该窗体的处理代码如下所示implementation{$R*.dfm} procedureTTotalAccount.FormCloseSender:TObject;varAction:TCloseAction;beginaction:=cafree;end; //--------------------设置表的宽度-------------------procedureTTotalAccount.DataSource1DataChangeSender:TObject; Field:TField;begin //显示数据数量 label
2.Caption:=inttostradoquery
1.RecordCount; //设置数据表宽度 dbgrid
1.Columns
[0].Width:=50; dbgrid
1.Columns
[1].Width:=80; dbgrid
1.Columns
[2].Width:=80; dbgrid
1.Columns
[3].Width:=80; dbgrid
1.Columns
[4].Width:=80; dbgrid
1.Columns
[5].Width:=80; dbgrid
1.Columns
[6].Width:=80; dbgrid
1.Columns
[7].Width:=80; dbgrid
1.Columns
[8].Width:=50;end;//---------------首记录----------------procedureTTotalAccount.ToolButton1ClickSender:TObject;begin datasource
1.DataSet.First;end; //---------------上记录----------------procedureTTotalAccount.ToolButton2ClickSender:TObject;begin datasource
1.DataSet.Prior;end; //---------------下记录----------------procedureTTotalAccount.ToolButton3ClickSender:TObject;begin datasource
1.DataSet.Next;end; //---------------尾记录----------------procedureTTotalAccount.ToolButton4ClickSender:TObject;begin datasource
1.DataSet.Last;end; procedureTTotalAccount.ToolButton13ClickSender:TObject;beginclose;end; //----------查询数据并显示-------------procedureTTotalAccount.BitBtn1ClickSender:TObject;beginadoquery
1.Close;adoquery
1.SQL.Clear;adoquery
1.SQL.Addselecta.*b.科目名称from本期汇总帐簿a科目表bwherea.科目代码like%+edit
1.Text+%and;adoquery
1.SQL.Adda.科目代码=b.科目代码;adoquery
1.Open;end; //---------根据用户的操作对表中的数据进行过滤-----------procedureTTotalAccount.CheckBox1ClickSender:TObject;beginifcheckbox
1.Checkedthenbegindatasource
1.DataSet.Filter:=余额0;datasource
1.DataSet.Filtered:=true;endelsedatasource
1.DataSet.Filtered:=false;end;总分类帐查询和明细帐查询的区别在于,前者是查询科目的汇总信息,后者是查询科目在当前会计期间发生的每一笔业务及其余额1新建一个窗体,将窗体的Name属性设置为“DetailAccount”,选择Project|Options...菜单命令,将DetailAccount窗体从自动创建的窗体列表中删除,将窗体保存为“DetailAccountForm.pas”该窗体的控件布局和设置如图
4.48所示图
4.48 明细帐查询窗体2该窗体的控件属性设置如表
4.10所示表
4.10 明细帐查询窗体控件属性设置控件类型对象名属 性取值说明TFormDetailAccountNameDetailAccount Caption明细帐查询TADOQueryADOQuery1SQLselecta.*b.科目名称from本期明细帐簿a科目表bwherea.科目代码=b.科目代码 ActiveTrueTDataSourceDataSource1DataSetADOQuery1TADOQueryADOQuery3SQLselectdistincta.*from分录表a凭证表bwherea.凭证编号=000001 ActiveTrueTDBGridDBGrid1DataSourceDataSource1 ReadOnlyTrue 3该窗体的代码如下所示//添加列表框中项目的函数 proceduresetlist; end;var DetailAccount:TDetailAccount;implementation {$R*.dfm} procedureTDetailAccount.FormCloseSender:TObject;varAction:TCloseAction;beginaction:=cafree;end; //------------设置表宽度------------------procedureTDetailAccount.DataSource1DataChangeSender:TObject; Field:TField;begin //显示数据数量 label
2.Caption:=inttostradoquery
1.RecordCount; //设置数据表宽度 dbgrid
1.Columns
[0].Width:=80; dbgrid
1.Columns
[1].Width:=64; dbgrid
1.Columns
[2].Width:=64; dbgrid
1.Columns
[3].Width:=64; dbgrid
1.Columns
[4].Width:=64; dbgrid
1.Columns
[5].Width:=64; dbgrid
1.Columns
[6].Width:=64; dbgrid
1.Columns
[7].Width:=64; dbgrid
1.Columns
[8].Width:=64;end; //---------------首记录----------------procedureTDetailAccount.ToolButton1ClickSender:TObject;begin datasource
1.DataSet.First;end; //---------------上记录----------------procedureTDetailAccount.ToolButton2ClickSender:TObject;begin datasource
1.DataSet.Prior;end; //---------------下记录----------------procedureTDetailAccount.ToolButton3ClickSender:TObject;begin datasource
1.DataSet.Next;end; //---------------尾记录----------------procedureTDetailAccount.ToolButton4ClickSender:TObject;begin datasource
1.DataSet.Last;end; procedureTDetailAccount.ToolButton13ClickSender:TObject;beginclose;end; //----------查询数据并显示-------------procedureTDetailAccount.BitBtn1ClickSender:TObject;beginadoquery
1.Close;adoquery
1.SQL.Clear;adoquery
1.SQL.Addselecta.*b.科目名称from本期明细帐簿a科目表bwherea.科目代码like%+edit
1.Text+%and;adoquery
1.SQL.Adda.科目代码=b.科目代码;adoquery
1.Open;//清除设置的数据过滤器并重新设置列表datasource
1.DataSet.Filtered:=false;setlist;end; //----------窗体显示时,向左边列表框中添加科目名称--------------procedureTDetailAccount.FormShowSender:TObject;begin setlist;end; //-------------将数据集中已有的科目名称添加到列表中-------------procedureTDetailAccount.setlist;varname:string;beginlistbox
1.Clear;listbox
2.Clear; whilenotadoquery
1.Eofdo begin name:=adoquery
1.fieldbyname科目名称.AsString; //如果列表中没有该名称则添加,若已有则不做任何动作 iflistbox
1.Items.IndexOfname=-1then listbox
1.Items.Insertlistbox
1.Items.Countname; adoquery
1.Next; end;end; //选中一个科目名称并允许将其添加到右边的列表中procedureTDetailAccount.ListBox1ClickSender:TObject;beginiflistbox
1.Items.Count0thenbutton
1.Enabled:=true;end; //选中一个科目名称,并允许从右边的列表中删除它procedureTDetailAccount.ListBox2ClickSender:TObject;beginiflistbox
2.Items.Count0thenbutton
2.Enabled:=true;end; //-----在右边的列表中添加某一项----------procedureTDetailAccount.Button1ClickSender:TObject;varname:string;beginname:=listbox
1.Items.Strings[listbox
1.ItemIndex];//若右边的列表框不存在该项,再向其中添加iflistbox
2.Items.IndexOfname=-1thenlistbox
2.Items.Insertlistbox
2.Items.Countname;//允许在表中根据选择的项进行显示bitbtn
2.Enabled:=true;end;//-----在右边的列表中删除某一项----------procedureTDetailAccount.Button2ClickSender:TObject;begin//若不为空,则可以将名称项从列表中删除iflistbox
2.Items.Count0thenlistbox
2.Items.Deletelistbox
2.ItemIndex;//若右边列表已空,则将按钮变灰不可用iflistbox
2.Items.Count=0thenbeginbutton
2.Enabled:=false;bitbtn
2.Enabled:=false;end;end; //----------根据选择的项显示数据-----------procedureTDetailAccount.BitBtn2ClickSender:TObject;varfilstr:string;i:integer;beginfilstr:=;//根据列表中内容设置数据集的过滤项并过滤fori:=0tolistbox
2.Count-1do begin filstr:=filstr+科目名称=+listbox
2.Items.Strings[i]+; ifilistbox
2.Count-1then filstr:=filstr+OR; end;datasource
1.DataSet.Filter:=filstr;datasource
1.DataSet.Filtered:=true;end;前面我们已经建立了【试算平衡表】功能窗体,该窗体中带有两个过程分别对应初始化帐本时的试算平衡和帐本使用后的最终试算平衡计算,因此在不同的时刻调用不同的过程即可在程序主窗体的【试算平衡表】菜单的响应函数中添加相应的处理代码,完成凭证过帐的功能具体代码参看
4.
6.3节的代码中N11Click的函数代码其功能为“显示试算平衡表窗体”期末结帐功能和前面的凭证过帐一样,是依靠在程序中调用“sf_期末结帐”存储过程完成的,由SQLServer在后台执行,因此不需要再制作窗体界面在程序主窗体的【期末结帐】菜单的响应函数中添加相应的处理代码,完成期末结帐的功能具体代码参看
4.
7.3节代码中N12Click的函数代码其功能为“执行期末结帐的储存过程”关于利用QuickRep控件制作报表的方法,我们在第一章进销存系统中已经由详细的说明,这里就不再赘述新建一个窗体,将其Name属性改为“FinalReport”,Caption属性改为“资产负债表”,并为其添加一个QuickRep和一个ADOTable控件在QuickRep1控件的各个Band上分别放置相应的QRSysData控件、QRLabel控件和QRDBText控件,如图
4.49所示,其中QRDBText控件DataField属性设置为相应QRLabel的标题两个控件属性设置如表
4.11所示图
4.49 资产负债表报表窗体当需要显示【资产负债表】报表时,首先需要提示用户输入统计的会计期间,默认是当前会计期间,确定后调用“sf_计算资产负债表”存储过程计算资产负债表,最后在报表窗体中显示报表菜单的响应函数处理具体代码参看
4.
7.3节代码中N13Click的函数代码其功能为“资产负债报表的生成和打印”表
4.11 资产负债表窗体控件属性设置控件类型对象名属 性取值说明TADOTableADOTable1TableName资产负债表 ActivetrueQuickRepQuickRep1DateSetADOTable BandsHasDetail、HasTitle ReportTitle打印至此我们完成了整个系统的制作,选择Run|Run菜单命令或按F9键,编译并运行程序,可以看到前面
4.
7.1节中介绍的程序系统设计完成后需要打包发布,将应用系统制作成安装程序制作安装程序的工具很多,一般Delphi开发的应用系统可以使用InstallShield来完成系统的安装查询系统发布的注意事项参考第1章财务管理系统可以作为一个独立的系统运行,也可以和其他的应用系统结合起来,实现数据共享例如可以和前面的进销存管理系统相结合,可以将进销存系统中的进货、销售、应收及应付款等会计分录自动生成凭证,如图
4.50所示图
4.50 财务管理系统与其他系统的结合一般常见的财务管理系统都提供会计分录数据倒入的功能,即由业务系统将进货、销售、应付、应收等业务记录按照一定的格式倒出成文本文件,再利用数据导入功能将这些文件导入数据库中成为会计分录数据,从而减少财务系统的输入工作量,提高工作效率通过该实例我们可以掌握以下知识和技巧 财务管理系统的需求 利用Delphi进行数据库编程的多种方法 ADO数据集控件中Filter的使用方法 DLL动态链接库的设计和调用方法 DataSource中数据记录数量的统计方法 利用Delphi编写财务管理系统 财务管理系统的扩展读者可以根据这些方法自行完成财务管理系统的其他功能。