在论坛
http://bbs.scmlife.com/thread-6092-1-1.html 看到了一个可以利用脚本在一些特殊情况下,自动执行某一个Action的内容,原帖内容如下 :
=========================================================================================
在hook代码中加速记录状态的改变
经过多次的试验终于搞定了这个问题
个人感觉这其中有两个地方需要注意,1:是用来修改记录的用户会话,2:状态转换矩阵
1:在hook中更改记录的状态是需要通过 sessionObj.UserLogon适时地切换一下用户会话,否则cq始终都会认为该条记录已经被锁定,那么你的这次操作将无法成功
2:更改状态的操作一定要在状态转换矩阵的框架之下,如正常流程: submited -> closed ->opened,那么你绝不能在submited状态下调用open操作,这种调用将无法成功
我们以CQ自带的Defect为例,比如我想在用户提交某种类型的defect时让他的状态直接变化为closed状态,那么就可以用如下方法:
在submit操作的通知hook中加入一下代码:
Dim hl
hl = GetFieldValue("Headline").GetValue
'如果临时defect则直接close
if hl = "临时defect" then
Set s = GetSession
Dim dbidValue
dbidValue = GetDisplayName
Dim e,s
'切换用户会话,
'cqt为用户数据库名
'cqs为模式库名或者连接名
s.UserLogon "admin","admin","cqt",AD_PRIVATE_SESSION,"cqs"
Set e = s.GetEntity("Defect",dbidValue)
s.EditEntity e, "Close"
'Defect被close必须填写resolution内容
e.SetFieldValue "Resolution","重复"
e.Validate
e.Commit
end if
经过多次测试终于通过,我只在通知hook做了试验,别的地方没有去试, 感兴趣的朋友可以再去试验一下。
唯一的缺憾是状态的变更必须在状态转换矩阵的框架之下,所以在应用中所起的作用好像不是太大
===========================================================================================
我试着做了下,当时是成功的 ,脚本确实执行了"Close"这个动作 。
但今天在正式修改了Schema之后 (此段脚本未修改),却保错 :
失败的原因是:
失败状况:GetState() == AD_VALIDATED
位置:ClearQuest Core adeditaction.cpp:715
GetState( ) =PREPARED
还请各位高手看看有何解决办法 ,谢谢 !
[
本帖最后由 Vince 于 2008-4-17 19:42 编辑 ]