一、引言
MRPII/ERP(Enterprise Resource Planning)企业资源计划系统,是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。它在企业资源最优配置的前提下,整合企业所有的资源和所有的经营活动,包括供应与销售、生产计划、物料管理、财务会计等主要模块,以达到高效率经营的目标。
VBA (Visual Basic For Application),一种通用的自动化语言。VBA必须寄生于已有的应用程序(如Excel)。
我公司推行的MRPII/ERP是我公司的重点工程,该项目从立项到实施受到公司领导的高度重视,该项目的实施将增强我公司的企业管理水平和提高企业的竞争力。我们引进的是荷兰BAAN公司 的软件,由于它立足于制造业,特别适合我公司,但它的报表系统是以欧洲的商业需求作为模型,它与中国传统的报表系统具有很大的区别。因此,在实施过程中报表客户化工作显得尤其迫切。由于BAAN提供的报表开发工具在开发某些特殊要求的报表时显得有些欠缺,因此,借助第三方开发工具Excel/VBA灵活方便的特点进行报表开发已是势在必行。它的开发将为公司MRPII/ERP系统的成功实施起着巨大的推动作用。
二、方案选择
在充分满足用户对报表的要求前提下,本着安全可靠、界面友好、操作方便等特点对报表进行开发,制定各种解决方案,确定出报表开发最佳的解决方法。
我们采用了三种方案进行比较:
1、借用BAAN的工具子系统进行报表开发。
2、利用BAAN提供的类和应用对象连接数据查询,通过调用第三方开发工具进行处理。我们采用VBA进行开发。
3、通过ODBC或数据库的专用接口联结数据库,再采用第三方开发工具开发。
下面重点讨论一下各种方案的优缺点:
方案一
方案二
方案三
名称
借用BAAN的工具子系统进行报表开发
借用EXCEL/VBA进行二次开发
ODBC进行二次开发
优点
1、方便、灵活、运行速度快、集成度高、界面友好。
2、安全可靠。它的安全直接由BAAN的授权决定。
1、报表格式多样。多栏打印宽度无局限。
2、数据取出后利用EXCEL的方法和功能进行处理。
1、报表格式多样。多栏打印宽度无局限。
2、数据取出后通过第三方工具编码灵活多样。
缺点
报表的宽度有限。对有特殊要求的多栏打印有局限。
1、还要在BAAN中作相关处理,且灵活性差。每个用户都必须重新编码和配置。
2、安全授权要在BAAN中限制,处理速度相对较慢。
1、用户配置繁琐。
2、安全授权要在后台数据库中限制。且ODBC为安全有隐患。
难点
需要熟悉3GL、4GL语言编程和BAAN报表开发工具
熟悉SQL查询、BAAN相关函数的功能和VBA编程。
需要熟悉SQL查询和相应的第三方开发工具的编程方法。
通过以上几个方案的比较,本着安全、快速、高效的原则。我们决定选择第一、二种方案作为本项目的突破点并进行BAAN的报表系统的开发与客户化工作。
三、实现步骤
本文着重介绍一下采用第二种方案解决问题的实现方法。我们采用目前主流编程工具和BAAN系统提供的DLL库函数将有关数据外接于外部开发。利用 Excel的报表功能强大,内置大量函数,用户对EXCEL界面熟悉等特点,使用VBA编程工具内嵌于EXCEL使其自动化,进行方便灵活地编制各种格式的报表。
1、首先,利用BAAN提供的工具查询,使用SQL语句将所需数据从后台数据库查询出来.
2、然后在EXCEL中打开新工作簿,确认其他工作簿已经关闭。选择“工具“à “宏”à “Visual basic 编辑器”(注:“宏”,指一系列EXCEL能够执行的VBA语句。)
3、在VBA编辑器的左面,可以看到“工程资源管理器”窗口。在工程资源管理器窗口的“Thisworkbook"上单击鼠标右键,选择“插入”--- >“模块”,这样就将一个模块添加到应用程序中了。(如果你没有看见“工程资源管理器”窗口,可以按Ctrl+R),在模块中写入一系列实现报表要求的VBA语句。
首先激活Baan系统的应用程序,然后连接Baan 系统中的工具查询,将数据读出,下面是做一张财务现金流量表的一个例子中的典型语句:
Set BaanObject = CreateObject("Baan4.Application") ‘激活Baan系统的应用程序 ThisWorkbook.Sheets("现金流量表(已)").Activate
Worksheets("现金流量表(已)").Range("a:s").Clear
BaanObject.Timeout = 30
On Error GoTo BaanAutomationError
QueryName = "wlxjllb" ' Baan 系统中的工具查询的名称 (物流现金流量表)
TempFunction = "easysql_to_olesql(" & Chr(34) & QueryName & Chr(34) & ", " & Chr(34) & String(800, " ") & Chr(34) & ")"
BaanObject.ParseExecFunction "ottdllsql_query", TempFunction
TempString = BaanObject.FunctionCall
Query = Mid(TempString, 30, Len(TempString) - 29) ' get query result from functioncall string
TempFunction = "olesql_parse(" & Chr(34) & Query & Chr(34) & ")"
BaanObject.ParseExecFunction "ottdllsql_query", TempFunction
QueryId = BaanObject.ReturnValue
If QueryId = 0 Then
MsgBox "Error: " & Query
GoTo BaanAutomationError
End If
Tempsequent = "tfgld106.leac" '科目
sern1 = String(12, " ")
TempFunction2 = "olesql_getstring(" & Chr(34) & Tempsequent & Chr(34) & "," & Chr(34) & sern1 & Chr(34) & ")"
BaanObject.ParseExecFunction "ottdllsql_query", TempFunction2
TempString = BaanObject.FunctionCall
sern1 = Mid(TempString, 35, 12)
Tempsequent = "tfgld106.dbcr" '借贷
sern2 = String(2, " ")
TempFunction3 = "olesql_getstring(" & Chr(34) & Tempsequent & Chr(34) & "," & Chr(34) & sern2 & Chr(34) & ")"
BaanObject.ParseExecFunction "ottdllsql_query", TempFunction3
TempString = BaanObject.FunctionCall
sern2 = Mid(TempString, 35, 1)
将取出的数据使用worksheets()函数,根据报表要求写入相应的单元格中:
例:For i = 1 To 4 '给各单元格赋值
Worksheets("现金流量表(已)").Cells(Row + i, Column) = flowininter(i) - flowoutinter(i)
Worksheets("现金流量表(已)").Cells(Row + i, Column + 1) = flowinouter(i) - flowoutouter(i)
Worksheets("现金流量表(已)").Cells(Row + i, Column + 2) = flowininter(i) - flowoutinter(i) + flowinouter(i) - flowoutouter(i)
Next I
下图是利用第二种方案将Baan 中数据外接后,再利用Eexcel/Vba 开发成的物流现金流量表报表格式:
四、结束语
利用Excel的报表功能强大,内置大量函数,用户对Excel界面熟悉等特点,使用VBA编程工具内嵌于Excel使其自动化,开发出适合我公司需求的计划、生产、财务各种报表30余种,不仅缩短了开发时间、节约了经费,而且保证了系统的安全可靠。