intouch把查询到的历史报警记录写到excel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinazz2025/article/details/83112042

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

测试日志如下

猜你喜欢

转载自blog.csdn.net/chinazz2025/article/details/83112042