随着控制系统功能的增强与多系统之间数据共享需求的增大,组态软件与关系数据库之间的通讯也愈加频繁,二者之间的数据共享也变得越来越重要。随着业务需求的逐渐增大,怎样将复杂的通讯与功能实现简单化也成为了众多商家的一个重要竞争点。为方便广大用户,紫金桥组态软件特推出一新的功能组件——ObDataTable,通过该组件,用户可以很简单的实现紫金桥组态软件与关系数据库的数据共享。组件ObDataTable作为中间媒介,将紫金桥组态软件中的自由报表与关系数据库按照一定的关系连接起来。
图1 数据流向关系
对于一些复杂的综合报表,报表中的数据来源或者去向并不统一。比如我们把数据划分为好几个区域,区域A中的数据要存储到表A中,区域B中的数据要存储到表B中等等。按照通常的方法,会通过紫金桥内的SQL函数写一些脚本将数据存到关系库中,但是这样的方法比较复杂,且代码量通常都比较大,编写起来比较麻烦,而现在通过组件ObDataTable将会把工作简单化,下面讲解具体实现方法。
在讲解实现方法时,先介绍一下四个函数:
1、GetFromTable(),此为自由报表函数,函数功能为从ObDataTable中获得数据。
2、SetToTable(),此为自由报表函数,函数功能为将数据放置到ObDataTable中。
3、SQLGetToTable(),此为紫金桥内部SQL函数,函数功能为将数据集中全部数据复制到ObDataTable中。
4、QLInsertFromTable(),此为紫金桥内部SQL函数,函数功能为将ObDataTable中数据插入到数据库中。
图2 报表区域划分说明
如上图所示,该报表划分为三个区域。首先,要在关系库中建立三个表,分别为表A,表B,表C。按照报表中三个区域的规格建立相应的字段,注:关系库表中的字段数,类型要与报表中的完全对应。
其次,编写数据存入与读取脚本。在向关系库插入数据时分为两个步骤:
一、将报表中的数据存入到ObDataTable中。期间调用函数报表函数SetToTable(),该函数能够指定报表中的区域,如选择的为区域A,函数执行过后,区域A中的数据则会全部存入到ObDataTable中。如:#FreeReport1.SetToTable(1,1,7,10,#ObDataTable,0)。函数意为将自由报表FreeReport1的区域1至7列,1至10行的数据全部存入到ObDataTable中。
二、将存入到ObDataTable中的数据写入到关系库的表中。期间调用函数SQLInsertFromTable(),该函数执行过后将会将ObDataTable中的数据写入到关系库中相应的表中。该函数执行之前要调用SQLConnect()函数。如:
int ConnectID;
SQLConnect((ConnectID,”数据源描述”);
SQLInsertFromTable(ConnectID,"表A",#ObDataTable1);
其中ConnectID为执行SQLConnect()之后的数据源表示返回值。数据源描述需要人为的填写。
这两步操作之后,区域A中的数据则会全部写入到关系库表A中。
从关系库中读取数据时同样也分为两个步骤:
一、关系库表中的数据读取到ObDataTable中。期间要调用函数SQLGetToTable(),该函数要与SQLSelect()函数配合使用。首先要将关系库表中符合条件的数据通过SQLSelect()函数查出来,在通过SQLGetToTable()函数写入到ObDataTable中。如:
int ConnectID;
SQLConnect((ConnectID,”数据源描述”);
SQLSelect(ConnectID,"表A","查询条件表达式");
SQLGetToTable(#ObDataTable1);
二、将ObDataTable中的数据写入到自由报表中。期间要调用自由报表函数GetFromTable(),该函数可以将ObDataTable中的数据写入到自由报表中指定的区域。
如:#FreeReport1.GetFromTable(1,1,#ObDataTable1,0);函数意为将ObDataTable中的数据写入到自由报表从第一行,第一列开始的区域中。
这两步操作过后,关系库表A中符合查询条件的数据则会写入到自由报表区域A中。区域B,区域C的同理。
ObDataTable的出现,使紫金桥组态软件与关系库的通讯不在像以往那样繁琐,且功能实现简单,用户通过少量的脚本即可实现预想的功能,避免了大量的编写脚本时存在的潜在错误,方便广大用户操作使用。