关于构建框架的书 财务管理系统框架构建

来源:加拿大移民 发布时间:2020-03-12 点击:

  财务管理系统框架构建 1

 财务管理系统需求分析 一个标准的财务管理系统应该包括如图1.1所示的几大功能。除此之外系统还应该包括信息系统所具备的通用功能,例如系统管理、权限设置、数据备份与恢复等。 其中每个功能都由若干相关联的子功能模块组成。

 财务管理系统 基础资料维护 凭证管理 帐薄管理

 报表管理 期末处理 往来管理 出纳管理 工资管理 固定资产管理 财务分析 系统管理

 图1.1

 财务管理系统的基本功能模块 财务管理系统的基本流程如图1.2所示 费用分摊比率设定 科目分摊处理 会计基本资料维护 期初资料开账 开账资料过账处理 凭证手动输入 凭证审核 凭证过账 期间结束 资料查询或报表打印

 年度结束

  图1.2

 财务管理系统基本流程图 1.1

  基础资料维护 “基础资料维护”功能模块用于对会计科目、核算项目以及凭证、帐薄、固定资产等项目进行初始化设置,这些设置一般不轻易改动,其中包含的子功能模块如图1.3所示。 其中“会计科目”是基础资料的终点,财务软件的不使用离不开科目的正确设置,其内容包括科目代码、科目名称、助记码、科目类别、是否存货科目、余额方向、数量单位等。 1.2 凭证管理 “凭证管理“功能模块用于完成凭证制定、审核、记账、查询等功能,自动生产各种会计帐,其中包含的子功能模块如图1.4所示。

  基础资料维护

 核算项目 结算方式 常用摘要 会计科目

  币别

  图1.3

  “基础资料维护”功能模块

 凭证管理

 凭证过账 凭证查询 凭证汇总 凭证检查 凭证审核 凭证的输入

 图1.4

 “凭证管理”功能模块 其中“凭证输入”是凭证管理的重点,在凭证输入模块中将实际业务的分录输入到计算机中,内容包括凭证状态、会计期间、凭证字号、凭证编号、顺序号、日期、附单据、审核、过账、制单、借方合计、贷方合计、过账状态、顺序号码等。一张凭证对应多个记录,分录内容包括分录编号、会计期间、凭证字号、凭证编号、摘要、科目代码、借方、贷方、数量、单价、结算方式、结算号、结算日期等。 1.3 帐薄管理 “帐薄管理”功能模块用于提供各种账务处理、查询、筛选的功能,其中包含的子功能模块如图1.5所示。总账可按科目级别、币别、科目范围等查询;明细帐可按期间范围等、币别、科目范围查询;还提供多栏帐、数量金额明细帐、核算项目分类总账等帐薄报表。

 总分类帐 明细帐 多栏帐 数量金额总账 数量金额明细表 核算项目分类总账 帐薄管理

  图1.5

  “帐薄管理”功能模块 1.4 报表管理 核算项目明细表 利润分配表 损益表 现金流量表 资产负债表 科目余额表 试算平衡表 日报表 报表管理

  “报表管理”功能模块用于报表的定义、编制和输出。企业会计核算的结果最后需要用报表的形式反映出来,一般包括账务报表处理、汇总报表处理、合并报表处理等。一般财务系统会预设资产负债表、损益表、利润分配表等各类报表模板,如图1.6所示,简化报表操作过程。

 图1.6

  “报表管理”功能模块 1.5

 期末处理 “期末处理”是系统总结某一会计奇迹的经营活动情况,转至下一期的必做事项。同时该模块在结账前,按企业财务管理和成本计算的要求,必须进行制造费用、产成品成本的结账、期末调汇及损益结账等工作,其中包含的子功能模块如图1.7所示。 自动转账 期末处理 期末结汇 结账损益 期末调汇

 图1.7

 “期末处理”功能模块

 1.6

 往来管理 核销应收款 应付帐龄分析 往来对账 往来管理 应收账龄分析 核销应付款

 “往来管理”功能模块用于对企业的往来转款进行全面核算、管理、分析、预测、决策。一般包括往来单位管理、经济业务管理、往来转龄分析、往来转款的核销、坏账处理等功能,如图1.8所示。

  图1.8

  “往来管理”功能模块 1.7 出纳管理 出纳是会计中十分重要的一个岗位,它担负着现金、银行存款的收付职能。“出纳管理”即可同结账系统联合起来使用,也可单独提供给出纳人员使用。一般包括现金帐管理、银行存款帐管理、票据管理等,如图1.9所示。

  支票管理 出纳轧帐 出纳报表 日常处理 初始设置 出纳管理

 图1.9

  “出纳管理”功能模块

  出纳系统与账务系统功能分离但数据却可紧密连接共享,合理的数据共享模式可使得会计与出纳人员更能高效的独立工作。 1.8 工资管理 工资发放条 工资管理 其他报表输入 工资统计表 工资汇总表 费用分配 数据输入 核算方法 打印工资条

  “工资管理”功能模块用于进行企业工资的发放和核算,工资动态变动管理,工资费用计提与分配、银行代发等;一般包括基础设置、工资结构设置、工资变动管理、工资数据处理、工资报表管理等功能,如图2.0所示。

 图2.0

  “功能管理”功能模块 1.9 固定资产管理 “固定资产管理”功能模块用于管理、核算固定资产增减变化、变动以及折旧的计提、转账等,一般包括如图2.1所示的子功能模块。允许不同固定资产采用不同的折旧方法,提供标准的折旧方法,提供固定资产卡片自定义设置灵活的报表查询系统。 其他报表输入 固定资产明细账 变动资料录入 月工资量输入 计提折旧 变动资料查询 固定资产清单 固定资产增减表 固定资产理

  图2.1

 “固定资产管理”功能模块

 2.0

 财务分析 “财务分析”功能是财务管理的重要组成部分,在核算的基础上以财务报表和其他资料为依据和起点,采用专门的方法,系统地分析和评价企业过去和现在的经营成果、财务状况及其变动,对账务数据进一步的加工、整理、分析和研究,将大量的报表数据转换成对决策有用的信息,是管理层进行日常及重大决策的好帮手,包含的子功能模块如图2.2所示。 损益分析 财务分析 财务指标 财务状况分析 其他自定义报表

 图2.2

 “财务分析”功能模块

 “财务状况分析”对截止报告期的资产、负债及所有者权益的结构、比例及变化趋势等情况进行分析,可分为结构分析、比较分析、趋势分析三种分析方法。结构分析对资产、负债及所有者权益中每一具体项目战该类项目以及总体项目的结构、比重进行分析,从而揭示该类财务指标的结构是否合理;比较分析能对同口径(指标名称相同、计算方法相同)指标在任意两个会计期间(或一个会计期间与它的预算值之间)进行比较,借以反映其增减变动情况;趋势分析反映某一财务指标,如资产总计、流动资产合计、银行存款等在年度内月份之间、季度之间和年度之间变化的趋势。 “损益”对本期、本年累计及任一会计期间的盈利状况和盈利能力进行分析。对损益分析也可分为结构分析、比较分析、趋势分析三种分析方法。

  2 财务管理系统数据库分析 根据以上需求分析,一个基本的财务管理系统数据库中大致包括100多张数据表,分 别存放相应功能的数据信息,其中“科目表”是起关键作用的表,用于存放科目的信息。其他涉及科目信息的数据表,都只记录科目的代码,根据作为外键的“科目代码”字段相对应。因此“科目表”和其他数据间的关系是1:N的关系。

 2.1

  财务管理系统E-R图

 因为整个系统涉及的涉及的实体和属性较多,限于篇幅不能也没有必要逐一列举。如图2.1为财务管理系统关键实体的E-R图。 其他实体于基本信息表间的对应关系都是类似的。

 本期分类账簿

  科目代码 期初余额 本期借方合计 本期贷方合计 数量单位 余额 摘要 项目科目对照表 P

  项目名称 项目代码 科目代码 科目级别 内部编号 科目余额表

  EK1科目代码

  期初借方余额

  期初贷方余额

  本期借方发生额

  本期代发发生额

  本年借方累计发生额 本年贷方累计发生额 本期借方余额 本期贷方余额 最后结账分录 会计期间 余额方向 内部编号

 记录表

  PK

 内部编号

 分录编号

  会计期间

  凭证字号 EK2凭证编号 摘要 FK1科目代码 借方 贷方 数量 单价 结算方式 结算号 结算日期

 凭证表

 PK

 凭证编码

 内部编号

  凭证状态

  会计期间

  凭证字号 EK1 顺序号 日期 附单据 审核 过账 制单 数量 单价 借方合计 贷方合计 过账状态 顺序号码 科目表 PK

 科目代码

 科目名称 助记码 科目类别 是否存贷科目 余额方向 数量单位 本明细账簿

  内部编号

  分录编号

  会计期间

  凭证字号

  凭证编号 EK1 摘要 科目代码 借方 贷方 余额方向 余额 数量 单价 结算方式 结算号 结算日期 余额标记

  图2.3

 财务管理系统E-R图 2.2

  财务管理系统数据表清单

  表

  财务管理系统数据表清单

 数据表名称 数据表用途 科目表 保存企业财务的科目设置信息 科目余额表 保存财务(账户)科目的余额信息 分录表 用于凭证管理中的分录输入 凭证表 用于凭证输入管理 分录历史表 分录输入确认后数据放入历史 凭证历史表 分录输入确认后数据放入历史 明细账簿 明细账簿用于企业财务明细账簿的输入 分类账簿 明细账簿用于企业财务分类账簿的输入 本年明细帐薄 年度明细帐薄 本年分类帐薄 年度明分类帐薄的汇总 历史明细帐薄 保存明细帐薄历史 历史分类帐薄 保存分类帐薄历史 损益表 保存企业财务的损益表信息 资产负债表 保存企业财务的资产负债表信息 现金流量表 保存企业财务的现金流量表信息 利润分配表 保存企业财务的利润分配表信息 财务状况变动表 保存企业企业财务状况变动表信息 年终损益表 保存企业企业财务年终损益表信息 年终损益表 保存企业企业财务年终损益表信息 年终资产负债表 保存企业企业财务年终资产负债表信息

 3 实例制作介绍 3.1 实例介绍 明细账 试算平衡表 帐户设置 科目设置 财务管理系统

  凭证管理 帐薄查询 结账及报表 凭证输入 凭证过账 总分类帐 资产负债表 期末结账

 图2.4

 详细介绍的功能模块 由于用户登陆和权限管理的功能各个系统实现的方法是一致的。

 3.2 系统流程图

  系统流程图如图3.2所示。 记录业务 凭证输入 凭证查询 财务部门 凭证过账 期末结账 分类帐 分类查询 财务报表查询

  图2.5 系统流程图

 4 数据库设计 根据实例介绍,“科目表”是系统的关键表,其他各表均与“科目表”通过“科目代码”字段进行多对一的关联。系统共需要11张表,用途分别如图4.1所示。

 表4.1

  系统数据表及用途 科目表 保存企业财务的科目设置信息 帐薄初始化表 正式使用系统前初始化科目表的期初余额 凭证表 输入会计凭证,分目录表的主表 分录表 输入会计分录,分录表的从表 科目余额表 保存各个会计期间的科目借、贷、余额情况 凭证表历史 保存过转账后的凭证历史 分录表历史 保存过转账后的分录历史 本期明细帐薄 保存当前会计期间的明细张博数据 本期汇总帐薄 保存当前会计期间的明细帐薄数据,期末结账后期末变为新会计期间的期初 资产负债表 统计用表,用于计算资产负债表 系统参数表 系统运行所需的参数信息

  4.1 创建数据库 打开SQL Server企业管理器,新建一个数据库,将其命名为caiwubook。

 4.2 创建“科目表”数据表

 CREATE TABLE [dbo].[帐簿初始化表] (

 [科目代码] [char] (20) NOT NULL ,

 [科目名称] [char] (20) NULL ,

 [累计借方] [money] NULL ,

 [累计贷方] [money] NULL ,

 [期初余额] [money] NULL ,

 [余额方向] [char] (4) NULL

 ) ON [PRIMARY] GO 4.3 创建“凭证表”和“分录表”数据表

  REATE TABLE [dbo].[凭证表历史] (

 [凭证编号] [char] (10) NOT NULL ,

 [会计期间] [int] NULL ,

 [凭证字号] [char] (2) NULL ,

 [日期] [datetime] NULL ,

 [附单据] [int] NULL ,

 [制单] [char] (20) NULL ,

 [借方合计] [money] NULL ,

 [贷方合计] [money] NULL ,

 [过账状态] [char] (4) NULL ,

 [凭证状态] [char] (10) NULL

 ) ON [PRIMARY] GO

 CREATE TABLE [dbo].[分录表] (

 [编号] [int] IDENTITY (1, 1) NOT NULL ,

 [凭证编号] [char] (10) NOT NULL ,

 [摘要] [char] (40) NULL ,

 [科目代码] [char] (20) NULL ,

 [借方] [money] NULL ,

 [贷方] [money] NULL ,

 [数量] [int] NULL ,

 [单价] [money] NULL ,

 [结算方式] [char] (10) NULL ,

 [结算号] [int] NULL ,

 [结算日期] [datetime] NULL

 ) ON [PRIMARY] GO

  4.4 创建其他关键数据表 CREATE TABLE [dbo].[科目余额表] (

 [科目代码] [char] (20) NULL ,

 [期初借方余额] [money] NULL ,

 [期初贷方余额] [money] NULL ,

 [本期借方发生额] [money] NULL ,

 [本期贷方发生额] [money] NULL ,

 [本年借方累计发生额] [money] NULL ,

 [本年贷方累计发生额] [money] NULL ,

 [本期借方余额] [money] NULL ,

 [本期贷方余额] [money] NULL ,

 [最后结算分录] [int] NULL ,

 [会计期间] [int] NULL ,

 [余额方向] [char] (4) NULL ,

 [内部编号] [int] IDENTITY (1, 1) NOT NULL

 ) ON [PRIMARY] GO CREATE TABLE [dbo].[资产负债表] (

 [会计期间] [int] NOT 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] NULL ,

 [负债及所有者权益总计] [money] NULL

 ) ON [PRIMARY] GO

 4.5 创建主键及外键等表约束

 在查询分析器中通过如下代码创建数据表的主键及外键等表约束。 ALTER TABLE [dbo].[科目表] WITH NOCHECK ADD

 PRIMARY KEY

 CLUSTERED

  (

  [科目代码]

 )

 ON [PRIMARY]

 GO

 ALTER TABLE [dbo].[资产负债表] WITH NOCHECK ADD

 PRIMARY KEY

 CLUSTERED

  (

  [会计期间]

 )

 ON [PRIMARY]

 GO

 ALTER TABLE [dbo].[分录表] ADD

  CONSTRAINT [FK_分录表_凭证表] FOREIGN KEY

  (

  [凭证编号]

 ) REFERENCES [dbo].[凭证表] (

  [凭证编号]

 ),

 CONSTRAINT [分录表_科目代码_fk] FOREIGN KEY

  (

  [科目代码]

 ) REFERENCES [dbo].[科目表] (

  [科目代码]

 ) GO

 ALTER TABLE [dbo].[分录表历史] ADD

  CONSTRAINT [分录表历史_科目代码_fk] FOREIGN KEY

  (

  [科目代码]

 ) REFERENCES [dbo].[科目表] (

  [科目代码]

 ) GO

 ALTER TABLE [dbo].[帐簿初始化表] ADD

  CONSTRAINT [帐簿初始化表_科目代码_fk] FOREIGN KEY

  (

  [科目代码]

 ) REFERENCES [dbo].[科目表] (

  [科目代码]

 ) GO

 ALTER TABLE [dbo].[本期明细账簿] ADD

  CONSTRAINT [本期明细账簿_科目代码_fk] FOREIGN KEY

  (

  [科目代码]

 ) REFERENCES [dbo].[科目表] (

  [科目代码]

 ) GO

 ALTER TABLE [dbo].[本期汇总账簿] ADD

  CONSTRAINT [本期汇总账簿_科目代码_fk] FOREIGN KEY

  (

  [科目代码]

 ) REFERENCES [dbo].[科目表] (

  [科目代码]

 ) GO

  4.6 创建存储过程 系统为了使用“sf_初始化帐户”、“ sf_启用帐户”、“ sf_凭证帐户”、“ sf_期末结账”和“sf_计算资产负债表”五个存储过程,实现的功能分别为新建帐套、启用帐套、凭证过账确认、期末结账和运算指定会计期间的资产负债表等功能。具体计算方法在下面的脚本中有详细的注释,。

 create proc sf_初始化帐户 as

 begin tran

 -- 清除原来数据,从新建立帐户

 delete from 帐簿初始化表

 -- 设置帐户初始基本数据

 insert into 帐簿初始化表

  (科目代码,科目名称,累计借方,累计贷方,期初余额,余额方向)

  select 科目代码,科目名称,0,0,0,余额方向 from 科目表

 -- 设置初始信息

 update 系统参数表 set 取值 = datepart(mm,getdate())

  where 参数名称 = '会计期间开始月份'

 update 系统参数表 set 取值 = datepart(mm,getdate())

 where 参数名称 = '当前会计期间' commit

 GO SET QUOTED_IDENTIFIER OFF

 GO SET ANSI_NULLS ON

 GO

 SET QUOTED_IDENTIFIER ON

 GO SET ANSI_NULLS ON

 GO

  create proc sf_启用帐户 as

 begin tran

 -- 清除原来数据,从新建立帐户

 delete from 科目余额表

 delete from 本期汇总账簿

 delete from 本期明细账簿

 delete from 分录表

 delete from 分录表历史

 delete from 凭证表

 delete from 凭证表历史

 -- 设置本期汇总账簿及科目余额表

 insert into 本期汇总账簿 select 科目代码,0,期初余额,

  0,0,0,0,期初余额,余额方向 from 帐簿初始化表

 update 本期汇总账簿 set 会计期间=b.取值 from

 系统参数表 as b where 参数名称='当前会计期间'

 insert into 科目余额表(科目代码, 期初借方余额, 期初贷方余额,

 本期借方发生额, 本期贷方发生额, 本年借方累计发生额,

  本年贷方累计发生额, 本期借方余额, 本期贷方余额,

 余额方向)

 select 科目代码,累计借方,累计贷方,0,0,0,0,

  case when 余额方向='借方' then 期初余额 else 0 end,

  case when 余额方向='贷方' then 期初余额 else 0 end,

  余额方向 from 帐簿初始化表

 update 科目余额表 set 会计期间=b.取值 from

 系统参数表 as b where 参数名称='当前会计期间' commit

 GO create proc sf_凭证过帐 as

 begin tran

 -- 设置本期汇总账簿信息

 update 本期汇总账簿 set 本期借方合计 = 本期借方合计 + b.借方,

  本期贷方合计 = 本期贷方合计 + b.贷方,

  本年借方累计 = 本年借方累计 + b.借方,

  本年贷方累计 = 本年贷方累计 + b.贷方,

  余额 = 余额 + case when 余额方向='借方' then (借方 - 贷方)

 else (贷方 - 借方) end

 from 本期汇总账簿 as a,

  (select 科目代码, sum(借方) as 借方, sum(贷方) as 贷方

  from 分录表 as f, 凭证表 as p where f.凭证编号 = p.凭证编号

  group by f.科目代码) as b

  where a.科目代码 = b.科目代码

 -- 设置本期明细账簿信息

 insert into 本期明细账簿(分录编号,会计期间,凭证字号, 凭证编号, 摘要,

 科目代码, 借方, 贷方, 数量, 单价, 结算方式,

 结算号, 结算日期)

 select 编号,会计期间,凭证字号, p.凭证编号, 摘要,

  科目代码, 借方, 贷方, 数量, 单价, 结算方式,

  结算号, 结算日期 from 凭证表 as p, 分录表 as f

 where f.凭证编号 = p.凭证编号

  --计算余额

 update 本期明细账簿

  set 余额方向=a.余额方向 from 科目表 as a

  where 本期明细账簿.科目代码=a.科目代码

 -- 通过游标循环计算余额

 declare @bh int, @dm char(20), @jf money, @df money

 declare @fx char(4), @bj char(4), @ye money, @kjqj int

 declare mycursor cursor for select 内部编号,科目代码,

  借方,贷方,余额方向,余额标记,会计期间 from 本期明细账簿

  where 余额标记 is null

 order by 内部编号

 open mycursor

 fetch next from mycursor into @bh,@dm,@jf,@df,@fx,@bj,@kjqj

 while (@@fetch_status=0)

 begin

  select @ye = 余额 from 本期明细账簿 where 内部编号 in

  (select max(内部编号) from 本期明细账簿

 where 内部编号 < @bh and 科目代码=@dm

 and 余额标记 = '是')

  -- 没有,本期第一条明细,从科目余额表取余额

  if(@ye is null)

  select @ye = case when 余额方向='借方' then

  本期借方余额 - 本期贷方余额 else

  本期贷方余额 - 本期借方余额 end

  from 科目余额表 where 会计期间 = @kjqj

  and 科目代码 = @dm

  select @ye = isnull(@ye,0)

  update 本期明细账簿

 set 余额=case when @fx='借方' then

  @ye + @jf - @df else

  @ye + @df - @jf end,

 余额标记='是'

 where 内部编号=@bh

 fetch next from mycursor into @bh,@dm,@jf,@df,@fx,@bj,@kjqj

 end

 close mycursor

 deallocate mycursor

 -- 更改状态

 update 凭证表 set 过账状态 = '已过'

 -- 放入历史

 insert into 凭证表历史 select * from 凭证表

 insert into 分录表历史 select * from 分录表

 -- 清除已过帐数据

 -- 注意,改放到程序中清除,因为要统计凭证张数/分录张数和金额

 -- 统计后删除

 -- delete from 分录表

 -- delete from 凭证表 commit

 GO

 create proc sf_期末结帐 as

 begin tran

 -- 先将没有过帐的凭证过帐

 exec sf_凭证过帐

 declare @kjqj int

 -- 当前会计期间

 select @kjqj = 会计期间 from 本期汇总账簿

  -- 计算科目余额表,可以统计资产负债表/损溢表等

 update 科目余额表 set 本期借方发生额 = b.本期借方合计,

 本期贷方发生额 = b.本期贷方合计,

 会计期间 = b.会计期间, 余额方向 = b.余额方向

  from

 科目余额表 as a, 本期汇总账簿 as b

  where a.科目代码 = b.科目代码 and a.会计期间=b.会计期间

 update 科目余额表 set

 本年借方累计发生额 = 本年借方累计发生额 + 本期借方发生额,

  本年贷方累计发生额 = 本年贷方累计发生额 + 本期贷方发生额,

  本期借方余额 = 期初借方余额 + 本期借方发生额,

  本期贷方余额 = 期初贷方余额 + 本期贷方发生额

  where 会计期间 = @kjqj

 -- 更新会计期间

 update 系统参数表 set 取值 = 取值 + 1 where 参数名称='当前会计期间'

 -- 将本期汇总账簿和明细账簿倒入历史,实例程序不演示

 ----------------------------------------------

 -- 清除汇总账簿和明细账簿,进入新的会计期间

 update 本期汇总账簿 set 会计期间 = 会计期间 + 1, 期初余额=余额,

  本期借方合计 = 0, 本期贷方合计 = 0, 余额 = 0

 delete from 本期明细账簿

  -- 新会计期间的科目余额表

 insert into 科目余额表(科目代码, 期初借方余额, 期初贷方余额,

 本期借方发生额, 本期贷方发生额, 本年借方累计发生额,

  本年贷方累计发生额, 本期借方余额, 本期贷方余额,

 余额方向,会计期间)

 select 科目代码, 本期借方余额, 本期贷方余额,0,0,0,0,

 本期借方余额, 本期贷方余额, 余额方向,会计期间+1

  from 科目余额表 where 会计期间 = @kjqj commit

 GO SET QUOTED_IDENTIFIER OFF

 GO SET ANSI_NULLS ON

 GO

 SET QUOTED_IDENTIFIER ON

 GO SET ANSI_NULLS ON

 GO

 create proc sf_计算资产负债表 @kjqj int as

 begin tran

 -- 计算资产负债表,这里提供计算的方法供演示

 -- 没有列出的明细项目都归到其他资产和其他负债里

 -- 注意,这里按照科目代码统计,主要说明资产负债表的含意和计算方法

 -- 如果科目代码不是这样,改存储过程需要作相应的修改

 delete from 资产负债表 where 会计期间 = @kjqj

 insert into 资产负债表(会计期间) values(@kjqj)

 update 资产负债表 set 现金及现金等价物 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期借方余额,0)-isnull(本期贷方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 >= 101 and 科目代码 <= 111)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 应收账款 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期借方余额,0)-isnull(本期贷方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 >= 121 and 科目代码 <= 129 and 科目代码<>125)

 as b where a.会计期间 = @kjqj

 -- 注意坏账准备为贷方

 update 资产负债表 set 坏账准备 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 = 125)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 应收账款净值 = 应收账款 - 坏账准备

 update 资产负债表 set 流动资产总计 = 现金及现金等价物 + 应收账款净值

 update 资产负债表 set 固定资产原值 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期借方余额,0)-isnull(本期贷方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and 科目代码 =171)

 as b where a.会计期间 = @kjqj

 -- 注意累计折旧为贷方

 update 资产负债表 set 累计折旧 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and 科目代码 = 175)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 固定资产总计 = 固定资产原值 - 累计折旧

 update 资产负债表 set 其他资产 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期借方余额,0)-isnull(本期贷方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 >= 131 and 科目代码 <= 195 and 科目代码<>171

 and 科目代码 <> 175)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 资产总计 = 流动资产总计 + 固定资产总计 + 其他资产

 -- 计算负债及所有者权益

 -- 负债类级别都是贷方金额

 update 资产负债表 set 应付账款 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 >= 201 and 科目代码 <= 204 )

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 预收账款 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 = 206)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 应付工资 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and 科目代码 = 215)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 其他负债 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 >= 209 and 科目代码 <= 281 and 科目代码 <> 215)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 负债总计 = 应付账款 + 预收账款 + 应付工资 + 其他负债

 -- 计算所有者权益

 update 资产负债表 set 实收资本 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and 科目代码 = 301)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 资本公积 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and 科目代码 = 311)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 赢余公积 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and 科目代码 = 313)

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 未分配利润 = b.金额 from 资产负债表 as a,

  (select sum(isnull(本期贷方余额,0)-isnull(本期借方余额,0)) as 金额

 from 科目余额表 where 会计期间 = @kjqj and

  科目代码 = 321 or 科目代码 = 322 )

 as b where a.会计期间 = @kjqj

 update 资产负债表 set 所有者权益总计 = 实收资本 + 资本公积 +

 赢余公积 + 未分配利润

 update 资产负债表 set 负债及所有者权益总计 = 负债总计 + 所有者权益总计 commit

 GO

  5

 程序开发 本系统采用多文档窗体程序,每一功能对应一个子窗体。

 5.1 程序运行结果

 本实例的运行结果如图2.1所示。选择主菜单中的各菜单项可进入相应的功能。

  图2.6

 实例运行结果

 (1) 首先选择【基础数据管理】|【科目设置】菜单命令,进入【会计科目设置】功能窗体,在其中输入科目的基础信息,如图2.7所示,其中【科目类别】选项组表示该科目所属的类别,一般资产类科目余额方向为借方,负债和权益科目余额方向为贷方,但也有特殊的,如“坏账准备”的科目余额方向就是贷方。

  图2.7

 会计科目设置功能窗体

  需要嫌憎或修改科目,单击相应的按钮,输入信息后单击【保存】按钮即可。需要删除一条信息,选中该信息后单击【删除】按钮。 (2) 科目设置完成后选择【基础数据管理】|【帐户设置】命令,进入【帐户设置(期初数据录入)】功能窗体,如图2.8所示。

  图2.8

 所示

 帐户设置功能窗体

 该功能模块有【建立新帐薄】、【启用帐薄】和【试算平衡】按钮用于建立一个新的功能模块的初始帐薄,单击按钮,系统在后台调用“sf_初始化帐户”存储过程,删除“帐薄初始化表”原有的信息,根据“科目表”重新创建“帐薄初始化表”并在窗体中显示。在DBGrid中输入各科目的初始信息和系统参数信息,完成后单击【启用帐薄】按钮启用新的帐薄。【启用帐薄】按钮先检查当前帐薄试算是否平衡,如果平衡则在后台调用“sf_启用帐户”存储过程,启用新定义的帐薄,需要注意的是,启用新定义的帐薄会删除系统历史的所以数据。【试算平衡】按钮可以随时查看当前的帐薄信息是否平衡,如图2.9和图3.0所示。从窗体下方的合计金额可以不平衡的原因。

 (3) 启用帐薄后可以进行凭证录入的工作。选择【凭证管理】|【凭证输入】命令,进入【会计凭证输入】功能窗体,如图3.1所示,在其中输入凭证和会计分录信息。单击【新增】按钮,系统自动新建一个凭证,凭证号和会计期间等信息自动产生,其中会计期间是“系统参数表”中的“当前会计期间”;在下方的stringGrid中输入分录的信息,完成后单击【保存】按钮,系统先检查借贷双方是否平衡,如果平衡给予保存。需要修改某个凭证信息,选择相应的凭证,单击【修改】按钮,修改完成后单击【保存】按钮即可。 (4) 完成了合计凭证的输入工作,需要对凭证进行过账。凭证过账就是确认输入的会计凭证,过账后的凭证不能在进行修改。选择【凭证管理】|【凭证过账】命令。系统提示是否过账,如图3.2所示。单击【是】按钮,系统在后台调用“sf_凭证过账”存储过程,对凭证进行过账,计算本期汇总帐薄和明细帐薄。过账完成后系统提示过账成功,并显示过账的凭证数及借贷方金额等信息。

  图3.1

 会计凭证输入功能窗体

  图3.1

 凭证过账功能

 (5) 可以分别选择【帐薄查询】|【总分类账】和【帐薄查询】|【明细账】命令,分别进行本期【总分类帐查询】和【明细帐查询】功能,如图3.2和图3.3所示。

 图3.2

 总分类帐查询

 图3.3

 明细账查询

  (6) 当前会计期间内的所有凭证过账完成后,可进行月末结账操作,转入下一会计期间,结账前首先要进行试算平衡的检查。选择【结账及报表】|【失算平衡表】命令,可以看到当前账目的平衡信息,如图3.4所示。

 图3.4

 试算平衡功能

  (7) 试算结果平衡后选择【结账及报表】|【期末结账】菜单命令,系统在后台调用“sf_计算资产负债表”存储过程计算资产负债表,然后在报表窗体中显示报表,如图3.5所示。

 5.2创建工程

 启动Microsoft Visual .NET 2003,在主菜单中选择【文件】|【新建】|【项目】命令,弹出【新建项目】对话框,在【项目类型】列表框中选择【Visual Basic 项目】选项,然后在【模板】列表框中选择【Windowns 应用程序】。在【名称】文本框输入一个合适的方案文件名,选取存放的位置,然后单击【确定】按钮完成新项目的开启。

  5.3 创建系统主窗体 (1) 利用系统默认生成的窗体作为主窗体,并为其添加主菜单控件和其他控件,布局如图3.5所示。

  图3.5

 系统主窗体

 (2) 窗体及其控件的属性设置如表3.6和表3.7所示。

 表3.6

 主窗体属性设置

 控制类型 对象(控件)名 属性 取值(说明) From Frorm Main Name frmMain

  Caption 财务管理系统

  IsMdiContainer True

  |表3.7

 窗体主菜单属性

  菜单栏 菜单项 属性 取值(说明) MnJichu

 Text 基础数据管理(&V)

 MnKemu Text 科目设置(&Z)

 MnZhanghu Text 帐户设置(&W) Mnpingzheng

 Text 凭证管理(&W)

 Mnshuru Text 凭证管理(&W

 Mnguozhang Text 凭证过账(&Z) Mnzhangbu

 Text 账簿查询(&X)

 Mnzongfen Text 总分类账(Y)

 Mnmingxi Text 明细账(&Z) Mnjiezhang

 Text 结账及报表(&Y)

 Mnpingzheng Text 试算平衡表(&Y)

 MnQimo Text 期末结账(&Y)

 Mnfuzhai Text 资产负债表(&Z) MnExit

 Text 退出系统(&Z)

  5.4 创建数据操作访问模块 因为系统中所有对数据表进行维护的窗体界面及实现的功能大体是一致的,为了减少系统编程的工作量,可以把这些共同的部分抽取出来,生成一个父类窗体,其他数据库操作窗体均可以通过继承父类窗体获得数据维护的功能。

 (1) 新建一个窗体,将其Name属性改为“frmBase”,并为其增加如图3.8所示的控件。

 图3.8

 基础窗体

 (2) 各控件的属性设置如表3.9所示。

 表3.9

 基础窗体控件属性设置 控件类型 对象名 属性 取值(说明) ImageList ImageList1 Images

 Toolbar Toolbar1 Buttons

 Toolbar Toolbar1 ImageList ImageList1 Groupbox Grbsearch Dock Top Textbox Txbone Text

 Textbox Txbtwo Text

 Textbox Txthree Text

 Textbox Txtsearch Text

 Button Btnsearch Text

 Datagird Dgglist Anchor Top,button,left,right

 (3)为窗体类frmbase添加以下变量。

  Protected bmData As BindingManagerBase

  Protected dtData As DataTable

  'bAdd = true 为新增

  'bAdd = false 为修改

  Protected bAdd As Boolean (4)为窗体类frmbase添加以下在派生类中需要重写的函数。

 Public Overridable Sub Prepare()

  End Sub

  '设置DataGrid控件

  Public Overridable Sub SetDataGrid()

  End Sub

  '查询函数

  Public Overridable Sub SearchResult()

  SetDataGrid()

  dgdList.DataSource = dtData.DefaultView

  End Sub

  '新增函数

  Public Overridable Sub LoadData()

  End Sub

  Public Overridable Sub SaveForAdd()

  End Sub

  '更新函数

  Public Overridable Sub SaveForUpdate()

  End Sub

  '删除函数

  Public Overridable Sub DeleteData()

  End Sub

  '清除函数

  Public Overridable Sub Clear()

  End Sub

  Public Overridable Sub LoadDataForDetail()

  End Sub

  '设置TextBox函数

  Public Overridable Sub SetTextBoxState(ByVal bState As Boolean)

  End Sub

  Public Overridable Sub ResetDataGridData()

  End Sub End Class

 (5)为窗体类frmbase的load事件添加响应函数 Private Sub frmBase_Load(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles MyBase.Load

  Prepare()

  SetDataGrid()

  SetTextBoxState(True) End Sub

 (6)为按钮btnsearch的click事件添加响应函数。 Private Sub btnSearch_Click(ByVal sender As System.Object, _

  ByVal e As System.EventArgs) Handles btnSearch.Click

  SearchResult()

  End Sub

 (7)为数据表格dgdlist的currentcellchanged事件添加响应函数。

  Private Sub dgdList_CurrentCellChanged(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles dgdList.CurrentCellChanged

  Try

  '判断bmData是否为Nothing

  If bmData Is Nothing Then

  Exit Sub

  End If

  'If bmData.Position <> dgdList.CurrentCell.RowNumber Then

  bmData.Position = dgdList.CurrentCell.RowNumber

  LoadDataForDetail()

  'End If

  Catch ex As Exception

  MessageBox.Show(ex.ToString)

  End Try End Sub

 (8) 为窗体类frmbase添加私有函数settoolbarstate。

  Private Sub SetToolBarState(ByVal bState As Boolean)

  '设置Button的是否能够单击

  ToolBar1.Buttons("0").Enabled = bState

  ToolBar1.Buttons("1").Enabled = bState

  ToolBar1.Buttons("2").Enabled = bState

  ToolBar1.Buttons("3").Enabled = bState

  ToolBar1.Buttons("4").Enabled = bState

  ToolBar1.Buttons("5").Enabled = bState

  ToolBar1.Buttons("6").Enabled = bState

  ToolBar1.Buttons("7").Enabled = Not bState

  ToolBar1.Buttons("8").Enabled = Not bState End Sub

 (9) 为工具栏toolbar1的buttonclick事件添加响应事件。

  Private Sub ToolBar1_ButtonClick(ByVal sender As Object, _

  ByVal e As ToolBarButtonClickEventArgs) _

  Handles ToolBar1.ButtonClick

  Select Case e.Button.Text

  Case "首记录"

  '返回首记录

  bmData.Position = 0

  Case "上记录"

  If bmData.Position <> 0 Then

  bmData.Position -= 1

  End If

  Case "下记录"

  If bmData.Position <> bmData.Count Then

  bmData.Position += 1

  End If

  Case "尾记录"

  '返回尾记录

  bmData.Position = bmData.Count

  Case "新增"

  Me.dgdList.Enabled = False

  SetTextBoxState(False)

  SetToolBarState(False)

  bAdd = True

  Clear()

  Case "修改"

  Me.dgdList.Enabled = False

  SetTextBoxState(False)

  SetToolBarState(False)

  bAdd = False

  Case "删除"

  '弹出询问对话框

  Dim dlgResult As DialogResult = _

 MessageBox.Show("你确认删除此数据?", _

  "删除", MessageBoxButtons.OKCancel)

  If dlgResult = DialogResult.OK Then

  DeleteData()

  End If

  Case "保存"

  SetToolBarState(True)

  SetTextBoxState(True)

  If bAdd = True Then

  '为新增数据保存

  SaveForAdd()

  Else

  '为更新数据保存

  SaveForUpdate()

  End If

  Me.dgdList.Enabled = True

  Case "取消"

  SetTextBoxState(True)

  SetToolBarState(True)

  Me.dgdList.Enabled = True

  ResetDataGridData()

  Case "退出"

  '关闭本窗体

  Me.Close()

  End Select

  Try

  Me.dgdList.CurrentRowIndex = bmData.Position

  Catch ex As Exception

  End Try

  End Sub

 5.5 实现会计科目设置功能。 (1) 选择【文件】|【添加新项】命令,在【添加新项】对话框的【模板】列表框中选择【继承的窗体】选项,取名为“frmKeMu.vb”。单击【打开】按钮弹出【继承选项器】对话框,在其中选择frmbase选项并单击【确定】按钮。为先创建的窗体添加如图3.9所示的控件。

 图3.9

 frmKeMu 窗体

 (2) 各控件的属性设置如表4.0所示。

 表4.0

  frmKeMu窗体控件属性设置 控件类型 对象名 属性 取值 Form frmKeMu Text Frmbase Groupbox Grbright Anchor Top,bottom,left,right Combobox Cbbkind Items 资产 负债 权益 成本 损益 Combobox Cbbkind Dropdownstyle Dropdown Combobox Cbbdirection Items 借方 贷方 Combobox Cbbdirection Dropdownstyle Dropdown Textbox Txbcode Text

 Textbox Txbname Text

 Textbox Txbhelpcode Text

  (3) 从工具栏中拖动一个sqldataadpter对象到窗体上,连接caiwubook数据库。添加科目表,并选择字段:科目代码、科目名称、助记符、科目类别、余额方向。单击【确定】按钮完成sqldataadapter对象的配置。 (4) 在sqldataadapter对象上右击,在弹出的快捷菜单中选择【生成数据集】命令,在弹出的【生成数据集】对话框中单击【确定】按钮。 (5) 为每个textbox控件和combobox控件设置数据源。 (6) 重写frmkemu的基类的以下函数。

 Public Overrides Sub Prepare()

  Me.Text = "会计科目设置"

 End Sub

 Public Overrides Sub LoadData()

  Dim strFilter As String

  If txbOne.Text.Trim.Length = 0 Then

  If txbTwo.Text.Trim.Length = 0 Then

  If txbThree.Text.Trim.Length = 0 Then

  strFilter = ""

  Else

  strFilter = "where 科目类别 like '"

  strFilter += txbThree.Text.Trim + "%'"

  End If

  Else

  strFilter = "where 科目名称 like '"

  strFilter += txbTwo.Text.Trim + "%'"

  If txbThree.Text.Trim.Length <> 0 Then

  strFilter += " and 科目类别 like '"

  strFilter += txbThree.Text.Trim + "%'"

  End If

  End If

  Else

  strFilter = "where 科目代码 like '"

  strFilter += txbOne.Text.Trim + "%'"

  If txbTwo.Text.Trim.Length <> 0 Then

  strFilter += " and 科目名称 like '"

  strFilter += txbTwo.Text.Trim + "%'"

  If txbThree.Text.Trim.Length <> 0 Then

  strFilter += " and 科目类别 like '"

  strFilter += txbThree.Text.Trim + "%'"

  End If

  Else

  If txbThree.Text.Trim.Length <> 0 Then

  strFilter += " and 科目类别 like '"

  strFilter += txbThree.Text.Trim + "%'"

  End If

  End If

  End If

  '清空DataSet11

  DataSet11.Clear()

  SqlConnection1.ConnectionString = DataBase.sConn

  SqlDataAdapter1.SelectCommand.CommandText _

  = "select * from 科目表

 " + strFilter

  '根据查询条件重新填充DataSet11

  SqlDataAdapter1.Fill(DataSet11)

  dtData = DataSet11.Tables("科目表")

  bmData = Me.BindingContext(DataSet11, "科目表")

  If bmData.Count <> 0 Then

  bmData.Position = 0

  End If

  End Sub

  Public Overrides Sub SetDataGrid()

  LoadData()

  '定义一个DataGrid表样式

  Dim ts As New DataGridTableStyle

  Dim aColumnTextColumn As DataGridTextBoxColumn

  Dim numCols As Integer = dtData.Columns.Count

  Dim i As Integer

  For i = 0 To 1

 aColumnTextColumn = New DataGridTextBoxColumn

  aColumnTextColumn.MappingName = _

  dtData.Columns(i).ColumnName

  aColumnTextColumn.HeaderText = _

  dtData.Columns(i).ColumnName

  aColumnTextColumn.NullText = ""

  aColumnTextColumn.ReadOnly = True

  ts.GridColumnStyles.Add(aColumnTextColumn)

  Next

  ts.AlternatingBackColor = Color.LightGray

  ts.AllowSorting = False

  ts.MappingName = dtData.TableName

  dgdList.TableStyles.Clear()

  dgdList.TableStyles.Add(ts)

  Dim dv As DataView = dtData.DefaultView

  dv.AllowNew = False

  dv.AllowDelete = False

  'dv.AllowEdit = False

  '设置数据源

  dgdList.DataSource = dtData.DefaultView

  bmData = Me.BindingContext(DataSet11, "科目表")

  lblCount.Text = "记录数:" + dtData.Rows.Count.ToString()

  End Sub

  Public Overrides Sub SetTextBoxState(ByVal bState As Boolean)

  Me.txbCode.ReadOnly = bState

  Me.txbHelpCode.ReadOnly = bState

  Me.txbName.ReadOnly = bState

  Me.cbbDirection.Enabled = Not bState

  Me.cbbKind.Enabled = Not bState

  End Sub

  Public Overrides Sub Clear()

  Me.txbCode.Text = ""

  Me.txbHelpCode.Text = ""

  Me.txbName.Text = ""

  End Sub

  Public Overrides Sub SaveForUpdate()

  Try

  Dim row As Integer

  row = dgdList.CurrentCell.RowNumber

  dgdList.CurrentCell = _

  New DataGridCell((row + 1) Mod bmData.Count, 0)

  '判断是否有更新的数据

  If Me.DataSet11.HasChanges = True Then

  SqlDataAdapter1.Update(DataSet11)

  End If

  Catch ex As Exception

  MessageBox.Show("数据修改失败!")

  End Try End Sub

  Public Overrides Sub SaveForAdd()

  Dim drData As DataRow = DataSet11.Tables("科目表").NewRow()

  Try

  drData("科目代码") = txbCode.Text.Trim

  drData("科目名称") = txbName.Text.Trim

  drData("助记码") = txbHelpCode.Text.Trim

  drData("科目类别") = cbbKind.Text.Trim

  drData("余额方向") = cbbDirection.Text.Trim

  Catch ex As Exception

  MessageBox.Show("数据格式不正确!")

  Exit Sub

  End Try

  Try

  DataSet11.Tables("科目表").Rows.Add(drData)

  If Me.DataSet11.HasChanges = True Then

  SqlDataAdapter1.Update(DataSet11)

  End If

  Catch ex As Exception

  MessageBox.Show("数据添加成功!")

  End Try

  End Sub 到此会计科目设置功能已经完成

 5.6 实现帐户设置功能

 帐户设置功能窗体不需要从父窗体继承。 (1) 新建一个窗体,将其name属性改为“frmzhanghu”,并为其添加如图4.1所示的控件。

 图4.1

  frmzhanghu窗体

 (2) 各控件的属性设置如表4.2所示。

 图4.2

 frmzhanghu窗体控件属性设置 控件类型 对象名 属性 取值(说明) From

 Frmzhanghu Text 帐户录入(期初数据录入) Toolbar Toolbar1 Buttons 如图4.1 Imagelist Imagelist1 Images 如图4.1 Groupbox Grbsearch Anchor Top,left,right Button Btnnew Text 建立新账簿 Button Btnstart Text 启用账簿 Button Btntry Text 试算平衡 Datagird Dgglist Anchor Top,button,left,right Datagrid Dgdright Anchor Top,button,right

 (3) 从工具箱中拖出一个sqldataadapter对象到窗体上,连接caiwubook数据库。添加账簿初始化表并选择字段:科目代码、科目名称、余额方向、累计借方、累积贷方、期初余额。 (4) 在sqldataadapter对象上右击,在弹出的快捷菜单中选择【生成数据集】命令,在弹出的【生成数据集】对话框中单击【确定】按钮。 (5) 从工具箱中拖动一个sqldataadapter对象到窗体上,连接caiwubook数据库,添加系统参数表并选择字段:编号、参数名称、取值。 (6) 在sqldataadapter2对象上右击,在弹出的快捷菜单中选择【生成数据集】命令,在弹出的【生成数据集】对话框中单击【确定】按钮。 (7) 为窗体累frmzhanghu添加以下私有变量。

  Private dtLeft As DataTable

 Private dtRight As DataTable

  (8) 为窗体类frmzhanghu添加以下私有函数。

 Private Sub SetLeftDataGrid()

  Me.SqlConnection1.ConnectionString = DataBase.sConn

  SqlDataAdapter1.Fill(DataSet11)

  dtLeft = DataSet11.Tables("帐簿初始化表")

  Dim ts As New DataGridTableStyle

  Dim aColumnTextColumn As DataGridTextBoxColumn

  Dim numCols As Integer = dtLeft.Columns.Count

  Dim i As Integer

  For i = 0 To numCols - 1

  aColumnTextColumn = New DataGridTextBoxColumn

  aColumnTextColumn.MappingName = _

  dtLeft.Columns(i).ColumnName

  aColumnTextColumn.HeaderText = _

  dtLeft.Columns(i).ColumnName

  aColumnTextColumn.NullText = ""

  aColumnTextColumn.Width = 60

  aColumnTextColumn.ReadOnly = True

  If i > 2 Then

  aColumnTextColumn.ReadOnly = False

  aColumnTextColumn.HeaderText += "(可编辑)"

  aColumnTextColumn.Width = 105

  End If

  ts.GridColumnStyles.Add(aColumnTextColumn)

  Next

  ts.AlternatingBackColor = Color.LightGray

  ts.AllowSorting = False

  ts.MappingName = dtLeft.TableName

  dgdLeft.TableStyles.Add(ts)

  Dim dv As DataView = dtLeft.DefaultView

  dv.AllowNew = False

  dv.AllowDelete = False

  'dv.AllowEdit = False

  '设置数据源

  dgdLeft.DataSource = dtLeft.DefaultView

  End Sub

  Private Sub SetRightDataGrid()

  Me.SqlConnection1.ConnectionString = DataBase.sConn

  SqlDataAdapter2.Fill(DataSet11)

  dtRight = DataSet11.Tables("系统参数表")

  Dim ts As New DataGridTableStyle

  Dim aColumnTextColumn As DataGridTextBoxColumn

  Dim numCols As Integer = dtRight.Columns.Count

  Dim i As Integer

  For i = 0 To numCols - 1

  aColumnTextColumn = New DataGridTextBoxColumn

  aColumnTextColumn.MappingName = _

  dtRight.Columns(i).ColumnName

  aColumnTextColumn.HeaderText = _

  dtRight.Columns(i).ColumnName

  aColumnTextColumn.NullText = ""

  If i = 0 Then

  aColumnTextColumn.Width = 30

  Else

  aColumnTextColumn.Width = 60

  End If

  aColumnTextColumn.ReadOnly = True

  If i = 2 Then

  aColumnTextColumn.ReadOnly = False

  aColumnTextColumn.HeaderText += "(可编辑)"

  aColumnTextColumn.Width = 80

  End If

  ts.GridColumnStyles.Add(aColumnTextColumn)

  Next

  ts.AlternatingBackColor = Color.LightGray

  ts.AllowSorting = False

  ts.MappingName = dtRight.TableName

  dgdRight.TableStyles.Add(ts)

  Dim dv As DataView = dtRight.DefaultView

  dv.AllowNew = False

  dv.AllowDelete = False

  'dv.AllowEdit = False

  '设置数据源

  dgdRight.DataSource = dtRight.DefaultView End Sub

 (9) 为窗体frmzhanghu的load事件添加事件响应函数。

 Private Sub frmZhangHu_Load(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles MyBase.Load

  SetLeftDataGrid()

  SetRightDataGrid()

 End Sub

 (10) 为工具栏toolbar1的buttonclick事件响应函数。

 Private Sub ToolBar1_ButtonClick(ByVal sender As Object, ByVal _

  e As ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick

  Dim row As Integer

  row = dgdLeft.CurrentCell.RowNumber

  dgdLeft.CurrentCell = _

  New DataGridCell((row + 1) _

  Mod DataSet11.Tables("帐簿初始化表").Rows.Count, 0)

  row = dgdRight.CurrentCell.RowNumber

  dgdRight.CurrentCell = New DataGridCell((row + 1) _

  Mod DataSet11.Tables("系统参数表").Rows.Count, 0)

  If DataSet11.HasChanges = True Then

  Try

  SqlDataAdapter1.Update(DataSet11)

  SqlDataAdapter2.Update(DataSet11)

  Catch ex As Exception

  MessageBox.Show("更新数据出错!")

  End Try

  End If

  End Sub

 (11) 为按钮btnnew的click事件添加事件响应函数。

  Private Sub btnNew_Click(ByVal sender As System.Object, _

  ByVal e As System.EventArgs) Handles btnNew.Click

  Dim dlgResult As DialogResult = _

  MessageBox.Show("是否清除原账簿信息,并初始化新帐簿?", _

  "删除", MessageBoxButtons.OKCancel)

  If dlgResult = DialogResult.OK Then

  Dim db As DataBase = New DataBase

  db.RunDelOrInsSQL("exec sf_初始化帐户")

  db.Dispose()

  End If

  SqlDataAdapter1.Fill(DataSet11)

  dtLeft = DataSet11.Tables("帐簿初始化表")

  dgdLeft.DataSource = dtLeft

  End Sub

 (12) 为按钮btnstart的click事件添事件响应函数。

  Private Sub btnStart_Click(ByVal sender As System.Object, _

  ByVal e As System.EventArgs) Handles btnStart.Click

  Dim dlgPingHeng As frmPingHeng = New frmPingHeng

  'If dlgPingHeng.CalPingHeng(0) <> True Then

  '

 MessageBox.Show("初始数据试算不平衡,请检查数据", _

  '

 "确认", MessageBoxButtons.OK)

  '

 Return

  'End If

  Dim strMsg As String = "试算结果平衡,"

  strMsg += "启用新帐簿将删除所有历史数据,是否继续?"

  Dim dlgResult As DialogResult = _

  MessageBox.Show(strMsg, "确认", MessageBoxButtons.OKCancel)

  '调用sf_初始化帐户存储过程建立新帐簿

  If dlgResult = DialogResult.OK Then

  Dim db As DataBase = New DataBase

  db.RunDelOrInsSQL("exec sf_启用帐户")

  strMsg = "新帐簿成功启用"

  MessageBox.Show(strMsg, "确认", MessageBoxButtons.OK)

  dlgPingHeng.Dispose()

  End If End Sub

 (13) 单击【试算平衡】按钮时需要弹出一个新的窗体显示试算的结果。新建一个窗体,并命名“frmpingheng”,为其添加如图4.3所示的控件。

 图4.3

 frmpingheng窗体

 (14) 各控件的属性设置如表4.4所示。

  图4.4

  frmpingheng窗体控件属性设置 控制类型 对象名 属性 取值(说明) From Frmpingheng Text 试算平衡 Datagrid Dgdtop Anchor Top,bottom,left,right Datagrid Dgdbottom Dock Botton

 (15) 为窗体类frmpingheng添加以下私有函数。

  'Private Sub SetTopDataGrid()

  '

 Dim db As DataBase = New DataBase

  '

 Dim strSQL As String = "select 科目代码,科目名称,(case"

  '

 strSQL += " when 余额方向='借方' then 期初余额 else 0 end -"

  '

 strSQL += " 累计借方) as 期初借方,(case when 余额方向='贷方'"

  '

 strSQL += " then 期初余额 else 0 end - 累计贷方) as 期初贷方,"

  '

 strSQL += "累计借方 as 本期发生借方,累计贷方 as 本期发生贷方,"

  '

 strSQL += "case when 余额方向='借方' then 期初余额 else 0 end as "

  '

 strSQL += "期末借方,case when 余额方向='贷方' then 期初余额 else 0"

  '

 strSQL += " end as 期末贷方 from 帐簿初始化表 where 累计借方<>0 or"

  '

 strSQL += " 累计贷方<>0 or 期初余额<>0"

  '

 dtTop = db.RunSelectSQL(strSQL).Table

  '

 Dim ts As New DataGridTableStyle

  '

 Dim aColumnTextColumn As DataGridTextBoxColumn

  '

 Dim numCols As Integer = dtTop.Columns.Count

  '

 Dim i As Integer

  '

 For i = 0 To numCols - 1

  '

 aColumnTextColumn = New DataGridTextBoxColumn

  '

 aColumnTextColumn.MappingName = _

  '

 dtTop.Columns(i).ColumnName

  '

 aColumnTextColumn.HeaderText = _

  '

 dtTop.Columns(i).ColumnName

  '

 aColumnTextColumn.NullText = ""

  '

 aColumnTextColumn.Width = 60

  '

 aColumnTextColumn.ReadOnly = True

  '

 ts.GridColumnStyles.Add(aColumnTextColumn)

  '

 Next

  '

 ts.AlternatingBackColor = Color.LightGray

  '

 ts.AllowSorting = False

  '

 ts.MappingName = dtTop.TableName

  '

 dgdTop.TableStyles.Add(ts)

  '

 Dim dv As DataView = dtTop.DefaultView

  '

 dv.AllowNew = False

  '

 dv.AllowDelete = False

  '

 dv.AllowEdit = False

  '

 '设置数据源

  '

 dgdTop.DataSource = dtTop.DefaultView

  'End Sub

 'Private Sub CreateDataTalbe()

  '

 '创建数据表

  '

 dtBottom = New DataTable("结果")

  '

 '添加列

  '

 With dtBottom.Columns

  '

 .Add("是否平衡", Type.GetType("System.String"))

  '

 .Add("期初借方合计", Type.GetType("System.String"))

  '

 .Add("期初贷方合计", Type.GetType("System.String"))

  '

 .Add("本期借方合计", Type.GetType("System.String"))

  '

 .Add("本期贷方合计", Type.GetType("System.String"))

  '

 .Add("期末借方合计", Type.GetType("System.String"))

  '

 .Add("期末贷方合计", Type.GetType("System.String"))

  '

 End With

  'End Sub

  '' 计算是否平衡并显示出计算结果

  '' nStatus 0 初始化帐簿时计算

  '' 1 正式使用后凭证的计算

  'Public Function CalPingHeng(ByVal iStatus As Integer) As Boolean

  '

 Dim bResult As Boolean

  '

 ' 根据不同的状态计算平衡情况

  '

 Dim strSQL As String

  '

 ' 初始化帐簿的试算平衡,需要根据初始化的信息反算期初

  '

 Dim db As DataBase = New DataBase

  '

 If iStatus = 0 Then

  '

 strSQL = "select 科目代码, 科目名称,"

  '

 strSQL += "(case when 余额方向='借方' then 期初余额 "

  '

 strSQL += " else 0 end - 累计借方) as 期初借方,"

  '

 strSQL += "(case when 余额方向='贷方' then 期初余额"

  '

 strSQL += "

 else 0 end - 累计贷方) as 期初贷方,"

  '

 strSQL += "累计借方 as 本期发生借方,累计贷方 as 本期发生贷方,"

  '

 strSQL += "case when 余额方向='借方' then 期初余额 "

  '

 strSQL += "else 0 end as 期末借方,"

  '

 strSQL += "case when 余额方向='贷方' then 期初余额 "

  '

 strSQL += " else 0 end as 期末贷方 "

  '

 strSQL += " from 帐簿初始化表 "

  '

 strSQL += " where 累计借方<>0 or 累计贷方<>0 or 期初余额<>0"

  '

 dgdTop.DataSource = db.RunSelectSQL(strSQL)

  '

 ' 计算合计金额,用于判断是否平衡

  '

 strSQL = "select "

  '

 strSQL += "sum(case when 余额方向='借方' "

  '

 strSQL += " then 期初余额 else 0 end-累计借方) as 期初借方合计,"

  '

 strSQL += "sum(case when 余额方向='贷方' "

  '

 strSQL += " then 期初余额 else 0 end-累计贷方) as 期初贷方合计,"

  '

 strSQL += "sum(累计借方) as 本期借方合计,sum(累计贷方) "

  '

 strSQL += "as 本期贷方合计,"

  '

 strSQL += "sum(case when 余额方向='借方' then

 "

  '

 strSQL += "期初余额 else 0 end) as 期末借方合计,"

  '

 strSQL += "sum(case when 余额方向='贷方' then

 "

  '

 strSQL += " 期初余额 else 0 end) as 期末贷方合计"

  '

 strSQL += " from 帐簿初始化表 "

  '

 strSQL += " where 累计借方<>0 or 累计贷方<>0 or 期初余额<>0"

  '

 Dim dv As DataView = db.RunSelectSQL(strSQL)

  '

 bResult = AddToDataTable(dv)

  '

 Else

  '

 strSQL = "select a.科目代码, b.科目名称,"

  '

 strSQL += "(case when a.余额方向='借方' "

  '

 strSQL += " then 期初余额 else 0 end ) as 期初借方,"

  '

 strSQL += "(case when a.余额方向='贷方' "

  '

 strSQL += " then 期初余额 else 0 end) as 期初贷方,"

  '

 strSQL += "本期借方合计 as 本期发生借方, 本期贷方合计 "

  '

 strSQL += "as 本期发生贷方,"

  '

 strSQL += "case when a.余额方向='借方' then 余额 else 0 end "

  '

 strSQL += "as 期末借方,"

  '

 strSQL += "case when a.余额方向='贷方' then 余额 else 0 end "

  '

 strSQL += "as 期末贷方"

  '

 strSQL += " from 本期汇总账簿 as a, 科目表 as b

 "

  '

 strSQL += " where a.科目代码 = b.科目代码 and (本期借方合计<> 0"

  '

 strSQL += " or 本期贷方合计<>0 or 期初余额<>0 or 余额<>0)"

  '

 Dim dvTemp As DataView = db.RunSelectSQL(strSQL)

  '

 dvTemp.AllowEdit = False

  '

 dvTemp.AllowDelete = False

  '

 dvTemp.AllowNew = False

  '

 dgdTop.DataSource = dvTemp

  '

 strSQL = "select "

  '

 strSQL += "sum(case when 余额方向='借方' then 期初余额 else 0 end)"

  '

 strSQL += " as 期初借方合计,"

  '

 strSQL += "sum(case when 余额方向='贷方' then 期初余额 else 0 end)"

  '

 strSQL += " as 期初贷方合计,"

  '

 strSQL += "sum(本期借方合计) as 本期借方合计,sum(本期贷方合计) "

  '

 strSQL += "as 本期贷方合计,"

  '

 strSQL += "sum(case when 余额方向='借方' then 余额 else 0 end) "

  '

 strSQL += "as 期末借方合计,"

  '

 strSQL += "sum(case when 余额方向='贷方' then 余额 else 0 end) "

  '

 strSQL += "as 期末贷方合计"

  '

 strSQL += " from 本期汇总账簿 "

  '

 strSQL += " where 本期借方合计<> 0 or 本期贷方合计<>0 or "

  '

 strSQL += "期初余额<>0 or 余额<>0"

  '

 Dim dv As DataView = db.RunSelectSQL(strSQL)

  '

 bResult = AddToDataTable(dv)

  '

 Me.dgdBottom.DataSource = dtBottom

  '

 End If

  '

 db.Dispose()

  '

 Return bResult

  'End Function

  'Private Sub SetBottomDataGrid()

  '

 Dim ts As New DataGridTableStyle

  '

 Dim aColumnTextColumn As DataGridTextBoxColumn

  '

 Dim numCols As Integer = dtBottom.Columns.Count

  '

 Dim i As Integer

  '

 For i = 0 To numCols - 1

  '

 aColumnTextColumn = New DataGridTextBoxColumn

  '

 aColumnTextColumn.MappingName = _

  '

 dtBottom.Columns(i).ColumnName

  '

 aColumnTextColumn.HeaderText = _

  '

 dtBottom.Columns(i).ColumnName

  '

 aColumnTextColumn.NullText = ""

  '

 aColumnTextColumn.Width = 80

  '

 aColumnTextColumn.ReadOnly = True

  '

 ts.GridColumnStyles.Add(aColumnTextColumn)

  '

 Next

  '

 ts.AlternatingBackColor = Color.LightGray

  '

 ts.AllowSorting = False

  '

 ts.MappingName = dtBottom.TableName

  '

 dgdBottom.TableStyles.Add(ts)

  '

 Dim dv As DataView = dtBottom.DefaultView

  '

 dv.AllowNew = False

  '

 dv.AllowDelete = False

  '

 dv.AllowEdit = False

  '

 '设置数据源

  '

 dgdBottom.DataSource = dtBottom.DefaultView

  'End Sub

  'Private Function AddToDataTable(ByRef dv As DataView) As Boolean

  '

 '判断dtBottom是否初始化

  '

 If dtBottom Is Nothing Then

  '

 CreateDataTalbe()

  '

 End If

  '

 Dim bResult As Boolean

  '

 '清空数据表的内容

  '

 dtBottom.Rows.Clear()

  '

 Dim dr As DataRow = dtBottom.NewRow()

  '

 '获取一行数据

  '

 Try

  '

 dr("期初借方合计") = SetText(dv.Item(0)("期初借方合计"))

  '

 dr("期初贷方合计") = SetText(dv.Item(0)("期初贷方合计"))

  '

 dr("本期借方合计") = SetText(dv.Item(0)("本期借方合计"))

  '

 dr("本期贷方合计") = SetText(dv.Item(0)("本期贷方合计"))

  '

 dr("期末借方合计") = SetText(dv.Item(0)("期末借方合计"))

  '

 dr("期末贷方合计") = SetText(dv.Item(0)("期末贷方合计"))

  '

 Catch ex As Exception

  '

 MessageBox.Show(ex.ToString)

  '

 End Try

  '

 dr("期初借方合计") = SetText(dv.Item(0)("期初借方合计"))

  '

 '判断是否平衡

  '

 If SetText(dv.Item(0)("期初借方合计")) _

  '

 <> SetText(dv.Item(0)("期初贷方合计")) Or _

  '

 SetText(dv.Item(0)("本期借方合计")) _

  '

 <> SetText(dv.Item(0)("本期贷方合计")) Or _

  '

 SetText(dv.Item(0)("期末借方合计")) _

  '

 <> SetText(dv.Item(0)("期末贷方合计")) Then

  '

 dr("是否平衡") = "不平衡"

  '

 bResult = False

  '

 Else

  '

 dr("是否平衡") = "平衡"

  '

 bResult = True

  '

 End If

  '

 dtBottom.Rows.Add(dr)

  '

 Return bResult

  'End Function

  'Private Function SetText(ByVal obj As Object) As String

  '

 If obj Is Nothing Then

  '

 Return ""

  '

 Else

  '

 Return obj.ToString()

  '

 End If

  'End Function End Class

 (16) 为按钮btntry的click事件添加事件响应函数。 Public sub btntry_click(byual sender as system.object,_byval e as system.eventargs) handles Dim dlgpingheng as frmpingheng=new frmpingheng Dlgpingheng.showdialog() Dlgpingheng.dispose() End sub 到此帐户设置功能已经完成。

 5.7 实现凭证输入功能 (1) 选择【文件】|【添加新项】命令,在【添加新项】对话框【模板】列表框中选择【继承的窗体】选项,取名为“frmshuru.vb”。单击【打开】按钮,弹出【继承选择器】对话框,在其中选择frmbase选项并单击【确定】按钮。为新建窗体如图4.5所示的控件。

  图4.5

  最终的frmshuru窗体

 (2) 各控件的属性设置如表4.6所示。

  表4.6

  frmshuru窗体控件属性设置 控件类型 对象名 属性 取值(说明) From Frmshuru Text 会计凭证输入 Textbox Txbcode Readonly True Textbox Txbdate Text

 Textbox Txbpeople Text

 Textbox Txbperiod Readonly True Textbox Txbperiod Readonly True Textbox Txbstate Readonly True Textbox Txbdebittotal Readonly True Textbox Txblendertoyal Readonly True Groupbox Grabove Anchor Top,left,right Groupbox Grabove Text 凭证表 Groupbox Grbottom Anchbor Top,bottom,left,right Groupbox Grbottom Text 分录表 Textbox Txbsummary Text

 Textbox Txbsubjectcode Text

 Textbox Txbsujectcode Text

 Textbox Txbdebit Text 0 Textbox Txblender Text 0 Button Btnadd Text 添加 Button Btnsave Text 修改 Button Btndal Text 删除 Datagrid Dgddetail Anchor Top,bottom,left,right

  (3) 从工具箱中拖动一个sqldataadapter对象到窗体上,连接caiwubook数据库。添加凭证表并选择字段:凭证编号、会计期间、日期、凭证字号、过账状态、借方合计、贷方合计。 (4) 在sqldataadapter对象右击,在弹出的快捷菜单中选择【生成数据集】菜单命令。在弹出的【生成数据集】对话框中单击【确定】按钮。 (5) 为每个textbox控件设置数据源。 (6) 为窗体类frmshuru添加私有变量。

  Private bmDetail As BindingManagerBase

  Private dtDetail As DataTable

 Private iCurrentLine As Integer = 0 (7) 为窗体类frmshuru添加私有变量。

 Private Sub SetDetailDataGrid(ByVal iCount As Integer)

  '

 LoadDataForDetail()

  '

 '定义一个DataGrid表样式

  '

 Dim ts As New DataGridTableStyle

  '

 Dim aColumnTextColumn As DataGridTextBoxColumn

  '

 Dim numCols As Integer = dtDetail.Columns.Count

  '

 Dim i As Integer

  '

 For i = 2 To numCols - 1

 '

 aColumnTextColumn = New DataGridTextBoxColumn

  '

 aColumnTextColumn.MappingName = _

  '

 dtDetail.Columns(i).ColumnName

  '

 aColumnTextColumn.HeaderText = _

  '

 dtDetail.Columns(i).ColumnName

  '

 aColumnTextColumn.NullText = ""

  '

 ts.GridColumnStyles.Add(aColumnTextColumn)

  '

 Next

  '

 ts.AlternatingBackColor = Color.LightGray

  '

 ts.AllowSorting = False

  '

 ts.MappingName = dtDetail.TableName

  '

 dgdDetail.TableStyles.Add(ts)

  '

 Dim dv As DataView = dtDetail.DefaultView

  '

 dv.AllowEdit = False

  '

 dv.AllowNew = False

  '

 dv.AllowDelete = False

  '

 '设置数据源

  '

 dgdDetail.DataSource = dtDetail

  '

 SetTextBoxData()

  '

 End Sub

  '

 Private Sub dgdDetail_CurrentCellChanged(ByVal sender _

  '

 As Object, ByVal e As EventArgs) _

  '

 Handles dgdDetail.CurrentCellChanged

  '

 If iCurrentLine <> dgdDetail.CurrentCell.RowNumber Then

  '

 iCurrentLine = dgdDetail.CurrentCell.RowNumber

  '

 SetTextBoxData()

  '

 End If

  '

 End Sub

  '

 Private Sub SetTextBoxData()

  '

 Try

  '

 If dtDetail.Rows(iCurrentLine)("科目代码") Is Nothing Then

  '

 Return

  '

 Else

  '

 txbSubjectCode.Text = _

  '

 dtDetail.Rows(iCurrentLine)("科目代码")

  '

 txbSubjectName.Text = _

  '

 dtDetail.Rows(iCurrentLine)("科目名称")

  '

 txbSummary.Text = dtDetail.Rows(iCurrentLine)("摘要")

  '

 txbDebit.Text = dtDetail.Rows(iCurrentLine)("借方")

  '

 txbLender.Text = dtDetail.Rows(iCurrentLine)("贷方")

  '

 End If

  '

 Catch ex As Exception

  '

 End Try

  '

 End Sub

  '

 Private Sub txbSubjectCode_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txbSubjectCode.TextChanged

 '

 Dim strCode As String = txbSubjectCode.Text.Trim

  '

 If strCode = "" Then

  '

 Return

  '

 End If

  '

 Dim strSQL As String = "select 科目名称 from 科目表 where 科目代码=" + strCode

  '

 Dim db As DataBase = New DataBase

  '

 Dim dv As DataView = db.RunSelectSQL(strSQL)

  '

 If dv.Table.Rows.Count = 0 Then

  '

 Me.txbSubjectName.Text = ""

  '

 Return

  '

 End If

  '

 Me.txbSubjectName.Text = dv(0)(0).ToString().Trim()

  '

 End Sub

  '

 Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click

  '

 If ValidateData() = False Then

  '

 MessageBox.Show("数据格式不确")

  '

 Return

  '

 End If

  '

 Try

  '

 Dim dr As DataRow = dtDetail.NewRow

  '

 dr("摘要") = txbSummary.Text.Trim

  '

 dr("科目代码") = txbSubjectCode.Text.Trim

  '

 dr("科目名称") = txbSubjectName.Text.Trim

  '

 dr("借方") = txbDebit.Text.Trim

  '

 dr("贷方") = txbLender.Text.Trim

  '

 dtDetail.Rows.Add(dr)

  '

 dgdDetail.DataSource = dtDetail

  '

 dgdDetail.CurrentRowIndex = dtDetail.Rows.Count - 1

  '

 UpdateMoney()

  '

 Catch ex As Exception

  '

 MessageBox.Show("数据格式不正确")

  '

 End Try

  '

 ClearTextBox()

  '

 End Sub

  '

 Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click

  '

 If ValidateData() = False Then

  '

 MessageBox.Show("数据格式不确")

  '

 Return

  '

 End If

  '

 If dgdDetail.CurrentRowIndex = -1 Then

  '

 Return

  '

 End If

  '

 Try

  '

 Dim iRow As Integer = dgdDetail.CurrentRowIndex

  '

 dtDetail.Rows(iRow)("摘要") = txbSummary.Text.Trim

  '

 dtDetail.Rows(iRow)("科目代码") = txbSubjectCode.Text.Trim

  '

 dtDetail.Rows(iRow)("科目名称") = txbSubjectName.Text.Trim

  '

 dtDetail.Rows(iRow)("借方") = txbDebit.Text.Trim

  '

 dtDetail.Rows(iRow)("贷方") = txbLender.Text.Trim

  '

 UpdateMoney()

  '

 Catch ex As Exception

  '

 MessageBox.Show("数据格式不正确")

  '

 End Try

  '

 ClearTextBox()

  '

 End Sub

  '

 Private Sub btnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDel.Click

  '

 Try

  '

 '获得DataGrid当前被选中的行号

  '

 Dim iRow = dgdDetail.CurrentRowIndex

  '

 '弹出对话框让用户确认要删除记录

  '

 '如果用户确认要删除记录

  '

 If MessageBox.Show("你确认要删除此条记录吗?", "Confirm", MessageBoxButtons.YesNo) = DialogResult.Yes Then

  '

 '从商品清单表删除当前被选中记录()

  '

 ClearTextBox()

  '

 dtDetail.Rows.RemoveAt(iRow)

  '

 Else

  '

 Exit Sub

  '

 End If

  '

 Catch ex As Exception

  '

 MessageBox.Show("删除数据出错")

  '

 End Try

  '

 UpdateMoney()

  '

 ClearTextBox()

  '

 End Sub

  '

 Private Function ValidateData() As Boolean

  '

 If txbSubjectCode.Text.Trim = "" Or _

  '

 txbSubjectName.Text.Trim = "" or _

  '

 (txbDebit.Text.Trim = "0" And txbLender.Text.Trim = "0") Then

  '

 Return False

  '

 End If

  '

 Return TRUE

  '

 End Function

  '

 Private Sub ClearTextBox()

  '

 txbSummary.Text = ""

  '

 txbSubjectCode.Text = ""

  '

 txbSubjectName.Text = ""

  '

 txbDebit.Text = "0"

  '

 txbLender.Text = "0"

  '

 End Sub

  '

 Private Function CalMoney() As Single()

  '

 Dim Result(2) As Single

  '

 Result(0) = 0

  '

 Result(1) = 0

  '

 Dim i As Integer

  '

 For i = 0 To dtDetail.Rows.Count - 1

  '

 Result(0) += CSng(dtDetail.Rows(i)("借方"))

  '

 Result(1) += CSng(dtDetail.Rows(i)("贷方"))

  '

 Next

  '

 Return Result

 '

 End Function

  '

 Private Sub UpdateMoney()

  '

 Dim Result() As Single = CalMoney()

  '

 Me.txbDebitTotal.Text = Result(0).ToString("f")

  '

 Me.txbLenderTotal.Text = Result(1).ToString("f")

  '

 End Sub

  '

 Private Sub InsertDetail(ByVal code As String)

  '

 If Me.txbLenderTotal.Text.Trim <> Me.txbDebitTotal.Text.Trim Then

  '

 MessageBox.Show("借贷双方不平衡,请检查")

  '

 Return

  '

 End If

  '

 If dtDetail.Rows.Count <= 0 Then

  '

 Return

  '

 End If

  '

 '首先删除与当前的凭证编号关联的分录表的记录

  '

 Dim db As DataBase = New DataBase

  '

 Dim strSQL As String = "delete from 分录表 where 凭证编号='"

  '

 strSQL += code + "'"

  '

 db.RunDelOrInsSQL(strSQL)

  '

 strSQL = ""

  '

 For Each dr As DataRow In dtDetail.Rows

  '

 strSQL += " insert into 分录表(凭证编号,摘要,科目代码,"

  '

 strSQL += " 借方, 贷方) values('" + code + "','"

  '

 strSQL += dr("摘要").ToString().Trim + "','"

  '

 strSQL += dr("科目代码").ToString().Trim + "',"

  '

 strSQL += dr("借方").ToString().Trim + ","

  '

 strSQL += dr("贷方").ToString().Trim + ")"

  '

 Next

  '

 db.RunDelOrInsSQL(strSQL)

  '

 db.Dispose()

  '

 End Sub

  '

 Private Sub DeleteDetail()

  '

 Dim db As DataBase = New DataBase

  '

 Dim strSQL As String = "delete from 分录表 where 凭证编号='"

  '

 strSQL += txbCode.Text.Trim + "'"

  '

 db.RunDelOrInsSQL(strSQL)

  '

 db.Dispose() '

 End Sub

 (8) 为窗体类frmshuru添加私有函数。

 '

 Public Overrides Sub Prepare()

  '

 Me.Text = "会计输入凭证"

  '

 Me.Label1.Text = "凭证编号"

  '

 Me.Label2.Text = "会计期间"

  '

 Me.Label3.Text = "

 日期"

  '

 End Sub

  '

 Public Overrides Sub LoadData()

  '

 Dim strFilter As String

  '

 If txbOne.Text.Trim.Length = 0 Then

  '

 If txbTwo.Text.Trim.Length = 0 Then

  '

 If txbThree.Text.Trim.Length = 0 Then

  '

 strFilter = ""

  '

 Else

  '

 strFilter = "where 日期 like '"

  '

 strFilter += txbThree.Text.Trim + "%'"

  '

 End If

  '

 Else

  '

 strFilter = "where 会计期间 like '" + txbTwo.Text.Trim + "%'"

  '

 If txbThree.Text.Trim.Length <> 0 Then

  '

 strFilter += " and 日期 like '"

  '

 strFilter += txbThree.Text.Trim + "%'"

  '

 End If

  '

 End If

  '

 Else

  '

 strFilter = "where 凭证编号 like '" + txbOne.Text.Trim + "%'"

  '

 If txbTwo.Text.Trim.Length <> 0 Then

  '

 strFilter += " and 会计期间 like '" + txbTwo.Text.Trim + "%'"

  '

 If txbThree.Text.Trim.Length <> 0 Then

  '

 strFilter += " and 日期 like '"

  '

 strFilter += txbThree.Text.Trim + "%'"

  '

 End If

  '

 Else

  '

 If txbThree.Text.Trim.Length <> 0 Then

  '

 strFilter += " and 日期 like '"

  '

 strFilter += txbThree.Text.Trim + "%'"

  '

 End If

  '

 End If

  '

 End If

  '

 '清空DataSet11

  '

 DataSet11.Clear()

  '

 SqlConnection1.ConnectionString = DataBase.sConn

  '

 SqlDataAdapter1.SelectCommand.CommandText _

  '

 = "select * from 凭证表

 " + strFilter

  '

 '根据查询条件重新填充DataSet11

  '

 SqlDataAdapter1.Fill(DataSet11)

  '

 dtData = DataSet11.Tables("凭证表")

  '

 bmData = Me.BindingContext(DataSet11, "凭证表")

  '

 End Sub

  '

 Public Overrides Sub SetDataGrid()

  '

 LoadData()

  '

 '定义一个DataGrid表样式

  '

 Dim ts As New DataGridTableStyle

  '

 Dim aColumnTextColumn As DataGridTextBoxColumn

  '

 Dim numCols As Integer = dtData.Columns.Count

  '

 Dim i As Integer

  '

 For i = 0 To 2

 '

 aColumnTextColumn = New DataGridTextBoxColumn

  '

 aColumnTextColumn.MappingName = _

  '

 dtData.Columns(i).ColumnName

  '

 aColumnTextColumn.HeaderText = _

  '

 dtData.Columns(i).ColumnName

  '

 aColumnTextColumn.NullText = ""

  '

 aColumnTextColumn.ReadOnly = True

  '

 aColumnTextColumn.Width = 55

  '

 If i = 2 Then

  '

 aColumnTextColumn.Format = "yyyy-M-d"

  '

 End If

  '

 ts.GridColumnStyles.Add(aColumnTextColumn)

  '

 Next

  '

 ts.AlternatingBackColor = Color.LightGray

  '

 ts.AllowSorting = False

  '

 ts.MappingName = dtData.TableName

  '

 dgdList.TableStyles.Add(ts)

  '

 Dim dv As DataView = dtData.DefaultView

  '

 dv.AllowNew = False

  '

 dv.AllowDelete = False

  '

 'dv.AllowEdit = False

  '

 '设置数据源

  '

 dgdList.DataSource = dtData

  '

 'dgdList.DataMember = "凭证表"

  '

 bmData = Me.BindingContext(DataSet11, "凭证表")

  '

 lblCount.Text = "记录数:" + dtData.Rows.Count.ToString()

  '

 Me.dgdList.AllowNavigation = False

  '

 SetDetailDataGrid(dtData.Rows.Count)

  '

 End Sub

  '

 Public Overrides Sub SetTextBoxState(ByVal bState As Boolean)

  '

 Me.grbAbove.Enabled = Not bState

  '

 Me.grbBottom.Enabled = Not bState

  '

 End Sub

  '

 Public Overrides Sub LoadDataForDetail()

  '

 Dim strSQL As String = "SELECT 凭证编号, 编号, 摘要, a.科目代码, 科目名称,借方, 贷方 FROM 分录表 as a ,科目表 as b where a.科目代码=b.科目代码"

  '

 If dtData.Rows.Count <> 0 Then

  '

 strSQL += " and 凭证编号=" + dtData.Rows(bmData.Position)("凭证编号")

  '

 End If

  '

 Dim db As DataBase = New DataBase

  '

 dtDetail = db.RunSelectSQL(strSQL).Table

  '

 Dim dv As DataView = dtDetail.DefaultView

  '

 dv.AllowEdit = False

  '

 dv.AllowNew = False

  '

 dv.AllowDelete = False

  '

 dgdDetail.DataSource = dv

  '

 End Sub

  '

 Public Overrides Sub SaveForUpdate()

  '

 Try

  '

 InsertDetail(Me.txbCode.Text)

  '

 Dim row As Integer

  '

 row = dgdList.CurrentCell.RowNumber

  '

 dgdList.CurrentCell = _

  '

 New DataGridCell((row + 1) Mod bmData.Count, 0)

  '

 '判断是否有更新的数据

  '

 If Me.DataSet11.HasChanges = True Then

  '

 SqlDataAdapter1.Update(DataSet11)

  '

 End If

  '

 Catch ex As Exception

  '

 MessageBox.Show("数据修改失败!")

  '

 End Try

  '

 End Sub

  '

 Public Overrides Sub Clear()

  '

 ' 计算凭证编号(Primary key)

  '

 Dim strID, strID1, strT, strSQL As String

  '

 strID = strID1 = ""

  '

 strSQL = "select max(凭证编号) as 编号 from 凭证表历史"

  '

 Dim db As DataBase = New DataBase

  '

 Dim dv As DataView

  '

 dv = db.RunSelectSQL(strSQL)

  '

 If dv.Item(0)(0).GetType().ToString() = "System.DBNull" Then

  '

 strID = "000001"

  '

 Else

  '

 strT = "000000"

  '

 strID = (CInt(dv(0)(0)) + 1).ToString

  '

 strID = strT.Substring(0, strT.Length - strID.Length) + strID

  '

 End If

  '

 strSQL = "select max(凭证编号) as 编号 from 凭证表"

  '

 dv = db.RunSelectSQL(strSQL)

  '

 If dv.Item(0)(0).GetType().ToString() = "System.DBNull" Then

  '

 strID1 = "000001"

  '

 Else

  '

 strT = "000000"

  '

 strID1 = (CInt(dv(0)(0)) + 1).ToString

  '

 strID1 = strT.Substring(0, strT.Length - strID1.Length) + strID1

  '

 End If

  '

 If strID < strID1 Then

  '

 strID = strID1

  '

 End If

 '

 txbCode.Text = strID

  '

 Dim dvTemp As DataView = db.RunSelectSQL("select 取值 from 系统参数表 where 参数名称 = '当前会计期间'")

  '

 txbPeriod.Text = dvTemp(0)(0).ToString().Trim

  '

 txbState.Text = "未过"

  '

 txbDebitTotal.Text = "0"

  '

 txbLenderTotal.Text = "0"

  '

 txbDate.Text = Now.Date.ToString("yyyy-M-d")

  '

 dtDetail.Rows.Clear()

  '

 ClearTextBox()

  '

 cbbZiHao.Text = ""

  '

 db.Dispose()

  '

 End Sub

  '

 Public Overrides Sub ResetDataGridData()

  '

 If bmData.Position <> -1 Then

  '

 txbCode.Text = dtData.Rows(bmData.Position)("凭证编号")

  '

 End If

  '

 End Sub

  '

 Public Overrides Sub SaveForAdd()

  '

 Dim dr As DataRow = DataSet11.Tables("凭证表").NewRow()

  '

 Try

  '

 dr("凭证编号") = txbCode.Text.Trim

  '

 dr("凭证字号") = cbbZiHao.Text.Trim

  '

 dr("日期") = txbDate.Text.Trim

  '

 dr("会计期间") = txbPeriod.Text.Trim

  '

 dr("过账状态") = txbState.Text.Trim

  '

 dr("借方合计") = txbDebitTotal.Text.Trim

  '

 dr("贷方合计") = txbLenderTotal.Text.Trim

  '

 If txbDebitTotal.Text.Trim <> txbLenderTotal.Text.Trim Then

  '

 MessageBox.Show("借贷双方不平衡,请检查")

  '

 Exit Sub

  '

 End If

  '

 Catch ex As Exception

  '

 MessageBox.Show("数据格式不正确!")

  '

 Exit Sub

  '

 End Try

  '

 Try

  '

 DataSet11.Tables("凭证表").Rows.Add(dr)

  '

 If Me.DataSet11.HasChanges = True Then

  '

 SqlDataAdapter1.Update(DataSet11)

  '

 End If

  '

 InsertDetail(dr("凭证编号").ToString())

  '

 Catch ex As Exception

  '

 MessageBox.Show("数据添加失败!")

  '

 End Try

  '

 End Sub

  '

 Public Overrides Sub DeleteData()

  '

 Try

  '

 '删除当前行的数据

  '

 DeleteDetail()

  '

 Me.dgdDetail.DataSource = Nothing

  '

 DataSet11.Tables("凭证表"). _

  '

 Rows(bmData.Position).Delete()

  '

 If Me.DataSet11.HasChanges = True Then

  '

 '更新DataSet11

  '

 SqlDataAdapter1.Update(DataSet11)

  '

 End If

  '

 Catch ex As Exception

  '

 MessageBox.Show("数据删除失败!") '

 End Try

  5.8 实现总分类账查询功能 (1) 新建一个窗体,将其name属性改为“frmzongfen”,并为其添加如图4.7所示。的控件。

  图4.7

 frmzongfen窗体

  (2) 各控件的属性设置如图4.8所示。

 表4.8

  frmzongfen窗体控件属性设置 控件类型 对象名 属性 取值(说明) Form Frmzongfen Text 总分类账查询 Groupbox Grbsearch Anchor Top,left Imagelist Imagelist1 Images

 Toolbar Toolbar1 Imagelist Imagelist1 Label Lblcount Text

 Datagrid Dgdlist Anchor Top,bottom,left,right Textbox Txbone Text

 Button Btnsearch Text

 Checkbox Cbbcheck Text 无发生金额的不显示

  (3) 由于总分类帐查询的部分功能与前面介绍的功能相似。为frmzongfen类添加私有函数loaddata。

  Private Sub LoadData()

  Dim strFilter As String

  If Me.txbOne.Text.Trim.Length = 0 Then

  If Me.cbbCheck.Checked = True Then

  strFilter = "where 本期借方合计 <>0 or 本期贷方合计<>0"

  End If

  Else

  strFilter = "where 科目代码=" + Me.txbOne.Text.Trim

  If Me.cbbCheck.Checked = True Then

  strFilter += " and (本期借方合计 <>0 or 本期贷方合计<>0)"

  End If

  End If

  '清空DataSet11

  DataSet11.Clear()

  SqlConnection1.ConnectionString = DataBase.sConn

  SqlDataAdapter1.SelectCommand.CommandText _

  = "select * from 本期汇总账簿

 " + strFilter

  '根据查询条件重新填充DataSet11

  SqlDataAdapter1.Fill(DataSet11)

  dtData = DataSet11.Tables("本期汇总账簿")

  bmData = Me.BindingContext(DataSet11, "本期汇总账簿")

  lblCount.Text = "记录数:" + dtData.Rows.Count.ToString() End Sub

  5.9 实现明细帐查询功能 建立的总分类帐查询是查询科目的汇总信息,明细账查询是查询科目在当前会计期间发生的每一笔业务及余额。 (1) 新建一个窗体,将其name属性改为“frmmingxi”,并为其添加如图4.9所示的控件。

  图4.9

  frmmingxi窗体

  (2) 各控件的属性设置如表5.0所示。

  表5.0

 frmmingxi窗体控件属性设置 控件类型 对象名 属性 取值(说明) Form Frmmingxi Text 明细账查询 Groupbox Grbsearch Anchor Top,left Imagelist Imagelist1 Images

 Toolbar Toolbar1 Imagelist Imagelist1 Label Lblcount Text

 Label Lblcode Text

 Datagrid Dgdlist Anchor Top,bottom,left,right Textbox Txbone Text

 Button Btnsearch Text

 明细帐查询功能与总分类查询功能相似。

 5.10

  实现试算平衡表功能 【试算平衡表】菜单的响应函数,新建该窗体的一个实例并显示出来就可以。 Public sub mnpingheng_click(byual sender as system.object,_byval e as system.eventargs) handles mnpingheng。Click If getinstancestate(“frmpingheng”) then Exit sub Dim childfrm as frmpingheng=new frmpingheng Childfrm.Mdiparent=me Childfrm.showdialog() Childfrm.calpingheng(1) End sub

  5.11

  现期末结账功能

 因为期末结账功能是在程序中调用“sf_期末结账”存储过程完成。在程序主窗体的【期末结账】菜单的响应函数中添加相应的处理代码,完成期末结账的功能。具体代码如下。

 Private Sub mnQimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnQimo.Click

  '期末结帐

  Dim dlgResult As DialogResult = _

 MessageBox.Show("结帐后将进入下一会计期间,是否结帐?", _

 "确定", MessageBoxButtons.YesNo)

  If dlgResult <> DialogResult.Yes Then

  Return

  End If

  'Dim db As DataBase = New DataBase

  'Try

  '

 db.RunDelOrInsSQL("begin tran exec sf_期末结帐")

  'Catch ex As Exception

  '

 MessageBox.Show("期末结帐失败")

  '

 db.RunDelOrInsSQL("rollback")

  '

 Return

  'End Try

  'db.RunDelOrInsSQL("commit")

  MessageBox.Show("结帐成功")

  End Sub

 5.12 实现资产负债表报表输入功能 (1) 新建一个窗体,将其name属性改为“frmreport”。并在窗体上面添加一个crystalreportviewer控件(图5.1为最终完成窗体)。

 图5.1

 最终完成的打印窗体

 (2)从工具栏中拖动一个sqldataadapter对象到窗体上,连接mrpbook数据库,添加资产负债表,并选择字段,单击【确定】按钮完成sqldataadapter对象的配置。 (3)在sqldataadapter对象上右击,在弹出的快捷菜单中选择【生成数据集】菜单命令,在弹出的【生成数据集】对话框中单击【确定】按钮。 (4)为类frmreport添加变量。 Private iperiod as into6

 (5)为类frmreport添加公有函数。

 Public Sub New(ByVal period As Int16)

  Me.New()

  iPeriod = period

  End Sub

 (6)为类的load事件添加响应函数。

  Private Sub frmReport_Load(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles MyBase.Load

  Try

  SqlConnection1.ConnectionString = DataBase.sConn

  SqlDataAdapter1.SelectCommand.CommandText = _

  "select * from 资产负债表 where 会计期间 = " + iPeriod.ToString()

  Me.SqlDataAdapter1.Fill(Me.DataSet11)

  Dim obj As ReportDocument = New ReportDocument

  'obj加载Crystal Report的路径要设置好

  obj.Load("Report.rpt")

  '设置报表的数据源

  obj.SetDataSource(Me.DataSet11)

  Me.CrystalReportViewer1.ReportSource = obj

  Catch ex As Exception

  MessageBox.Show(ex.ToString)

  End Try

  End Sub

 (7) 添加菜单响应函数。

  Private Sub mnFuzhai_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnFuzhai.Click

 If GetInstanceState("frmReport") Then

  Exit Sub

  End If

  Dim message, title, defaultValue As String

  Dim myValue As Object

  message = "请输入统计的会计区间"

  title = "输入"

  ' Set title.

 ' 输入统计的会计区间

  'Dim db As DataBase = New DataBase

  'Dim dv As DataView = db.RunSelectSQL("select 取值 from 系统参数表 where 参数名称 = '当前会计期间'")

  'defaultValue = (CInt(dv(0)(0).ToString().Trim) - 1).ToString

  'myValue = InputBox(message, title, defaultValue)

  'Dim strTemp As String

  'Try

  '

 strTemp = CInt(myValue.ToString.Trim)

  'Catch ex As Exception

  '

 MessageBox.Show("请输入合法的会计区间")

  '

 Return

  'End Try

 '计算

  'db.RunDelOrInsSQL("exec sf_计算资产负债表 " + strTemp)

  'db.Dispose()

  '显示

  'Dim childFrm As frmReport = New frmReport(CInt(myValue.ToString.Trim))

  'childFrm.MdiParent = Me

  'childFrm.Show()

  End Sub

 5.13 编译并运行系统

 至此完成整个系统的制作,选择【生成】|【生成解决方案】菜单命令,编译并运行程序。

 6

 系统发布

 系统设计完成后需要打包发布,将应用制作成安装程序。制作安装程序的工具很多,一般Visual Basic.NET开发的应用系统可以使用Visual Basic.NET2003自带的功能进行打包,也可以用Install Shield来完成系统的安装查询。

 7 系统扩展

 财务管理系统可以作为一个独立的系统运行,也可以和其他的应用系统结合起来,实现数据的共享。可以将进销存系统中的进货、销售、应收及应付款等会计分录自动生成凭证,如图5.2所示。

 分销管理系统 销售出库单 采购入库单

 库存核算 库存管理 销售管理 采购系统

 销售发票 材料

 采购发票

 入库单 出库单

 应收账款 总账系统 应付账款

 自动生成凭证

 自动生成凭证

  财务系统

  票据管理 固定资产管理 费用管理

 成本核算

 自用费

  图5.2

 财务管理系统与其他系统的结合 8 小结

 我们可以掌握以下知识和技巧。 l 财务管理系统的需求。 l 利用Visual Baisic .NET进行数据库编程的多种方法。 l Visual Baisic .NET类继承的概念,以及重载父类函数的技巧。 l 利用类继承封装不同应用共同功能的编写方法。 l 利用Visual Baisic .NET编写财务管理系统。 l 财务管理系统的扩展。

 

推荐访问:框架 构建 财务管理系统
上一篇:2019一把手述廉述责报告 [2018-2019年度厅党组书记述责述廉报告]
下一篇:[****集团关于复工复产的方案] 企业复工复产方案

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有