intouch把查询到的历史报警记录写到excel
1.创建一个数据源SQL_Date,数据源的配置如下
2.创建一个绑定表。只要用到sqlconnect去连接数据库,就必须先建立绑定表。
3.写一个quickfunction,名字叫SQLTOEXCEL,内容如下
DIM Counter AS INTEGER;
DIM Cell AS MESSAGE;
DIM Result AS INTEGER;
DIM TotalCount AS INTEGER;
DIM WhereExpr AS MESSAGE;
{连接数据库}
Result=SQLConnect(GMS_SQL_ConnectionId, "DSN=SQL_Date;UID=sa;PWD=123456" );
LogMessage("SQLConnect 返回值:" + StringFromIntg (Result,10));
{查询条件}
WhereExpr= "Area like '%" + FMCS_ALARM_GROUP + "%'" + " And EventStamp >= '" +FMCS_DATETIME0+ "'" + " And EventStamp <= '" +FMCS_DATETIME1+ "'" ;
LogMessage("SQLSelect 的条件是:" + WhereExpr);
{查询}
Result = SQLSelect( GMS_SQL_ConnectionId, "v_AlarmHistory", "abtag", WhereExpr, "" );
TotalCount=SQLNumRows(GMS_SQL_ConnectionId);
LogMessage("共计有记录数 :" + StringFromIntg (TotalCount,10));
IF( TotalCount == 0 ) THEN
RETURN -1 ;
ENDIF;
{用wwpoke函数写到表格里面}
Cell = "r1c1";
WWPoke( "excel", "sheet1", Cell, "时间" );
Cell = "r1c2";
WWPoke( "excel", "sheet1", Cell, "状态" );
Cell = "r1c3";
WWPoke( "excel", "sheet1", Cell, "名称" );
Cell = "r1c4";
WWPoke( "excel", "sheet1", Cell, "值" );
Cell = "r1c5";
WWPoke( "excel", "sheet1", Cell, "报警限" );
Cell = "r1c6";
WWPoke( "excel", "sheet1", Cell, "报警注释" );
Cell = "r1c7";
WWPoke( "excel", "sheet1", Cell, "组" );
Cell = "r1c8";
WWPoke( "excel", "sheet1", Cell, "操作员" );
Cell = "r1c9";
WWPoke( "excel", "sheet1", Cell, "操作员节点" );
Cell = "r1c10";
WWPoke( "excel", "sheet1", Cell, "持续时间" );
{获取第一条记录}
Result = SQLFirst( GMS_SQL_ConnectionId );
IF( Result < 0 ) THEN
LogMessage("SQLFirst 执行返回值 :" + StringFromIntg (Result,10));
RETURN -1 ;
ENDIF;
IF ( CALL WRITETOEXCEL(2) == -1 ) THEN
RETURN -1;
ENDIF;
FOR Counter = 3 TO TotalCount+1
{遍历所有记录}
Result= SQLNext( GMS_SQL_ConnectionId );
IF( Result == -5 ) THEN
EXIT FOR;
ENDIF;
IF ( CALL WRITETOEXCEL(Counter) == -1 ) THEN
EXIT FOR;
ENDIF;
NEXT;
{关闭数据库}
SQLDisconnect(GMS_SQL_ConnectionId);
4.WRITETOEXCEL子函数的内容如下
DIM ROW AS MESSAGE;
DIM Result AS INTEGER;
Row = StringFromIntg( iRow, 10 );
GMS_SQL_Cell = "r" + Row + "c1";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_EventStamp );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c2";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_AlarmState );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c3";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_TagName );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c4";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_Value );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c5";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_CheckValue );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c6";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_Description );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c7";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, GMS_SQL_Area );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c8";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, "" );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
GMS_SQL_Cell = "r" + Row + "c9";
LogMessage("正在写入"+GMS_SQL_Cell);
Result = WWPoke( "excel", "sheet1", GMS_SQL_Cell, "" );
IF( Result == -1 ) THEN
LogMessage(GMS_SQL_Cell+" 数据未成功写入。可能的原因是应用程序未在运行,或是主题或项目不存在。");
RETURN -1;
ENDIF;
IF( Result == 0 ) THEN
LogMessage(GMS_SQL_Cell+" 应用程序正忙,导致数据未成功写入。");
RETURN -1;
ENDIF;
5.测试
在调用SQLTOEXCEL之前需要先新建一个excel表格,用微软的office打开(用wps打开无效),路径和名字任意,其他都默认
然后在一个按钮的脚本里面去调用CALL SQLTOEXCEL()即可
另外由于wwpoke函数执行较慢,导致intouch的for循环的默认5秒钟超时时间会触发,所以需要改大一些比如改成5分钟:修改项目目录下INTOUCH.ini文件的LoopTimeout=300
测试日志如下