加入收藏 | 设为首页 | Life家族 | SCMLife | RMLife | PMLife | SQALife | TESTLife | 企业VIP专区 | 中文化荣誉殿堂

查看完整版本: CQ 查询求助

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
页: [1]
查看完整版本: CQ 查询求助