首页  >> 配置管理  >> IBM Rational ClearQuest / ClearDDTS/TestManager
【CQ需求实现】实现cq时间预警机制的脚本
作者 rocky_rup   查看 3379   发表时间 2006/11/21 13:57  【论坛浏览】
脚本使用方法:
1.将以下脚本代码copy保存至一个文本文件
2.将文本文件后缀名“txt”改为“vbs”
3.将“vbs”文件设置为计划任务,自动运行

声明:
1.以下代码在win2ksrv、CQ2003的环境下测试成功
2.CQ客户端需预先设置好邮件相关选项,详情参看CQ帮助

  代码:

' ##################################
' CQ自动预警邮件脚本
' rocky_rup 创建此脚本
' ##################################
' 功能说明:
' 本脚本以CQ2003默认schema(DefectTracking)为例,
' 对被分配(assign)超过两天的未被处理的故障,实现
' 自动邮件提醒那些处理人(Owner)去处理分配给他的
' 故障
' ##################################
' 使用说明:
' 需将本脚本设置为计划任务定时(如凌晨2点)执行,
' 要求执行脚本的机器上已经安装有CQ
' ##################################


Const booOp_and = 1 ' and
Const comOp_eq = 1 ' =
Const comOp_le = 4 ' <=
Const SUCCESS = 1 ' 存在下一个记录

' 以下常量根据实用应用环境设置
Const inte_date = -2 ' 超过天数
Const worn_sta = "Assigned" ' 预警状态
Const login_name = "admin" ' 管理员登录名
Const password = ""
Const db_name = "db" ' 要访问的数据库名


set sessionObj = CreateObject("CLEARQUEST.SESSION")

' 请确保你的帐号能够访问目标数据库,下面的注释是UserLogon的函数原型
' session.UserLogon login_name, password, database_name, session_type, database_set
sessionObj.UserLogon login_name, password, db_name, AD_PRIVATE_SESSION, ""

' 建立类型记录查询
Set querydef = sessionObj.BuildQuery("defect")

' 若邮件内容还需要其他该记录的字段,则在这里添加
querydef.BuildField("ID")
querydef.BuildField("Owner.email")
' 设置过滤条件
Set operator = querydef.BuildFilterOperator(booOp_and)

' 当前状态必须是Assigned且历史记录中新状态也为Assigned,
' 用这条记录的状态转换时间(action_timestamp)对比当前时
' 间,过滤出超过两天(包含两天)的处理人邮件
operator.BuildFilter "State", comOp_eq, worn_sta
operator.BuildFilter "history.new_state", comOp_eq, worn_sta

' 注意,最后一个参数必须是字符串,不能直接用日期否则sql语句解析无效
operator.BuildFilter "history.action_timestamp", comOp_le, CStr(DateAdd("d",inte_date, Now))

Set resultSetObj = sessionObj.BuildResultSet(querydef)
resultSetObj.Execute

Set OleMailMsg = CreateObject("PAINET.MAILMSG")

' 注意,判断是否有记录时不能用AD_SUCCESS,因为这是独立运行的脚本,对常量不能正确识别
Do While resultSetObj.MoveNext = SUCCESS

' 添加邮件地址
OleMailMsg.AddTo resultSetObj.GetColumnValue(2)

' 设定邮件标题
OleMailMsg.SetSubject "CQ有情提示"

' 设定邮件内容
OleMailMsg.SetBody "ID为" _
& resultSetObj.GetColumnValue(1) _
& "的故障已经分配给您超过" _
& CStr(Abs(inte_date)) _
& "天,请立即处理,谢谢!"

' 发送邮件
OleMailMsg.Deliver
Loop


[ 本帖最后由 rocky_rup 于 2006-11-21 13:59 编辑 ]

序号 评论者 共有评论 15   【论坛浏览】  【发表评论】 评论时间
1 selina 谢谢楼主
好东西
2006/11/22 08:46
2 刘刘 好东西:1:: 2006/11/22 12:56
3 joliu1019 好东西。。正在研究邮件。。谢谢楼主 2007/1/21 18:45
4 ty1227 先学习了!感谢楼主!! 2007/1/22 08:40
5 自在飞 好东东。感谢楼主。学习了。。。 2007/1/22 10:17
6 ljs53 不知道为什么
这样写了以后
我总是收到很多邮件
不只是Owner自己收到,别人都可以收到
附上我写的代码

Const booOp_and = 1 ' and
Const comOp_eq = 1 ' =
Const comOp_le = 4 ' <=
Const SUCCESS = 1 ' 存在下一个记录

' 以下常量根据实用应用环境设置
Const inte_date = 0 ' 超过天数
Const worn_sta = "Submitted" ' 预警状态
Const login_name = "admin" ' 管理员登录名
Const password = ""
Const db_name = "Test" ' 要访问的数据库名


set sessionObj = CreateObject("CLEARQUEST.SESSION")

' 请确保你的帐号能够访问目标数据库,下面的注释是UserLogon的函数原型
' session.UserLogon login_name, password, database_name, session_type, database_set
sessionObj.UserLogon "admin", "", "test", AD_PRIVATE_SESSION, "Test"

' 建立类型记录查询
Set querydef = sessionObj.BuildQuery("Review_Info")

' 若邮件内容还需要其他该记录的字段,则在这里添加
querydef.BuildField("ID")
querydef.BuildField("Author.email")
' 设置过滤条件
Set operator = querydef.BuildFilterOperator(booOp_and)
' 当前状态必须是Submitted且历史记录中新状态也为Submitted,
' 用这条记录的状态转换时间(action_timestamp)对比当前时
' 间,过滤出超过两天(包含两天)的处理人邮件
operator.BuildFilter "State", comOp_eq, worn_sta
operator.BuildFilter "history.new_state", comOp_eq, worn_sta
' operator.BuildFilter "Submitter", comOp_eq, "admin"

' 注意,最后一个参数必须是字符串,不能直接用日期否则sql语句解析无效
operator.BuildFilter "history.action_timestamp", comOp_le, CStr(DateAdd("d",inte_date, Now))

Set resultset = sessionObj.BuildResultSet(querydef)
resultset.EnableRecordCount
resultset.Execute
msgbox resultset.RecordCount
msgbox CStr(Abs(inte_date))
Set OleMailMsg = CreateObject("PAINET.MAILMSG")
' Dim i = 1
' 注意,判断是否有记录时不能用AD_SUCCESS,因为这是独立运行的脚本,对常量不能正确识别
Do While resultset.MoveNext = SUCCESS
' move to the first record
' resultset.MoveNext
' 添加邮件地址
OleMailMsg.AddTo resultset.GetColumnValue(2)

' 设定邮件标题
OleMailMsg.SetSubject "CQ提示"

' 设定邮件内容
OleMailMsg.SetBody "ID为" _
& resultset.GetColumnValue(1) _
& "的故障已经分配给您超过" _
& CStr(Abs(inte_date)) _
& "天,请立即处理,谢谢!"

' 发送邮件
OleMailMsg.Deliver
Loop
msgbox "邮件发送成功"
2007/8/9 09:10
7 yunshan 你的Author.email是做什么的,我知道是Review_Info这个记录类型下的一个字段,能详细解释一下吗? 2007/8/9 09:21
8 ljs53 回复 #8 yunshan 的帖子
Author是一个Reference 字段,Reference to user
所以Author.email是所有用户的邮件地址
2007/8/9 12:39
9 qiouxinyu 把代码做一个小小的修改,可以解决楼上的问题:

我将代码进行了重组,给每个人只发一封邮件,邮件中列出所有的Bug单,并且只能看到自己的Bug单,代码如下:

'--------------------------------------------------------------------------------------------
Const booOp_and = 1 ' and
Const comOp_eq = 1 ' =
Const comOp_le = 4 ' <=
Const SUCCESS = 1 ' 存在下一个记录

' 以下常量根据实用应用环境设置
Const inte_date = -2 ' 超过天数
Const worn_sta = "Assigned" ' 预警状态
Const login_name = "admin" ' 管理员登录名
Const password = ""
Const db_name = "EnPdb" ' 要访问的数据库名
Dim arOwner() '用户记录数组
set sessionObj = CreateObject("CLEARQUEST.SESSION")
'访问客户数据库
sessionObj.UserLogon login_name, password, db_name, AD_PRIVATE_SESSION, ""
' 建立类型记录查询
'Set querydef = sessionObj.BuildQuery("defect")
'querydef.SQL "select owner,count(id) from defect where state=16777633 group by owner having count(id)>0"
'获取查询结果集
sqlString = "select users.login_name,count(defect.id) from defect inner join users on defect.owner = users.dbid where defect.state = 16777633 group by users.login_name having count(defect.id)>0"
set resultSetObj = sessionObj.BuildSQLQuery(sqlString)
'Set resultSetObj = sessionObj.BuildResultSet(querydef)
resultSetObj.EnableRecordCount
resultSetObj.Execute
'-------------------------------------------------------------------------------------------
'MsgBox resultSetObj.RecordCount
'-------------------------------------------------------------------------------------------
'获取用户列表
ReDim arOwner(resultSetObj.RecordCount)
Dim i,count
i=1
count = resultSetObj.RecordCount
Do While resultSetObj.MoveNext = SUCCESS
arOwner(i) = resultSetObj.GetColumnValue(1)
'MsgBox arOwner(i)
i=i+1
loop
'-------------------------------------------------------------------------------------------
'创建邮件对象
Set OleMailMsg = CreateObject("PAINET.MAILMSG")
'-------------------------------------------------------------------------------------------
'针对每个用户,取出其Defect记录
i=1
Do While i<=count
' 设置过滤条件
Set querydef = sessionObj.BuildQuery("defect")
querydef.BuildField("ID")
querydef.BuildField("Owner.email")
Set operator = querydef.BuildFilterOperator(booOp_and)
operator.BuildFilter "State", comOp_eq, worn_sta
operator.BuildFilter "Owner", comOp_eq, arOwner(i)
operator.BuildFilter "history.new_state", comOp_eq, worn_sta
'operator.BuildFilter "history.action_timestamp", comOp_le, CStr(DateAdd("d",inte_date, Now))
'获取查询结果集
Set resultSetObj = sessionObj.BuildResultSet(querydef)
resultSetObj.EnableRecordCount
resultSetObj.Execute
'-------------------------------------------------------------------------------------------
'开始取查询数据
Dim emailAddr,emailBody
If resultSetObj.MoveNext = SUCCESS Then
'首先取出用户邮件地址及本条记录的defect编号
'Convert.IsDBNull(dr("b02"))
emailAddr = resultSetObj.GetColumnValue(2)
If (emailAddr="") Then '用户邮件信息未录入
emailAddr = "liuweifeng@yulong.com"
emailBody = "用户"&arOwner(i)&"的邮箱信息为空,请告知他目前被指派了编号如下的Defect:"&Chr(10)&resultSetObj.GetColumnValue(1)
Else '如果用户邮箱为空,则将信息转发到管理员处
emailAddr = resultSetObj.GetColumnValue(2)
emailBody = "以下编号的Defect指派给您了,编号依次为:"&Chr(10)&resultSetObj.GetColumnValue(1)
End If
End If
'取出该用户的剩下的defect编号,并发送邮件
Do While resultSetObj.MoveNext = SUCCESS
emailBody = emailBody&Chr(10)&resultSetObj.GetColumnValue(1)
Loop
'开始发送邮件
'Dim myDateTime
'myDateTime = Now()
emailBody = emailBody & Chr(10) & "以上Defect已经被指派超过" & CStr(Abs(inte_date)) & "天,请立即处理,谢谢!"
OleMailMsg.AddTo emailAddr
'OleMailMsg.AddTo "luzhibing@yulong.com"
OleMailMsg.SetFrom "cqadmin@yulong.com"
OleMailMsg.SetSubject "CQ友情提示"&"-"&year(date())&Right("00"&month(Date()),2)&Right("00"&Day(Date()),2)'Format(Date,"yyyymmdd") '考虑标题加上日期
OleMailMsg.SetBody emailBody
OleMailMsg.Deliver
OleMailMsg.ClearAll
'-------------------------------------------------------------------------------------------
'下一个用户
i=i+1
loop
'-------------------------------------------------------------------------------------------
2007/9/4 11:37
10 ty1227 回复 #10 qiouxinyu 的帖子
你这段代码只是实现了将属于一个人的缺陷发到一个人吧?
如果A有 缺陷 a1,a2,a3.........
B有 缺陷 b1,b2,b3....
C有 缺陷 c1, c2,c3........

这段代码能实现 将缺陷 a1, a2,a3.......发给A ,且在一封邮件
将缺陷 b1,b2,b3......发给B ,且在一封邮件
将缺陷 c1,c2,c3.......发给C ,且在一封邮件

?????????
2007/9/4 15:11
 共有评论数 15  每页显示 10
页码 1/2  |<  <<   1 2   >>  >|