VBScript/ASP筛选指定TaskName的DCR任务数据问题求助
问题定位
现有代码无法实现指定过滤效果的核心原因:
- 你虽然提前定义了存储目标任务名的
ReportArrayNames数组,但全程没有实际调用:既没有在SQL查询阶段加入TaskName的筛选规则,也没有在遍历输出数据集时做值匹配校验,所有查询返回的记录都会被直接输出到页面 - 原代码存在HTML语法错误:表格起始标签多写了一个右括号,会导致页面样式渲染异常
修复方案
方案1:SQL层直接过滤(推荐,性能最优)
直接在数据库查询阶段过滤掉不符合要求的记录,不需要把无关数据加载到ASP脚本层,查询效率最高,同时可以直接复用你已经定义的ReportArrayNames数组,后续调整显示的任务类型只需要改数组内容即可。
修改步骤:
- 先修复原代码的HTML标签错误,把主代码里的表格输出行
改为Response.Write "<table class=""GeneralTable"")"Response.Write "<table class=""GeneralTable"">" - 修改
WriteAgedItems子过程内的SQL拼接逻辑,在WHERE条件分支后追加TaskName过滤规则,修改后的SQL拼接部分代码如下:' 自动拼接数组值生成SQL IN子句,复用已定义的ReportArrayNames数组 Dim taskInClause taskInClause = "('" & Join(ReportArrayNames, "','") & "')" If AgeEnd = 0 Then SQL = SQL & " Where FlowInstances.FlowDefinitionID=" & FlowID & " AND FlowInstances.FlowComplete=0 And DateDiff(d,FlowInstances.CurrentTaskStartDate, GetDate())>=" & AgeStart & " And DR.Department<>'END'" Else SQL = SQL & " Where FlowInstances.FlowDefinitionID=" & FlowID & " AND FlowInstances.FlowComplete=0 And DateDiff(d,FlowInstances.CurrentTaskStartDate, GetDate())>=" & AgeStart & " And DateDiff(d,FlowInstances.CurrentTaskStartDate, GetDate()) <= " & AgeEnd End If ' 追加任务名过滤条件 SQL = SQL & " AND Tasks.TaskName IN " & taskInClause SQL = SQL & " Order by Dr.Department ASC, CurrentTaskStartDate DESC"
改完后查询只会返回DCR - Designer和DCR - Checker两类任务的记录,直接输出即可,不需要额外在循环里加判断。
方案2:ASP脚本层过滤(适合需要保留全量查询结果做额外统计的场景)
如果你需要查询所有任务的记录做其他统计计算,只在页面输出阶段过滤目标任务,可以在遍历记录集的循环中加匹配判断,只有TaskName符合要求的记录才输出、计入统计数。
修改步骤:
- 同样先修复上述的HTML表格标签错误
- 修改
WriteAgedItems子过程内的记录遍历循环部分,代码如下:Do Until RSItems.Eof Dim isMatch, currentTask, arrItem isMatch = False ' 取出当前记录的任务名,去除首尾空格,同时处理Null值情况 currentTask = Trim(RSItems("TaskName") & "") ' 遍历目标任务名数组做匹配 For Each arrItem In ReportArrayNames If currentTask = Trim(arrItem) Then isMatch = True Exit For End If Next ' 匹配成功才输出表格行、累加计数 If isMatch Then Response.Write "<TR>" Response.Write "<TD>" & RSItems("EAR_NO") & "</TD>" Response.Write "<TD>" & RSItems("TDC_PN") & "</TD>" Response.Write "<TD>" & RSItems("Initiator") & "</TD>" Response.Write "<TD> </TD>" Response.Write "<TD> </TD>" Response.Write "<TD> </TD>" Response.Write "<TD> </TD>" Response.Write "<TD> </TD>" Response.Write "<TD> </TD>" Response.Write "<TD>" & RSItems("TaskName") & "</TD>" Response.Write "</TR>" RecCount = RecCount + 1 End If RSItems.MoveNext Loop
注意:如果运行时提示
ReportArrayNames变量未定义,要么把该数组的定义移到WriteAgedItems子过程内部,要么把数组作为参数传入子过程,避免VBScript变量作用域导致的读取失败问题。
内容的提问来源于stack exchange,提问作者saguiar2
相关产品推荐
相关产品推荐

