SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 14192|回复: 8

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

[复制链接]
发表于 2006-9-7 17:48:32 | 显示全部楼层 |阅读模式
1、在Recrod type的Action submit动作Initialization中编写下面的脚本
* U9 l  `& N9 t9 H/ C3 p- oSub Defect_Initialization(actionname, actiontype)8 p6 X; A5 j& W. w# V
  ' actionname As String% O7 e9 ^" _! I3 ^+ |0 H& Q7 d+ v) S0 e
  ' actiontype As Long1 h# X! k; R9 w: o( w
  ' action is Submit2 C* N1 a5 C9 d" J) ]
  ' record type name is Defect
+ B% f8 R, O3 M' M- Crem This is record cloning code
+ i- e) E* `8 ?/ D
( B$ O% q8 g2 |" ^. c# M0 d* D  PDim sessionObj
. H  z8 `6 E% I8 Q$ {Dim entityDefObj
& S; e! V( x" x  }Dim nameList- [5 Z8 t! [, t+ Q* J
Dim fieldName
, a  U1 {& d4 \( u6 h) u7 MDim errString
$ ~7 Y# j4 R# w$ cDim fieldType: T0 ^3 V7 \6 D( L& I' A& r
Dim refList+ S( @. R" e3 s4 k
Dim i% \2 i# B* ?+ B. x# f$ ]
  x. ?* ?; w) l! u; V7 M
Dim entityDefName
$ H# ?% o" ^& ]8 k7 M3 w- M2 oDim pID
0 `; G; B8 {# t
: \; K' T) b$ A# W3 d8 U' Declare the local constants. This script is long enough that I might do it in VB where I could have
9 ~% t9 l+ m6 X! g& c' a different module contain these variables. BTW, There is a source file on the distribution clearquest.bas# G9 z9 y- W' u1 a; a
' in the CQ installation directory that contains many of these declarations.
8 r& Y6 }0 ?. u1 m- p( Q/ u' s, PConst AD_SHORT_STRING = 1& l: F. B0 v- @8 ?& C
Const AD_MULTILINE_STRING = 2# L! h' V6 @5 n+ x  i; v2 ]
Const AD_INT = 3
, |$ g: R9 t, ~, ZConst AD_DATE_TIME = 4
" `9 ^( H2 z. W0 mConst AD_REFERENCE = 5
& w* Z' `. n& O' {' f& T8 }Const AD_REFERENCE_LIST = 6
) B2 g  R8 C, f$ ~+ v; `Const AD_ATTACHMENT_LIST = 7: ?( V" k( J% B" W( r% N
Const AD_ID = 8
. f7 Q3 Y- s$ j5 q/ dConst AD_STATE = 9+ H4 C! D, _- [
Const AD_JOURNAL = 104 L% b  z7 B; ~1 E: A2 O
Const AD_DBID = 11  u, z7 O1 m) V+ h
' The next two are in the next release of CQ, but go ahead and include them now
, g* \6 P( z4 F4 H1 e; eConst AD_QUESTIONMARK = 12
- c# E! M  [6 s/ ]6 b' ^5 u; tConst AD_STATETYPE = 13
" r' b2 c# Y5 J, G4 M7 \8 k/ C% o& X; b( `! H
' There isn't good error checking in VBScript so the liberal use of On Error is required
: K* q6 G, H4 H6 f1 r
6 P( o- V7 t. [. I, ~* N/ e5 ?On Error resume next6 a7 [0 d2 s7 Y* \0 b& B9 q
8 A+ Q( P6 G5 h8 W# Q4 A# o; o
set sessionObj = GetSession()
& [, T* M7 Y5 T$ A3 C" j
, o( q; W' P9 [DebugWin("Submit_action_initialization::Beginning")
/ c7 x/ i% V' Z0 j, h' `2 ?* \
7 j; P: @* ^, n9 ~' L& s. D! a' This gets the type definition for the record type that you want to clone.
6 P" p- W; p$ a5 pset entityDefObj = sessionObj.GetEntityDef(GetEntityDefName())
" e+ x' K+ v5 T1 \' o7 j4 V' A/ ADebugWin("EntityDefName: " & GetEntityDefName())
% u( E& X: L& d4 s# C* t: b0 J) P2 O6 Z; T3 N( J- l
rem If record was submitted via MakeChild push button, then get values of
3 B. I9 v! `( C; K* arem fields that are in parent record( T* C* Z9 p  f+ ]' g& g6 l4 s! B
if ( sessionObj.NameValue("CloneParent") = 1 ) then
4 W/ H4 G" l, ?. s* L: r, a      rem Get the parent record
' Q4 a" s: y# Q       entityDefName = GetEntityDefName, t) C  u4 X$ j7 J$ i/ C3 Y
       pID = sessionObj.NameValue( "ParentID" )
: B- W8 m7 V1 e! [' V* t       set ParentRec = sessionObj.GetEntity( entityDefName, pID)- f# V4 T* q; h5 x* E

' F) C3 i3 ], r# @" Y       DebugWin("CloneParent: " & sessionObj.NameValue("CloneParent"))0 A9 m8 ^2 L9 E/ l. N4 S* r3 N
       DebugWin("ParentID: " & pID)3 Q! P# i( }6 P1 x3 O
! Q- @6 v& O3 A( E/ @# p
              ' Enumerate the fields and add them to the cloned object+ ]( i1 {  v7 J: B# R0 _
       nameList = entityDefObj.GetFieldDefNames$ n: @  K8 _! O! P( @0 ^# h: d
       For Each fieldName in nameList
2 @* D* F8 T6 @" {/ w. n, l; g9 P              DebugWin("Field Name: " & fieldName): k* p: Z: e, z# L4 q' h! ^% f" j
              fieldType = entityDefObj.GetFieldDefType(fieldName)  |7 j' N- I* T4 [% o
         ' You have to do something special depending on the type
) w" g' a0 |( h            Select Case fieldType" p3 Y5 z; A5 Y# m' J- L* H
            Case AD_ID
6 y% a3 Q+ C- V4 M0 b! H            Case AD_DBID
. i+ f5 J8 J; x6 \( ]* S' \            Case AD_STATE; `# t, I% j9 U' |
            Case AD_JOURNAL! `! J1 ?: n( [: r5 H5 I$ f# s- K0 y
            Case AD_QUESTIONMARK. O  ]( S, H0 E
            Case AD_STATETYPE
. E% p# @2 a3 g/ I0 S( r: b              Case AD_ATTACHMENT_LIST: `& R) K4 z# |$ m! x: @: o- O, T
                      ' Code here for dealing with attachments
1 s" f- J7 v# Y) p+ v! m3 `            Case AD_REFERENCE_LIST
( \% v& G* c6 n/ G0 ^" U5 N                   DebugWin("AD_REFERENCE_LIST = " & fieldName)1 I4 Y1 W6 o: c6 L2 q1 f$ L6 n: ?9 J
                     Select Case fieldName4 Z) [5 W% p3 v% B0 z
                     rem Ignore all these7 a' N! I& c+ O  O+ [, V
                     Case "childrecords"3 ~4 W0 |' @& A3 m2 r
                     rem Process all these0 R) s- A$ M+ V+ D& u
                     Case Else8 n: N0 d- e% X. ]& D$ Z+ V) `5 C
                    refList = ParentRec.GetFieldValue(fieldName).GetValueAsList3 |( b' a  x) m8 r+ X6 Z
                            DebugWin("LBound: " & LBound(refList))
+ Q1 }; |$ j+ w; u& x                            DebugWin("UBound: " & UBound(refList)). i3 f  X( h  [4 N
                    for i = LBound(refList) to UBound(refList)6 j& r7 o3 N4 Y/ k9 U2 T
                        ' Add the value to the list
' T8 ?2 Z9 X) i& ~7 N3 D" f                                          DebugWin("Reference List Value: " & refList(i))
: j- w% p2 n2 }" P3 ?' K. P                        call AddFieldValue(fieldName, refList(i))
% m+ f! L6 s5 m                    Next
$ X( }& }& F3 k9 Y- J) ~0 \                     end Select) }- D% ~  X  W% u
              Case Else: p% f" E5 n! z2 l, I8 P$ P$ G9 m
                  ' AD_SHORT_STRING, AD_MULTILINE_STRING, AD_INT, AD_DATE_TIME, AD_REFERENCE6 N& o/ p" o+ }; v, {; `
                  ' eliminate some fields that are internal to CQ and not really writable
( w4 b$ o' @7 J+ @              ' there should really be a call to discriminate these fields, maybe next release3 x- @" N+ D. ~. A: E1 {9 T
                     Select Case fieldName2 {5 A2 `4 J+ l
                     Case "is_active"$ W: ~4 [; n9 a: _
            Case "version"
% i  ]: K- M( h            Case "lock_version"
. |, Q* \1 d$ u            Case "locked_by"0 P/ f9 h! ?& L, o$ ^& c- n
            Case "is_duplicate"
# \/ m. m6 ?. o" e6 i' \            Case "unduplicate_state"
9 [9 A  g/ n& P            Case Else
, h  V! L, i- F) d                     rem      DebugWin("Setting value = " & ParentRec.GetFieldValue(fieldName).GetValue)
, e& H; Y$ J& b& o                    ' Set the value of the cloned field to the same value it was in the current object& Y4 E1 N1 d$ B+ a$ Z
                call SetFieldvalue(fieldName, ParentRec.GetFieldValue(fieldName).GetValue)* c) F! y) `  L" E
            end Select
- v  M8 ~5 A0 d7 y& G  N        end Select
/ d1 Y9 X, t$ a+ p2 {: |, a       Next
  c- ~) n  O0 z  ?             rem Get the values of the fields in the parent record2 K+ I5 }$ w8 d8 e
       pHeadline = "Clone of " & pID & ": " & GetFieldValue("Headline").GetValue8 M. U  B9 v7 }% ~6 M% J1 ~! n. [
       pDescription = ParentRec.GetFieldValue("Description").GetValue  ?0 {3 A) ^" r, M8 n- s3 j7 F
/ e7 O8 B. u/ R. M
              rem Set the value of the fields in the child record9 }0 L* x. m4 m; f
       rem SetFieldValue "Headline", pHeadline 3 o0 L$ Y' i8 M: z& N# @% X
       SetFieldValue "Add_description", pDescription + w6 S: T# @/ \6 ~$ z1 n- v& b
       SetFieldValue "IsOriginal", "No"" q( M+ O9 v: a5 K( o6 j2 I  `- j
       SetFieldValue "RecordSet", pID
  C  }2 _& f* P. \2 X3 ?       SetFieldValue "Headline", pHeadline
- |- Q+ x: d: l/ o0 ?5 w; H1 q' C( Z$ r0 J% E0 A
       rem Blank out the fields that make this clone unique' Y6 s8 O) l# `! P6 B( i1 j! N7 \
       SetFieldValue "BranchName", ""
- K  g( E& Q% Y+ C% c# M6 Q5 M
: H- E1 }" B1 W( z9 q2 T. T% a  {1 w4 \5 l% s
       rem Clear session variable
, f6 {' t5 ~' d& p( C3 D; E& W% ?# g       sessionObj.NameValue "CloneParent", 0( \, ^, i- h( h) ?+ z
else
$ h) C3 }$ R0 U/ p       SetFieldValue "IsOriginal", "Yes"
9 N& ?! }5 _/ L3 p- `" @5 F       SetFieldValue "RecordSet", GetFieldValue("id").GetValue
! N+ A  I2 E  k  C2 s9 ~end if7 m/ X7 A6 ?- h8 _( M

8 \5 A3 s( ?( T9 @' kDebugWin("Submit_action_initialization::Ending")
) x+ y% A6 U# ~% n) G5 WEnd Sub
( f/ e5 w& W0 v
! W0 X+ V# ?4 R, _9 n! Y9 q6 V2 c2、在Recrod的Script的Basic中写入一个名叫cloneparent的函数
7 r( I8 r3 d2 V1 F4 V) wFunction Defect_CloneParent(param); J. }1 |; [: T8 A
  ' param As Variant
; ^" z8 Y3 m) a/ g  ' record type name is Defect
. H  g4 L* `/ m0 Z       set session = GetSession()
3 R, {; Q5 D9 {' m# o8 j; ^' i( Y  Z
7 n8 S) O/ c. L: i' o2 G* i       rem Set session variable to indicate record being submitted should ) t( b, [7 v& A+ P
       rem be clone/copy of parent
) z% s# [" s* u  C/ q$ w# |+ ]6 d       session.NameValue "CloneParent", 1$ H0 v0 ^1 Z8 l* i6 `  y6 [' q
. z; K3 t! j1 N) y1 ^" _
       rem Set a session variable to store the parent id
" h3 q8 f: B7 m* |" Y! C       session.NameValue "ParentID", GetFieldValue("id").GetValue0 i7 p- v) ?$ p9 u1 _) x
3 f* J9 K$ h  J7 X& u
End Function
+ v8 Z- N9 o  A: r4 o% H6 f
( G5 V! y, E' g' w3、在Global scripts中创建一个DebugWin函数

' N- ?# k/ h4 Q' Subroutine that prints to the debug console (if up): q; e0 J  @/ e; T! D
' some messages
* r: S' E( J$ f$ @! n% }+ BSub DebugWin(logMessage)
0 m. p. o( C0 U  |- v! Z" I   
0 u1 K% n& ], N; v       Dim sessionObj+ c; ^0 C+ _! j; X. B
# b, H( N" l9 {; B+ H+ ^+ C& _
       set sessionObj = GetSession , q. [/ t& M6 n
       sessionObj.OutputDebugString vbCrLf + "DEBUG: " + logMessage + vbCrLf2 ?$ r4 g* S& J+ d, f
       ( ~+ V8 u+ i0 I3 H0 |4 J
End Sub4 _: o# C5 D/ u* C' V/ I3 k  y# B

# @; ]: C* {6 Y( u' L) v: `4 ]4、Use a List View widget. Keep the ‘Add button and rename it. Delete the ‘New’ and ‘Remove’ buttons (if desired).

0 G. F. w- w2 \2 s" f0 l5 V4 r1 \) T1 n
[ 本帖最后由 晓筱 于 2006-9-7 17:54 编辑 ]

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

发表于 2006-9-8 15:05:10 | 显示全部楼层
LZ :
& |$ S! G0 V  s* O/ v/ g有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的
, o2 K9 H! w. [" i8 V
; v0 ?) t* N1 u5 y# l( ?% Q click "cloneparent"這個按鈕,就可以觸發發嗎,我試了下,似乎沒有調用initalization.
# W; P# j: I5 L! E 1 |- U( Y6 D: l& [; Z" `* D

+ F+ C% y5 U8 P1 B請指教下!!
9 F4 |/ s- T& R9 [6 x謝謝!!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2007-11-2 22:44:43 | 显示全部楼层
不怕见笑,我第一次关注这个克隆(应该也叫继承吧)这个功能,了解的同仁能不能给我解释一下克隆的功能1 T2 i6 N) x$ F4 f7 V
能实现什么操作啊?: H+ k( q% I0 A2 P8 Y  v
看着楼主处理界面很厉害 但偶不知道有何用意  再次请教
3 [6 Y' m, I4 `0 p9 qCQ研究还不是很深,还劳烦大家耐心告知  谢谢
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-4-22 16:56:02 | 显示全部楼层
回复 chrissun 的帖子
+ l5 l% \. y/ O" H/ O2 K5 m- j1 j2 `% ^+ l- O
可以的~可以参照下边的帖子
+ \0 G* b  T- o) rhttp://bbs.scmlife.com/forum.php?mod=viewthread&tid=26507&page=1#pid197829, g/ Q- d9 J1 N
回复 支持 反对

使用道具 举报

发表于 2014-9-12 11:40:02 | 显示全部楼层
' p1 I* ]- r  L+ Q" w3 [  O! y
针对这个脚本不知道你还有没有影响!
3 b: t" j5 ?: T9 j# f# Y6 r1 Z: R! h
当Headline和Description有初始化的值时,在克隆的时候出现的表单,Headline和Description为初始化的值,并不是克隆源的值。请问这个有解决办法吗?0 p# h7 l/ q3 `$ b

- h3 R: d# H; m- ]/ _0 @这个克隆是不是没法克隆附件,谢谢: ]: k3 z4 u& Q. X7 o
回复 支持 反对

使用道具 举报

发表于 2016-6-15 15:23:23 | 显示全部楼层
ying 发表于 2006-9-8 15:050 q, l0 j0 {# S0 E
LZ :4 d! \/ F9 S. B
有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的
0 {9 B6 c$ O5 @; y- i+ @) U: X

% k1 @& S! f7 o3 ~1 L2 T同问,我在 initalization里写进去的脚本,明明保存了。但退出后再进来就消失了。知道的高手指导一下啊。谢谢谢谢
! @' i# Y  a; W% F
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2018-9-19 23:37 , Processed in 0.072095 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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