SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 14671|回复: 8

[推荐] 【CQ需求实现】8. 使用按钮来克隆缺陷记录

[复制链接]
发表于 2006-9-7 17:48:32 | 显示全部楼层 |阅读模式
1、在Recrod type的Action submit动作Initialization中编写下面的脚本
1 P& S; o; |( o8 r$ XSub Defect_Initialization(actionname, actiontype)
6 I$ g  p" h7 s7 _; {  w* k2 I  ' actionname As String% ^  D  p1 M, f' s( }+ \6 E
  ' actiontype As Long, E5 c; [, c* P2 a) j) S  c
  ' action is Submit" u) W, Q+ @/ `; }  ^
  ' record type name is Defect
1 z4 S. e, u3 P& d3 xrem This is record cloning code
3 ~5 J. ~) H7 W/ V0 _
+ {, G4 z) M8 Q0 UDim sessionObj
2 S* r9 H' \2 N# _4 g6 Y+ K3 Q. FDim entityDefObj' v4 z' d. |, h  e4 l$ _- [. M9 a
Dim nameList
( A0 r2 [$ F4 zDim fieldName
( ]9 H1 u3 D' [8 O/ d/ s& LDim errString
7 }  ^" {$ Y& x) I7 n( u2 PDim fieldType
; `" R6 [5 B  p) G0 L/ \" ^Dim refList0 ~% ^; |/ I, y
Dim i
7 f' Y3 N) |& J0 o$ R, ~( o  b& O4 ]3 O) Q4 S& a: a+ u
Dim entityDefName
" N5 i8 m5 ^: V* U4 R: H1 ^5 rDim pID
* v4 i7 W' g2 n# L) q9 p; n
& w1 _6 m! i, z( |' Declare the local constants. This script is long enough that I might do it in VB where I could have; Y  [- p8 u# a' v7 t, r6 |; F  n
' a different module contain these variables. BTW, There is a source file on the distribution clearquest.bas* A5 Y: g7 n% [: u
' in the CQ installation directory that contains many of these declarations.: @- U) L, c2 m0 l% ?% r
Const AD_SHORT_STRING = 1
7 i( e' U. K& N, f0 pConst AD_MULTILINE_STRING = 24 \# c1 w, F1 a! @# o
Const AD_INT = 3
! y1 K. v& g2 N$ TConst AD_DATE_TIME = 4* b% L9 G. `* l# i! ?
Const AD_REFERENCE = 5
# _& ~# {& g/ {- `" j! g( yConst AD_REFERENCE_LIST = 6
9 p3 W$ q! b+ K/ q: E# UConst AD_ATTACHMENT_LIST = 7
1 l5 f2 ]( I+ Z  ]; m6 ~* NConst AD_ID = 84 Z0 h8 |: \! f4 x+ Q& x
Const AD_STATE = 9
4 Q5 Z3 i* y. m% N8 [Const AD_JOURNAL = 107 I: R$ L$ R0 i$ C" e$ y; b, g
Const AD_DBID = 11& s# V# \  ?0 q3 b  e! G0 u/ J7 z
' The next two are in the next release of CQ, but go ahead and include them now
8 y' J1 E. z/ E5 n$ q% j. F: iConst AD_QUESTIONMARK = 12# j# P6 |& b5 @( P
Const AD_STATETYPE = 13
/ ~, |+ ?, Y$ J% [( r
# X0 `3 m* M2 \; |' There isn't good error checking in VBScript so the liberal use of On Error is required
5 z2 z* I. H( `$ Q- ?4 x) [$ f1 X0 B$ z( ]7 U2 P; j
On Error resume next
* w, }( ]- m8 F3 w5 a2 w& ?% Y  i1 m2 m3 ?
6 V8 X& r* R2 V4 h: K# mset sessionObj = GetSession()8 h' z( j0 @# o. G

  ^% \' E9 W9 b8 L* H1 m; ~DebugWin("Submit_action_initialization::Beginning")/ t" d  b( N/ b* L3 P& Q8 ^
( s* ]. Y0 H- {/ C/ ~* \
' This gets the type definition for the record type that you want to clone.
/ B# m6 G! B0 O$ {7 ]set entityDefObj = sessionObj.GetEntityDef(GetEntityDefName())
9 K& H- y7 a$ K* @DebugWin("EntityDefName: " & GetEntityDefName())
* ~2 K2 ^# U! n% ^9 S. b8 f) |4 F0 S  _" Y5 x: x2 v& L) }
rem If record was submitted via MakeChild push button, then get values of
- b* M; R/ v% o5 J1 Prem fields that are in parent record
% d5 g5 v8 E( n" _) ]$ ]if ( sessionObj.NameValue("CloneParent") = 1 ) then+ ]0 F% r- t1 P6 `  K$ v- U
      rem Get the parent record
7 f% k+ d: S3 @9 i0 R9 O, y       entityDefName = GetEntityDefName% H6 I2 j2 T1 J  n2 U; Y
       pID = sessionObj.NameValue( "ParentID" )
) O/ W1 S  X9 r: R" x       set ParentRec = sessionObj.GetEntity( entityDefName, pID)( C, S) p$ ~  H; v* m( t

% Z, S! y# W- T+ B* O9 u       DebugWin("CloneParent: " & sessionObj.NameValue("CloneParent"))  d7 u3 ^1 q2 w
       DebugWin("ParentID: " & pID)
8 q- Z' Z* Q/ A% ?% F3 p% n0 ^% I9 z, t3 k' M
              ' Enumerate the fields and add them to the cloned object
+ Y1 A: z: C) _4 M. u$ o       nameList = entityDefObj.GetFieldDefNames3 N2 V. o" P. w
       For Each fieldName in nameList
- m2 T  g; ^% v0 \              DebugWin("Field Name: " & fieldName)
( Y9 _5 a% u) l3 ^* a, [* b. Y              fieldType = entityDefObj.GetFieldDefType(fieldName)
* i( ~% w" a9 [0 T! H  _# y0 G         ' You have to do something special depending on the type* P* |5 S0 s# k+ V" T7 X  W% }  o% D
            Select Case fieldType
6 T9 F* j2 ~* \9 Y7 P. F, l            Case AD_ID
. E4 }# Y$ M0 z7 E8 R            Case AD_DBID) G, ?# i* D# A  W
            Case AD_STATE
- N5 m/ o* U% c1 [7 l& P" [6 Q: L! h            Case AD_JOURNAL
5 r9 k$ y7 D4 B! J$ G+ |            Case AD_QUESTIONMARK) x$ s) n* t7 _5 P. N  H4 o: d
            Case AD_STATETYPE
6 ]: v0 ^3 Y% Y/ a              Case AD_ATTACHMENT_LIST4 h$ k. X7 q7 s  s* I
                      ' Code here for dealing with attachments
* V' n1 H# b" C            Case AD_REFERENCE_LIST: s4 D/ k  k1 @& l* i
                   DebugWin("AD_REFERENCE_LIST = " & fieldName)3 e! ^6 G5 ^2 b2 h: O- I
                     Select Case fieldName' d0 C1 q- M: k0 D6 q  d$ M! F
                     rem Ignore all these
: U$ ?  t* g  F: a6 H8 F                     Case "childrecords"0 \8 x' w" e) n5 v
                     rem Process all these3 [( G& w$ d6 g8 P6 E+ h
                     Case Else
* k9 V- K3 e  \5 M( c                    refList = ParentRec.GetFieldValue(fieldName).GetValueAsList2 B" @& f& n. `
                            DebugWin("LBound: " & LBound(refList))! S9 C- x- V! g' R
                            DebugWin("UBound: " & UBound(refList))( T; r0 P5 h6 C. }3 Q5 `
                    for i = LBound(refList) to UBound(refList). k8 g! D, s1 a
                        ' Add the value to the list  z7 @3 ^* X9 o# R
                                          DebugWin("Reference List Value: " & refList(i))
7 C/ w5 u( n# Z  V; ?                        call AddFieldValue(fieldName, refList(i))( q0 ^2 F" n9 v, g( k1 W" z
                    Next
# \$ Y. m( p: v2 z& A/ h$ @                     end Select
2 @; A; b5 G' J1 j+ _( F              Case Else
5 b1 G2 {8 g) {! G8 x9 n                  ' AD_SHORT_STRING, AD_MULTILINE_STRING, AD_INT, AD_DATE_TIME, AD_REFERENCE" p$ O3 L) h* }
                  ' eliminate some fields that are internal to CQ and not really writable2 W6 V- x5 _8 \& `3 [
              ' there should really be a call to discriminate these fields, maybe next release) t! E1 A* n  g
                     Select Case fieldName  H7 [1 ^( T, B2 n! K9 P. K, ^
                     Case "is_active"" e  z6 {3 ~9 D3 ?; b2 Y2 c
            Case "version"
; V3 t7 h) Q* V5 N            Case "lock_version"
" L, b/ W/ J2 l# h/ ?$ Y            Case "locked_by"/ C) W8 H, r) q2 e; h
            Case "is_duplicate"
% `) B" ]+ z# a# ]4 e( h            Case "unduplicate_state"4 i7 \7 v, y% X  ~2 l: [, K2 B& F; f) p
            Case Else" v5 L1 n7 [$ x( q% s- \. C& A
                     rem      DebugWin("Setting value = " & ParentRec.GetFieldValue(fieldName).GetValue)
: M  e' M; B/ e, X% ?                    ' Set the value of the cloned field to the same value it was in the current object
6 V3 d6 d( m- }7 o. k                call SetFieldvalue(fieldName, ParentRec.GetFieldValue(fieldName).GetValue)
% j- w7 f, ]6 n$ X            end Select" I' U/ {3 Q! D! t$ w
        end Select1 f8 x( r4 s* u* M
       Next8 z2 H/ u" J2 x
             rem Get the values of the fields in the parent record/ R+ N9 T2 |" E5 n# o3 D, j2 S
       pHeadline = "Clone of " & pID & ": " & GetFieldValue("Headline").GetValue
5 f/ g/ M/ d$ \3 c5 f/ V  Q7 j       pDescription = ParentRec.GetFieldValue("Description").GetValue
7 |# F" f. p& F8 C( [: s) Q( T6 y, e0 C- @
              rem Set the value of the fields in the child record; |7 q) {3 `' k6 W) M$ l* ?1 }
       rem SetFieldValue "Headline", pHeadline 1 D6 J9 z/ D+ L" K2 S& ]
       SetFieldValue "Add_description", pDescription
5 {4 u* f) x( M! x# o  m) R& {       SetFieldValue "IsOriginal", "No"& b: H7 s5 w$ G! G
       SetFieldValue "RecordSet", pID
; Y4 D" g: j: p       SetFieldValue "Headline", pHeadline
  o; n; M$ g- t
! P' H  {+ B5 b/ r1 F       rem Blank out the fields that make this clone unique
0 r+ a3 a5 q3 A3 A3 k- b       SetFieldValue "BranchName", ""& ?9 p8 f2 t& V' [1 o
+ G2 M4 F: P) S4 K

7 r+ P3 Z8 A: x3 t3 c       rem Clear session variable9 P) {$ a9 I- J: I8 |! r! _
       sessionObj.NameValue "CloneParent", 01 N, v, ?! u& a. u0 R& B; X5 M
else2 `1 V  ~; {; \2 m" g
       SetFieldValue "IsOriginal", "Yes"
( n2 L0 @% \. A: W# D% w       SetFieldValue "RecordSet", GetFieldValue("id").GetValue8 f# v6 A, j- b( [, j+ R
end if
7 R, S) c, U* S4 J
5 y/ J7 v& }% d$ i3 F0 Y! xDebugWin("Submit_action_initialization::Ending")0 ~0 }0 `, t. L$ h9 L- V6 c3 S
End Sub
4 L# R6 y9 Q5 G0 G8 u- I" e8 I& ?. H7 L, h( J  ]& `% Z: |8 E
2、在Recrod的Script的Basic中写入一个名叫cloneparent的函数  W' m2 M; |# R7 Q) _1 K3 D
Function Defect_CloneParent(param)
& E6 G& V. n5 b/ M  ' param As Variant, I; D8 S  i6 W5 N4 o0 e8 K
  ' record type name is Defect" u. S0 m1 B; F$ r
       set session = GetSession()- }& V' X! U) t
4 @, l2 C# B, D* V* [- N. ?! b- }
       rem Set session variable to indicate record being submitted should
  e) m' u2 ^6 S" Y- C       rem be clone/copy of parent: S# T6 a% @, W3 D0 f; R
       session.NameValue "CloneParent", 1- w) E) I3 B& }
2 G* O( a3 C4 n+ m
       rem Set a session variable to store the parent id
" g$ ~  L0 E1 [4 P4 a       session.NameValue "ParentID", GetFieldValue("id").GetValue  S8 p) Q% @9 D5 o

+ x$ ]2 u* `- l; TEnd Function
  e% x4 q, Q  ]: L2 y* e
2 R) j; O4 h2 [4 U3、在Global scripts中创建一个DebugWin函数

, N- k3 F; r1 ^; j3 ^; ~' Subroutine that prints to the debug console (if up)3 L0 [  m$ j, {, N: f4 V
' some messages
4 e) \7 a9 U- }Sub DebugWin(logMessage)
3 r* h8 c( i2 S  Q8 V   , m2 \/ Y9 u" }6 K6 T
       Dim sessionObj( D( y2 m/ }' Y( R* ?4 U" B6 `

3 T6 y9 r5 E# O0 K% D2 x       set sessionObj = GetSession
9 ?' ?( n7 {" B) m/ x; i       sessionObj.OutputDebugString vbCrLf + "DEBUG: " + logMessage + vbCrLf' y3 Z& s: C; r7 s: H9 @9 t
       ! a+ ~6 N: P* N7 X0 D+ F( [1 f
End Sub+ r, E$ {, ^: k! \' Q

6 }5 ]) J' j, M7 u' N  I4、Use a List View widget. Keep the ‘Add button and rename it. Delete the ‘New’ and ‘Remove’ buttons (if desired).

( @0 D2 Z* Y0 i' [! D" n/ A% K, O: l  I4 X0 A& Q
[ 本帖最后由 晓筱 于 2006-9-7 17:54 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

本帖被以下淘专辑推荐:

发表于 2006-9-8 15:05:10 | 显示全部楼层
LZ :; h# J4 O% d+ ?5 W# k. ]
有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的
' h; ?; _3 ^- u- ] . V! E- H% u; Q7 R: Z+ P
click "cloneparent"這個按鈕,就可以觸發發嗎,我試了下,似乎沒有調用initalization.
. d2 v# @! X, [
" O! C/ W+ A' S ' r9 S7 C2 b& Y9 X
請指教下!!
/ G" V0 Y! b: W, t) W6 x' d謝謝!!
回复 支持 反对

使用道具 举报

发表于 2007-3-20 16:32:56 | 显示全部楼层
请问有perl实现的代码吗?
回复 支持 反对

使用道具 举报

发表于 2007-4-19 11:05:36 | 显示全部楼层
lz提供的好东西,下载学习!!
回复 支持 反对

使用道具 举报

发表于 2007-11-2 22:44:43 | 显示全部楼层
不怕见笑,我第一次关注这个克隆(应该也叫继承吧)这个功能,了解的同仁能不能给我解释一下克隆的功能  [3 p! g, G& F! f
能实现什么操作啊?
) j* D  S2 F5 d5 Q2 t% d看着楼主处理界面很厉害 但偶不知道有何用意  再次请教
  {$ d. Q9 n+ `! Y! DCQ研究还不是很深,还劳烦大家耐心告知  谢谢
回复 支持 反对

使用道具 举报

发表于 2009-6-2 13:45:29 | 显示全部楼层
请问一下,如果是不同的用户数据库之间是否能克隆bug记录呢?
回复 支持 反对

使用道具 举报

发表于 2011-4-22 16:56:02 | 显示全部楼层
回复 chrissun 的帖子
# h$ [; Z+ I% O3 L6 w& Z& K. c- M) }
可以的~可以参照下边的帖子
( s7 E( p# U- w6 fhttp://bbs.scmlife.com/forum.php?mod=viewthread&tid=26507&page=1#pid197829
. A2 U# ?, m1 T, C# E
回复 支持 反对

使用道具 举报

发表于 2014-9-12 11:40:02 | 显示全部楼层

4 {) W, N- W) F. n% `7 t针对这个脚本不知道你还有没有影响!
) @4 Y% _) d. ^% z4 i( R6 F2 L# Z+ ~" ]6 l8 F, C
当Headline和Description有初始化的值时,在克隆的时候出现的表单,Headline和Description为初始化的值,并不是克隆源的值。请问这个有解决办法吗?
( J8 U( a. k! L* H$ |
5 o5 {# A  J& B0 V这个克隆是不是没法克隆附件,谢谢. f/ |5 ]# x& m
回复 支持 反对

使用道具 举报

发表于 2016-6-15 15:23:23 | 显示全部楼层
ying 发表于 2006-9-8 15:05
# Y, x3 F/ I$ i1 @; M6 O, p2 d9 aLZ :
7 n$ F$ L3 B5 ?& c4 Z+ p有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的
2 r, Z) f% U6 e

# H/ L) d& a5 Y3 s& ?同问,我在 initalization里写进去的脚本,明明保存了。但退出后再进来就消失了。知道的高手指导一下啊。谢谢谢谢
( x! i1 i1 a, ?1 X8 O6 G! `9 c8 G
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2018-12-11 22:48 , Processed in 0.070243 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表