加入收藏 | 设为首页 | Life家族 | SCMLife | RMLife | PMLife | SQALife | TESTLife | 企业VIP专区 | 中文化荣誉殿堂
 
 11 12
发新话题
打印

[原创] 在hook代码中加速记录状态的改变( 此文章被查看:1376次,被回复:10篇!! )

在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做了试验,别的地方没有去试, 感兴趣的朋友可以再去试验一下。

唯一的缺憾是状态的变更必须在状态转换矩阵的框架之下,所以在应用中所起的作用好像不是太大

[ 本帖最后由 thehenry 于 2007-8-6 14:46 编辑 ]
本帖最近评分记录
  • yunshan 金钱 +10 鼓励原创! 2007-8-6 19:35



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

TOP

"必须在状态转换矩阵的框架之下"
这句话到底怎么理解??
如正常流程: submited -> closed ->opened,那么你绝不能在submited状态下调用open操作
有点糊涂,没看明白

如果正常流程:
submited -> opened ->closed
能通过你以上的代码在submit的同时,将状态加速到closed么??
我现在就是这样实验的,
在执行这里的时候,$sessionObj->EditEntity($entityobj,"Assign");
总是提示错误,哪里理解错了么??

附件

cq-006.gif (8.94 KB)

2007-9-29 16:02

cq-006.gif




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

TOP

1.状态矩阵要求是说你的代码中调用的状态迁移是被定义过的,即状态的顺序符合迁移矩阵。否则状态加速就会失败。



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

TOP

如果正常流程:
submited -> opened ->closed
我在submited的Notification中应用
$sessionObj->EditEntity($entityobj,"Close");
这是合法还是不合法??

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

TOP

我当前测试的结果是不合法,只能加速一级。

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

TOP

引用:
原帖由 fish 于 2007-9-29 16:44 发表
我当前测试的结果是不合法,只能加速一级。
能详细说一下,你做到的加速一级具体是怎么加速的吗??

我怎么觉得“submited ->closed”,也只越过了“opened ”一级啊,怎么就不合法了呢??
感觉我好像哪里理解有偏差,可我又不知道我到底哪里想岔了,很是疑惑~~请指点!!

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

TOP

回复 #2 lingd 的帖子

你的操作被revert了,我想可能是你在validate时出错了,最好msgbox一下validate的结果

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

TOP

回复 #2 lingd 的帖子

"必须在状态转换矩阵的框架之下"
这句话到底怎么理解??
如正常流程: submited -> closed ->opened,那么你绝不能在submited状态下调用open操作
有点糊涂,没看明白

如果你想从submited下转到opened状态,那么必须满足一个条件
具有从closed到opened的action或者具有从submited到opened的action

我们现在讨论的加速,应该
具有从closed到opened的action,这样,在从submited到closed action的notification中再将状态转换到opened

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

TOP

总算是搞定了,原来是自己改写成perl时,一些变量弄错了

楼主的帖子很好,刚好我一直想做这样的功能
多谢各位的帮助!!

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

TOP

有一点疑问

关于这一句    e.SetFieldValue "Resolution","重复"   
我在测试您的hook时,一直没能成功,后来请教了IBM,人家说
SetFieldValue ()这个方法是不能在 Validation Hook和Notification Hook里面使用的
我试了一下,他说的的确没错

所以我想问一下楼主:
e.SetFieldValue 这个您是怎么成功应用的?
谢谢

© 本文为 没有蛀牙 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员
i生活,i音乐!

TOP

 11 12
发新话题