SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 13291|回复: 8

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

[复制链接]
发表于 2006-9-7 17:48:32 | 显示全部楼层 |阅读模式
1、在Recrod type的Action submit动作Initialization中编写下面的脚本
. t  p, M  C: ?' u  p) vSub Defect_Initialization(actionname, actiontype)6 C! P7 _! ?* }0 y1 R9 |
  ' actionname As String
" Z4 I) f) o: \  ' actiontype As Long7 [/ L  w# v$ k/ b% M& K/ p
  ' action is Submit: ?8 O* e+ |* g4 N. E2 P$ y3 M
  ' record type name is Defect6 V0 x5 f7 c1 \$ F3 f
rem This is record cloning code
: U& t# W7 N( T0 S7 Q5 j$ ^, G# m9 `3 a: k
Dim sessionObj
$ S( m0 O# G* q' E- \; aDim entityDefObj6 q' N& v4 Y5 ^4 K4 t; d
Dim nameList* [" |) B4 v  Y" l, @! _
Dim fieldName
3 O+ ?0 I7 {+ ^: d1 }- vDim errString, y4 ~6 [6 l" C" l  d2 E
Dim fieldType
& M- w. G- S1 [6 R% DDim refList
( J- b' U" [! R. S0 H7 K# aDim i
. b: O5 s* a/ X' p- g: e. _, e
# P6 b. \" [+ n4 ~( A- eDim entityDefName
! z6 T% x5 V+ f7 FDim pID  ^1 d7 q) [) K& V7 q+ J

! q) n5 P, `* u6 f/ J3 Y' Declare the local constants. This script is long enough that I might do it in VB where I could have
2 p8 F! T( z9 T* {, v. }3 A! c5 T' a different module contain these variables. BTW, There is a source file on the distribution clearquest.bas8 o: I$ j/ S/ U/ X2 H
' in the CQ installation directory that contains many of these declarations.- z+ c: R$ l' F" _. p5 ~
Const AD_SHORT_STRING = 17 K. T& }& G2 ?8 ?' Q
Const AD_MULTILINE_STRING = 2
2 o, E0 B3 A  c% T$ kConst AD_INT = 3; v* p' F2 E8 S" R
Const AD_DATE_TIME = 4. A% ~. V; J  g  ^1 X
Const AD_REFERENCE = 56 Q5 s9 L- I' ?% ^# Y- k, |5 E
Const AD_REFERENCE_LIST = 6& q- U1 b, `* W4 w# f% o
Const AD_ATTACHMENT_LIST = 7, ^2 H4 L( N& d1 J
Const AD_ID = 8: g! N! s. P& ?. y5 c" X4 y
Const AD_STATE = 9
7 `6 ?" R5 c5 H9 b3 H  W. K9 }+ ?* CConst AD_JOURNAL = 10
/ _; G! i' G) I' G+ |' A2 dConst AD_DBID = 110 s( ?5 {% Q: [% j
' The next two are in the next release of CQ, but go ahead and include them now, {) {) D$ ?, S9 d' ?3 `4 O  A
Const AD_QUESTIONMARK = 12
8 q+ i& _# b+ Q# T% |' DConst AD_STATETYPE = 13& [1 Q1 c5 F4 }1 L2 ~$ h

  z/ _  y( A8 s' There isn't good error checking in VBScript so the liberal use of On Error is required( D( D1 \: a' }1 F( v5 H5 d8 ^
7 B" Q( W* E' G+ H% {) k
On Error resume next& G" Z( f0 }: u9 V3 ^0 G

8 j" m9 s8 P. H) t& T2 n* c7 Q, Xset sessionObj = GetSession()4 h3 [) z* l4 h* `# D
1 R+ Q+ L1 R, h/ @7 H$ h5 U
DebugWin("Submit_action_initialization::Beginning")
8 S+ ?3 {$ U) t% \0 A) {1 s. t
" `+ z8 q: n2 n8 a) P5 v- I' This gets the type definition for the record type that you want to clone.6 {. v6 Q3 u7 g: v6 T; g
set entityDefObj = sessionObj.GetEntityDef(GetEntityDefName())
. }& `5 y) m  I6 xDebugWin("EntityDefName: " & GetEntityDefName())
. Z1 @9 O- b$ e7 ]7 ]0 h
, t% C# C* {- A8 {3 b6 Qrem If record was submitted via MakeChild push button, then get values of ! Q  ]' k" I6 }: g; @. J) ^
rem fields that are in parent record
+ ^/ J; f" a5 w. K0 Vif ( sessionObj.NameValue("CloneParent") = 1 ) then
& G; @& \9 K2 k+ ~9 I4 C      rem Get the parent record
5 a' r& N! d7 o5 ^9 k+ \; ^& V) V       entityDefName = GetEntityDefName" w* Y, B  ^2 I7 `# V2 ?
       pID = sessionObj.NameValue( "ParentID" )( ?! O/ _1 F5 D1 }6 I& u/ g
       set ParentRec = sessionObj.GetEntity( entityDefName, pID)" C( r3 m# G0 l; m& U: w; L  J) _

3 e- q3 u! E- h# }: m) ^; `0 J       DebugWin("CloneParent: " & sessionObj.NameValue("CloneParent"))
# G8 N" z1 H4 r( f3 @9 L       DebugWin("ParentID: " & pID)
" p% B3 ]) h; N3 n5 x  K' `, b3 o; i( h
              ' Enumerate the fields and add them to the cloned object
# R0 ~- P0 `/ ]& G( x       nameList = entityDefObj.GetFieldDefNames0 o; ^4 l  I; L! q$ F! Y
       For Each fieldName in nameList% o  u4 t0 d$ Z5 s/ ]6 D! k: _
              DebugWin("Field Name: " & fieldName)
7 f4 X0 q% W" T6 w. `$ K$ b              fieldType = entityDefObj.GetFieldDefType(fieldName)
* c# j5 D% X$ k& _         ' You have to do something special depending on the type. U$ B# R" Z% h0 ^/ p  h. [
            Select Case fieldType& b+ }+ }( s7 G& {* q
            Case AD_ID
/ D7 d! r* U; o  a6 k2 @            Case AD_DBID
) o/ P/ ]& D9 R/ D. G$ ?: {6 \            Case AD_STATE; L0 g5 w6 }7 c5 w  ~4 R4 T
            Case AD_JOURNAL, W0 G; r& ^4 J/ Y. @7 T) o- X
            Case AD_QUESTIONMARK
& \/ m, a2 E  ^- Y! ~# x6 ]            Case AD_STATETYPE
$ f  P0 @5 a7 ~+ o              Case AD_ATTACHMENT_LIST2 F6 l, A# x2 @. I6 o: E! a
                      ' Code here for dealing with attachments
" \; i+ }- ^, U+ Y            Case AD_REFERENCE_LIST
( `5 m9 d8 z2 }, F" y8 B                   DebugWin("AD_REFERENCE_LIST = " & fieldName)
" R' Z0 s! F' _- U* y6 H                     Select Case fieldName6 i. b9 v2 p( J$ N; R* |) q
                     rem Ignore all these
8 Z! X( u4 Z1 d( @                     Case "childrecords"5 a" C+ M# `3 R4 [( y0 n" E% }
                     rem Process all these% k, T% ~0 Z' H0 p
                     Case Else" A! N) ?: l8 O/ a; W$ f+ `
                    refList = ParentRec.GetFieldValue(fieldName).GetValueAsList
. C; [9 b+ u3 v/ C/ V                            DebugWin("LBound: " & LBound(refList))
- x$ u5 ?+ ^9 F. H" u6 }# v                            DebugWin("UBound: " & UBound(refList))
8 d* r  s1 \7 p" [6 E3 z                    for i = LBound(refList) to UBound(refList)
- P/ N- c# @1 J. C4 A$ L                        ' Add the value to the list! {6 R9 O, c5 U+ p( p8 u
                                          DebugWin("Reference List Value: " & refList(i))
3 F6 `" K+ E2 _" e4 {5 E                        call AddFieldValue(fieldName, refList(i))# e* {4 w5 s) R9 ?6 }0 {) D
                    Next7 g$ g! P. Y- A4 R
                     end Select
& Y, K, X" y+ G              Case Else5 c1 z) j3 |% |- t! X0 l% E
                  ' AD_SHORT_STRING, AD_MULTILINE_STRING, AD_INT, AD_DATE_TIME, AD_REFERENCE7 C! I$ q. S' ?, N" C
                  ' eliminate some fields that are internal to CQ and not really writable
* |0 z6 h/ c$ ^+ R2 l& `. A  U              ' there should really be a call to discriminate these fields, maybe next release% C% }, ^( K8 b  J. [, u9 h! ^5 O
                     Select Case fieldName
* l! [1 B/ X# t# N                     Case "is_active"
; }5 J$ O6 D8 G5 ^9 a            Case "version". s4 V# v. U. ^/ n
            Case "lock_version"6 V  z7 l% t/ ?: z# L; i
            Case "locked_by"
6 L5 m7 U% X& F            Case "is_duplicate"( O7 ]6 S0 W, O, m
            Case "unduplicate_state"  u* h: j5 |  ^7 r5 J- \' n1 v* d
            Case Else
. W5 G( Y$ _/ }. o/ w3 p                     rem      DebugWin("Setting value = " & ParentRec.GetFieldValue(fieldName).GetValue): `; `% ?2 s0 `$ E# a. r" z/ X
                    ' Set the value of the cloned field to the same value it was in the current object
, |+ D7 D$ }: O                call SetFieldvalue(fieldName, ParentRec.GetFieldValue(fieldName).GetValue)
/ ^6 _( z0 I/ }! n5 x. W7 v+ m            end Select
& v% x( z. ]+ S; i        end Select) {5 V7 ?  N) D
       Next
) E! q4 x0 I# k. L3 C' X3 L             rem Get the values of the fields in the parent record
4 n* e5 S7 B, e0 P; I/ f: E- y       pHeadline = "Clone of " & pID & ": " & GetFieldValue("Headline").GetValue4 B0 k8 R0 D: r
       pDescription = ParentRec.GetFieldValue("Description").GetValue. `& t2 Z- n# Z3 i6 W+ |

3 d. N5 c( O/ I8 g; K& y/ N. M              rem Set the value of the fields in the child record0 y$ h. F- ]! H. ^7 Y2 P
       rem SetFieldValue "Headline", pHeadline & x) B1 K( k# C- c
       SetFieldValue "Add_description", pDescription ( W1 C$ d% V# q+ l8 B8 `
       SetFieldValue "IsOriginal", "No"3 h' _% i( J4 R6 T, K2 W- H
       SetFieldValue "RecordSet", pID9 l# f8 U# A) m9 i+ y1 W
       SetFieldValue "Headline", pHeadline
6 N# L0 S. v- v, W1 e+ ~* `, H( D: @& U# f% A: Y( Z6 v. U3 ]
       rem Blank out the fields that make this clone unique
  o$ C, M8 i7 n4 r( g       SetFieldValue "BranchName", ""
0 s7 Q1 F. }" a: A6 f
: v$ Y8 H- L1 t/ b% b1 m+ T7 }; N7 E
       rem Clear session variable
; z/ v* P5 T& |+ Y0 v! J       sessionObj.NameValue "CloneParent", 0. |# J1 X9 c  \
else
% {6 S: W- U$ v       SetFieldValue "IsOriginal", "Yes"
5 \1 o* R6 c) y& b# r5 s9 _8 H) w       SetFieldValue "RecordSet", GetFieldValue("id").GetValue
6 P3 B, p7 X( N8 N( e9 Yend if
. ]( D- M  z5 @8 u' r
, g2 A. y0 s' B6 V  j* x3 R$ I% a$ ADebugWin("Submit_action_initialization::Ending")4 u. }+ |) B% e3 w
End Sub3 D$ \6 R7 l5 N, i  k$ j
9 i2 k, U/ a9 j' V% o" _" G
2、在Recrod的Script的Basic中写入一个名叫cloneparent的函数
1 W( N: ~2 ]/ T% P9 E. T7 m# yFunction Defect_CloneParent(param)7 |, A% k9 m0 X1 m  g
  ' param As Variant
5 @! o6 X8 ]7 W6 P( G) f2 k  ' record type name is Defect3 _& _+ X7 q4 K! x( P9 a5 X
       set session = GetSession()3 H9 M6 {+ I' v* r& V/ d% Z4 A7 b

; j" O# E* X3 W7 f  h       rem Set session variable to indicate record being submitted should
+ l6 C' B& i6 D, g7 @       rem be clone/copy of parent
& z2 Q( B! T2 W, y( G& z       session.NameValue "CloneParent", 1
( F0 r9 W: k" x5 t# C, w# P8 D9 v* H& |/ ^7 X* K6 U7 P( Z
       rem Set a session variable to store the parent id
# y) X% Y  m$ @, n( x       session.NameValue "ParentID", GetFieldValue("id").GetValue
' j& e/ C5 u+ `$ K8 O' B  `0 ?+ c
0 h# |9 g/ Z* w2 g5 Z; [End Function
8 T0 {1 q9 K4 l- e: l: @6 G, a6 u1 f7 O# [: I- K3 f$ O0 N- u/ w
3、在Global scripts中创建一个DebugWin函数
/ f+ E" S! M9 w- H+ ^0 d
' Subroutine that prints to the debug console (if up)) x7 C2 ^0 ]9 ^, Z9 o
' some messages
. z! F/ {% }, c$ G  l$ U2 |Sub DebugWin(logMessage): H" M3 K- X$ v* ]7 A
   # F4 u3 F: C) b0 Q. M
       Dim sessionObj4 s" f, W9 _$ N0 ?8 u7 U0 }2 G1 c
2 ~& B2 R) D, m% [6 S
       set sessionObj = GetSession & S4 O! ^% X% S2 k# B
       sessionObj.OutputDebugString vbCrLf + "DEBUG: " + logMessage + vbCrLf
0 {) {8 r6 _! t8 ~4 ^2 d      
9 r* @4 M, d: }( X+ `End Sub
0 f' h  H3 [$ [, J) {, C. F+ D
6 K+ B" C* G/ q0 N4、Use a List View widget. Keep the ‘Add button and rename it. Delete the ‘New’ and ‘Remove’ buttons (if desired).
" L, t& L9 ?( L1 Q( ]2 @. C

+ N/ \1 }$ W! @[ 本帖最后由 晓筱 于 2006-9-7 17:54 编辑 ]

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

发表于 2006-9-8 15:05:10 | 显示全部楼层
LZ :' u0 \0 @' Y5 {; r. m
有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的+ N8 l+ U5 G8 A+ k7 N  X) Q- \
6 t& O# Q1 @! W; ~, n
click "cloneparent"這個按鈕,就可以觸發發嗎,我試了下,似乎沒有調用initalization.+ N* s1 }- n5 V

4 t1 o8 R5 A9 E  U
& u5 y3 E% o: ]3 |& y請指教下!!
$ ?. Z5 Y, ?' k7 e7 N2 E; B謝謝!!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2007-11-2 22:44:43 | 显示全部楼层
不怕见笑,我第一次关注这个克隆(应该也叫继承吧)这个功能,了解的同仁能不能给我解释一下克隆的功能4 F+ p/ }: P6 o$ x) ?" B+ p$ |5 m. d
能实现什么操作啊?$ F: D' p- q# ?: g
看着楼主处理界面很厉害 但偶不知道有何用意  再次请教% Z+ `: Z" h+ s
CQ研究还不是很深,还劳烦大家耐心告知  谢谢
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-4-22 16:56:02 | 显示全部楼层
回复 chrissun 的帖子7 b1 V  }* W, x4 V

: n  F. X) v# Z; w( H" ?# ~可以的~可以参照下边的帖子
7 N) ~! H+ Y  D+ ?) ]http://bbs.scmlife.com/forum.php?mod=viewthread&tid=26507&page=1#pid1978294 {9 a( H- k6 G
回复 支持 反对

使用道具 举报

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

2 K3 c0 J* u0 |7 K" g# `6 w6 j针对这个脚本不知道你还有没有影响!
% L) }/ |& s. g- ^* E" G
- a) h2 \) q0 l5 @  o/ M, _4 ^当Headline和Description有初始化的值时,在克隆的时候出现的表单,Headline和Description为初始化的值,并不是克隆源的值。请问这个有解决办法吗?
& Y6 Q4 z, B, }  W
9 d! E+ H7 P% N; C: s( I4 t这个克隆是不是没法克隆附件,谢谢$ [- O( o3 v2 X
回复 支持 反对

使用道具 举报

发表于 2016-6-15 15:23:23 | 显示全部楼层
ying 发表于 2006-9-8 15:05
$ y* J3 c/ B1 m5 f9 Z' [( ?, mLZ :
# }/ P& q& z  o, d9 }1 a/ _有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的
% H) I, x3 S- `4 B7 S

( e; {( @$ W9 E: n1 D+ ]7 ]4 e同问,我在 initalization里写进去的脚本,明明保存了。但退出后再进来就消失了。知道的高手指导一下啊。谢谢谢谢
3 A" f# u. S* K* ~! C) n
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-1-18 09:11 , Processed in 0.074089 second(s), 6 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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