发新话题
打印

[已解决] [紧急求助] 关于CQ利用脚本执行一个Action的问题( 此文章被查看:260次,被回复:2篇!! )

本主题由 Vince 于 2008-4-18 11:36 关闭

[紧急求助] 关于CQ利用脚本执行一个Action的问题

在论坛 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 编辑 ]


问题已经解决 [打开主题]
本主题的最佳答案为 [ 2 楼].

附件

cqerror.JPG (18.91 KB)

2008-4-17 19:42

CQ报错情况

cqerror.JPG




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

TOP

错误的原因是你的代码有问题,代码写的本来就不完善,问题出现在下面几句上:
  s.EditEntity e, "Close"                                                                  
  e.SetFieldValue "Resolution","重复"                             
  e.Validate                                                      
  e.Commit

可以去查查CQ API,里面有很多很多的例子。
e.Validate是有返回值的,如果不对这个返回值判断,如果Validate失败就会出现你所贴出来的错误。
正确的做法如下:
status = e.Validate
if status = "" then
   e.Commit
else
   e.Revert
   ' 在这里可以将验证失败的错误信息打印出来
    ' msgbox status
End If


最佳答案
该回答被楼主/管理员列为正解!



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

TOP

非常感谢 !!
  有了打印的错误信息之后 ,很容易就找出了问题所在 !
  原来我在执行close操作的时候 ,对某个必须填写的字段进行了清空 。原本是期望手动执行的时候,重新选择该字段的值 ,但没考虑到是这个导致了close操作出错 !



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

TOP

发新话题