jiangmin 2007-12-27 09:44
CQ 查询求助
老大们~
有个问题想请教一下大家啊~
有什么好的方法可以定义一个查询:查出所有1个礼拜之前的某个状态的CR记录类表的?
比如,某些CR已经分配给工程师超过1个礼拜的时间了,但是还没有解决(closed)
谢谢了 :)
scmtata 2007-12-27 10:12
回复 楼主 的帖子
1. 你所说的这个一礼拜是动态(相对现在的)还是静态的?
2. 你的CQ数据库类型是什么?
jiangmin 2007-12-27 10:46
回复 沙发 的帖子
恩~是动态的(相对现在的)
CQ数据库 是 SQL Server 2000的
听雨屋檐人 2007-12-27 10:58
动态的把提交时间加入筛选选项中,并定义成自行输入!
scmtata 2007-12-27 11:06
回复 板凳 的帖子
select distinct T1.dbid,T1.id,T4.name,T1.headline from Defect T1,statedef T4,history T6 where T1.state = T4.id and (T1.dbid <> 0 and T1.dbid = T6.entity_dbid and 16777224 = T6.entitydef_id and (T6.action_name='Submit')) and (T6.action_timestamp > dateadd(wk,datediff(wk,0,getutcdate()-7),0)) and T4.name <> 'Closed'
我是用的CQ环境,
每个人的数据库表不一样,字段等都不一样的, 你看看;
其实原理都一样的。
[[i] 本帖最后由 scmtata 于 2007-12-27 11:18 编辑 [/i]]
jiangmin 2007-12-27 11:18
回复 地毯 的帖子
老大~
关键是 提交时间submit_date 字段只是记录了 CR创建并Submit的时间,但不是最新状态的时间啊
如:2007-11-8 测试 submit 了一个 CR 给 项目组长
2007-11-9 项目组长将改CR Assign给了 工程师A
而工程师A到今天为止(超过2个礼拜)都还没有解决这个CR(没有close掉)
我想定义一个查询来过滤得到这些记录的列表呀~~
求教 ~啊~
scmtata 2007-12-27 11:27
回复 6# 的帖子
1.不用submit_date这个字段,
2. 直接对history表里进行查询,原理都一样,只是状态和时间不一样,改改就可以了。
3.{qoute}你所说的过滤这些记录{quote}
没弄清楚你到底啥需求???
jiangmin 2007-12-27 11:27
回复 5# 的帖子
谢谢老大的热心啊~
对SQL不熟啊 -_-!!, 我看了下,好像你写的SQL语句取到的也是记录Submit 的时间吧?
要是我想从Assgin给工程师的那天算起呢?
scmtata 2007-12-27 11:31
回复 8# 的帖子
1. 那就是把语句中 Submit 改成 Assign 查询的就是 一周前的Assign的任务了。
2. 我用的这个CQ里单独创建了一个字段叫Submit_date来记录创建的时间。其实这个在history里都有的。只有方便别人看的。
scmtata 2007-12-27 11:33
另外,上面那条语句的是按周来算的,并不是倒数7天的, 如果是倒数7就直接把时间减去7天就可以了
yunshan 2007-12-27 11:39
在客户端或Web端可以定制一个动态的查询达到你目的,不过每次查询你都必须自己选择一个时间点。
根据Assign这个Action过滤时间。
jiangmin 2007-12-27 11:43
恩~
我这边的需求是 每周自动检查CQ库中已经Assgin给工程师但是超过2个礼拜还没有解决的CR,并邮件提醒对应的CR Owner
对CQ不是很熟~所以想请教一下大大们有没有什么好的思路
我这边自己用Perl和CQ_API写了个脚本已经可以实现这个功能了,想看看还有没有什么更好的方法的,我的思路是这样的:
1. 自己用CQ_API定义查询:先取得所有没有close的CR,然后逐个查询每条记录的History, 判断确切指定到工程师的时间A,用Perl确定当前时间的前2个礼拜的时间B,比较A和B的关系,如果A比B早(超过2个礼拜但还未解决),就发邮件提醒工程师
2. 上面的方法的话在定义查询的时候代码写的比较长,也比较麻烦,我想问问有没有什么方法可以在客户端定义这个查询,然后我在API中直接调用这个查询,然后运行脚本,这样就方便多了
劳动者 2007-12-27 11:51
作用1:
其实,我也想过用这个功能发出一个提醒,提醒开发,哥们你在accepted状态停留了1周,尽快完成你的工作。
作用2:
以后可以做统计,统计某个开发人员平均解决bug的时间。从accepted到closed用了多少时间。
scmtata 2007-12-27 11:52
回复 12# 的帖子
1. 之前也想做这个,一直没时间也没什么好的想法,当时想按下面这个贴子,但是不懂vb,看不太懂
[url]http://www.scmlife.com/bbs/viewthread.php?tid=1210&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D2[/url]
2. 你做完整理下发出来,学习学习哈。
scmtata 2007-12-27 11:56
回复 12# 的帖子
{quote}
上面的方法的话在定义查询的时候代码写的比较长,也比较麻烦,我想问问有没有什么方法可以在客户端定义这个查询,然后我在API中直接调用这个查询,然后运行脚本,这样就方便多了
{quote}
CQ脚本里可以直接嵌入SQL,和你在代码里调有查询没啥区别,直接把sql嵌入代码里进行处理就可以了
jiangmin 2007-12-27 12:50
回复 15# 的帖子
好贴啊~~~
看来这个需求还是满普遍的啊~
研究研究前辈写的代码,整个Perl版本的~ 呵呵
SQL不熟啊~有空单独好好学习学习的~
jiangmin 2007-12-27 17:44
研究了下以前 rocky_rup 写的脚本,VB也不熟。。。有几个疑惑的地方想请教下啊
在设置过滤条件这一段中:
过滤条件定义为:
' 当前状态必须是Assigned且历史记录中新状态也为Assigned,用这条记录的状态转换时间(action_timestamp)对比当前时间,过滤出超过两天(包含两天)的处理人邮件
那如果对Assign了多次,修改了多次的记录,这样定义的话不是会搜寻到同一条记录的多个版本了?
如:
action_timestamp user_name action_name old_state new_state
2007-12-13 A Submit NO_Value Submitted
2007-12-13 B Assign Submitted Assigned
2007-12-15 B Modify Assigned Assigned
2007-12-16 B Postpone Assigned Postponed
2007-12-18 B Assign Postponed Assigned
' ##################################
' 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")
[color=Magenta]' 设置过滤条件
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))[/color]
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