证券公司法人清算系统解决方案
摘 要:本文以证券公司法人清算业务为背景,把多个office应用程序的特性集成到一个解决方案中,从而提高和促进了用户的生产效率。
关键词:access、excel、outlook、automation、vba、dao
1、引言
每一个microsoft office应用程序都包含了一组旨在帮助开发人员完成一组相关任务的强大工具。例如:microsoft access提供了强大的数据管理以及查询能力;microsoft excel提供了数学分析以及报告工具;microsoft outlook提供了发送和接受电子函件、计划、合同以及任务管理;而microsoft word支持用户创建和维护文档,跟踪不同用户间的文档版本、创建窗体和模板等。以上应用使单个office应用程序具备可编程能力以及使得创建集成office解决方案成为可能的关键技术是称之为automation的组件对象模型(com)技术。automation允许开发人员使用visual basic for application(vba)代码创建和控制由支持相应编程接口的应用程序、动态链接库、activex控件提供的软件对象。vba和automation支持编写独立的office应用程序。例如:可以在access中创建一个隐藏的excel实例,用它对access数据完成数学运算和分析操作。
2、法人清算系统概述
上海证券*登记结算公司在*交收*下实行会员法人结算制度。wWW.11665.cOm上海证券交易所的会员单位均以法人名义在登记公司开立结算帐户,统一办理其所有下属机构在上海证券交易所进行的证券交易的清算交收业务。
证券公司(法人)财务部每天上午通过沪、深法人专用平台拨号上网接收法人清算数据文件。清算文件包含有该公司下属交易席位各项交易费用明细。需要分类汇总:先统计出各席位各项费用,再统计出各营业部费用,最后汇总出公司各项费用。对账、打印、传真给下属营业部,供其对账。根据统计费用,划拨金额,以保障公司备付金。
现在证券公司通过兼并重组,规模日趋庞大,下属营业部少则十几家,多则几十,甚至上百家,所以上述流程由人工处理完成已越来越无法胜任。
综合运用office应用程序,上述工作得以快捷、准确完成,使以前几个人花费近一上午的工作在十几分钟就可以完成。
法人清算系统业务流程见附图。
3、法人清算系统的设计结构
系统主要由三部分组成:准备数据、处理数据、发送数据。
3.1 准备数据
沪深清算文件为压缩文件,接收完毕后由系统自动完成更名、解压,生成dbf文件,同时完成数据备份工作。
3.2 处理数据
系统主要部分,选用access为主程序,功能包括:
● 数据导入,生成当日所需明细数据表
● 当日划拨
● 各类明细、汇总报表
● 生成下属营业部所需数据文件,为excel文件
● 生成邮件,准备发往各营业部
对于开发运行小型商务系统的应用程序来说,access是一个较好的平台,它的向导有助于开发人员轻松地快速构造出应用程序的框架;由于它支持代码模块,因此,开发人员很容易建立可重用函数的代码库;又由于它支持在窗体和报表之后添加代码,因此它具有强大的窗体和报表自定义功能。
之所以选用excel文件为下发文件格式,因为下发数据包括深、沪明细数据和各类汇总数据,可作为工作簿中各工作表,格式清晰,且各营业部可再次利用excel工具处理,得到想要各类数据。
3.3 发送数据
启动outlook,发送邮件。
4、法人清算系统的关键技术
4.1 用代码导入外部数据
access的docmd对象提供了三种导入外部数据的方法,它们是:
transferdatabase、transfertext和transferspreadsheet
下面的示例使用docmd对象的transferdatabase方法从数据库导入数据:
sub importdatabase()
docmd.transferdatabase _
transfertype:=acimport,_ '执行转换的类型
databasetype:="dbase iii",_ '导入数据库的类型
databasename:=apppath,_ '数据库的名称
objecttype:=actable,_ '导入对象的类型
source:="customer",_ '导入源对象的名称
destination:="tblcustomer",_ '导入目标对象的名称
structureonly:=false '只导入表的结构,还是结构、数据都导入
end sub
4.2 数据访问技术
本系统选用dao(data access objects)技术。
dao代码可以创建、修改和删除jet引擎对象,使用它可以完成以下工作:
● 分析已存在的数据库结构
● 增加或修改表和查询
● 创建新数据库
● 通过修改查询所基于的sql来改变查询定义
● 遍历记录集
● 修改表数据
4.3 展示数据
在office解决方案中有许多不同的展示数据的方法,如何建构报表依赖于解决方案是如何设计的以及数据存储在什么地方。本系统解决方案以access为基础,用户可以通过access窗体和数据访问页面操作数据;同时若需要在excel中观察和操作数据,以便以最大的灵活性来创建定制报表,可以把数据从access中导入到excel。
在access运行的代码里使用automation创建excel的查询表querytable或pivottable报表。使用automation可以使用户对从数据库到excel转换数据的过程进行更多的控制,还可以使用automation来格式化报表,过滤数据,创建统计图等。用户能够在access中简单地单击一个按钮,就得到excel中已格式化的报表。
下面的示例创建一个新的数据库查询并把数据返回到工作表,建立动态报表。
要在vba中创建一个新的查询表,使用querytables集合的add方法。querytables集合从属于worksheet对象,并且包含了该工作表的所有querytable对象。创建了一个新的查询表后,必须使用querytable对象的refresh方法在查询表中显示数据。
dim dbreset as database
dim rstreset as recordset
dim wksnew as excel.worksheet
dim qtbdata as excel.querytable
......
set rstreset = dbreset.openrecordset("营业部")
set qtbdata = _
wksnew.querytables.add(rstreset, wksnew.range("a4"))
set qtbdata = wksnew.querytables.add( _
connection:=rstreset, _
destination:=wksnew.range("a4"))
with qtbdata
.fieldnames = false
.rownumbers = false
.filladjacentformulas = false
.preserveformatting = true
.refreshonfileopen = false
.backgroundquery = false
.refreshstyle = xlinsertdeletecells
.savepassword = true
.savedata = true
.adjustcolumnwidth = false
.refreshperiod = 0
.preservecolumninfo = true
.refresh backgroundquery:=false
end with
qtbdata.refresh
4.4 使用microsoft outlook对象
可以以三种方式使用outlook的对象模型:
● 编写在本地工程文件或与outlook本地安装相关联的com加载项中运行的vba代码。
● 使用outlook窗体中自带的脚本环境,该窗体用于显示诸如消息和约会这样的项目。
● 通过automation在其它office应用程序或支持vba的其它应用程序中使用outlook。
本系统使用第三种方式。在使用vba访问outlook对象、方法、属性之前,必须首先单击visual basic编辑器的tools菜单项下的reference来设置对microsoft outlook对象库的引用。
下面的示例initializeoutlook过程创建一个新的、隐藏的outlook实例;createmail过程创建一个邮件消息,设置收件人、附件、主题和消息内容,然后发送邮件。
public golapp as outlook.application
public gnspnamespace as outlook.application
function initializeoutlook() as boolean
' this function is used to initialize the global application
on error goto init_err
set golapp = new outlook.application
initializeoutlook = true
init_end:
exit function
init_err:
initializeoutlook = false
resume init_end
end function
function createmail(astrrecip as variant, _
strsubject as string, _
strmessage as string, _
optional astrattachments as variant) as boolean
dim objnewmail as outlook.mailitem
dim blnresolvesuccess as boolean
on error goto createmail_err
if golapp is nothing then
if initializeoutlook = false then
msgbox "unable to initialize outlook application " _
& "or namespace object variables!"
exit function
end if
end if
set golapp = new outlook.application
set objnewmail = golapp.createitem(olmailitem)
with objnewmail
.recipients.add astrrecip
blnresolvesuccess = .recipients.resolveall
.attachments.add astrattachments
.subject = strsubject
.body = strmessage
if blnresolvesuccess then
.send
else
msgbox "unable to resolve all recipients. please check " _
& "the names."
.display
end if
end with
createmail = true
createmail_end:
exit function
createmail_err:
createmail = false
resume createmail_end
end function
4.5 划分数据库对象
把包含表的数据库称为表数据库,而包含其它对象的数据库称为应用程序数据库。通过从应用程序数据库链接到表数据库,就把这两个数据库连接起来了。采用这种策略的理由是:
● 可维护性
● 性能
● 可扩展性
如果已经设计了应用程序,并且在同样的数据库中包括了所有的表和其他数据库对象,可以使用access的数据库拆分向导("工具","数据库实用工具","拆分数据库")来帮助实现数据库的划分。
5、法人清算系统的应用情况
现该系统在大通证券股份有限公司运行良好,极大减轻了财会人员工作强度,同时各种清晰、完善的数据报表加强了公司对于公司及下属营业部财务的监管力度,堵塞了漏洞。
6、法人清算系统的改进
现系统使用microsoft outlook建立及发送邮件,可以改进为通过公司局域网中的邮件服务器发送。