16 12
发新话题
打印

[原创] 【CQ需求实现】实现cq时间预警机制的脚本( 此文章被查看:2905次,被回复:15篇!! )

【CQ需求实现】实现cq时间预警机制的脚本

脚本使用方法:
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 编辑 ]
本帖最近评分记录



© 本文为 rocky_rupSCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员
以上言论仅供参考

TOP

谢谢楼主
好东西



© 本文为 selinaSCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员
我选择,我喜欢

TOP

好东西



© 本文为 刘刘SCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员
i am on my way ....

TOP

好东西。。正在研究邮件。。谢谢楼主

© 本文为 joliu1019 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

先学习了!感谢楼主!!

© 本文为 ty1227 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

好东东。感谢楼主。学习了。。。

© 本文为 自在飞 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

不知道为什么
这样写了以后
我总是收到很多邮件
不只是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 "邮件发送成功"

© 本文为 ljs53 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

你的Author.email是做什么的,我知道是Review_Info这个记录类型下的一个字段,能详细解释一下吗?

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #8 yunshan 的帖子

Author是一个Reference 字段,Reference to user
所以Author.email是所有用户的邮件地址

© 本文为 ljs53 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

把代码做一个小小的修改,可以解决楼上的问题:

我将代码进行了重组,给每个人只发一封邮件,邮件中列出所有的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
'-------------------------------------------------------------------------------------------

© 本文为 qiouxinyu 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

 16 12
发新话题