SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 13929|回复: 8

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

[复制链接]
发表于 2006-9-7 17:48:32 | 显示全部楼层 |阅读模式
1、在Recrod type的Action submit动作Initialization中编写下面的脚本8 v5 u5 i* \# G( H5 ^
Sub Defect_Initialization(actionname, actiontype)
. ?6 x) ~6 x2 g# J: t, s  ' actionname As String3 `) W& h0 p7 C# b) n
  ' actiontype As Long
6 F$ {+ u6 G2 R( `' m  ' action is Submit" O  [7 P3 d/ s( q
  ' record type name is Defect3 m& y# m; A0 D) B
rem This is record cloning code
, |! M- k: K) ?: ]0 a& Z: i8 I: m
7 Z7 h0 _0 q; \  \1 n* \Dim sessionObj5 k6 L% C% w% t
Dim entityDefObj
& o* T  }$ i* u) mDim nameList" O) G2 T9 n2 ~1 ?5 l+ Z
Dim fieldName
8 g3 V/ a* E" A6 YDim errString
+ v: L0 ?/ R) g% tDim fieldType2 _0 j' l+ P+ M
Dim refList; a5 K; w) a. Z$ e9 G; i2 k" F5 }
Dim i' j$ R5 U5 T8 I8 d9 O, s6 o
, m$ b1 K& d$ r+ ]& r& v
Dim entityDefName: m( W9 f" p, v! t) v- L& l! @3 ]
Dim pID9 F! [# c/ E; g$ x/ \* v

" V% f- `, t& n' Declare the local constants. This script is long enough that I might do it in VB where I could have% V4 r2 S& e) T6 \7 c7 L
' a different module contain these variables. BTW, There is a source file on the distribution clearquest.bas: h1 u( R0 `% d1 J! i3 x6 k* j
' in the CQ installation directory that contains many of these declarations.  e* B1 Z" d5 ^4 j$ V
Const AD_SHORT_STRING = 18 K) i* U- C& H, Y( H! k( q
Const AD_MULTILINE_STRING = 28 `& v% v2 ]) y
Const AD_INT = 33 g" O! m9 U' F$ p: }* ~
Const AD_DATE_TIME = 4
5 V. t, f; _' QConst AD_REFERENCE = 5
/ Q! W( a6 {- ^9 S) m" u; t1 vConst AD_REFERENCE_LIST = 6
- ?3 k  w0 V0 L! m# b* j+ ^/ o* NConst AD_ATTACHMENT_LIST = 7) a9 \% i$ O6 Q: N$ J, q
Const AD_ID = 8% O# N& a6 ?( {$ q# a- q) s# S% s* f
Const AD_STATE = 9, l# o- G8 `5 _7 b3 r$ ~
Const AD_JOURNAL = 10
$ M9 d, X9 z( U  U( j8 SConst AD_DBID = 11' m' i+ N) ]  A6 ^) F! x
' The next two are in the next release of CQ, but go ahead and include them now
" q7 p2 @8 Q; U; J+ j0 I4 `Const AD_QUESTIONMARK = 123 h& B9 Z6 u" v5 b
Const AD_STATETYPE = 13
6 U; X, e) D+ X1 o  ~" r5 Y) S7 ~! h4 ~6 Q3 t
' There isn't good error checking in VBScript so the liberal use of On Error is required
; ~( K  P6 B! }" `
7 \- ?% n: ^* u; P1 @On Error resume next1 w& e7 J1 ~( j# a4 u4 M
' b5 }! v- |; p3 z2 \$ X3 f( U9 L6 V
set sessionObj = GetSession()* z) f. \. s+ I! h( i

# J5 k3 x) _! l3 k. `DebugWin("Submit_action_initialization::Beginning")
. @; H8 [! c2 L2 c
  @- [- v8 z2 H7 j' This gets the type definition for the record type that you want to clone.
2 I+ |1 |2 `! [  G* Y8 q  ~% M1 eset entityDefObj = sessionObj.GetEntityDef(GetEntityDefName())
" [( A2 n5 Z0 c1 k) c. HDebugWin("EntityDefName: " & GetEntityDefName())
' L& i" o, ~+ r- e. O: m% I: y: m) w8 m% n3 g/ H- N1 t  p6 e# j: f5 E# E/ o
rem If record was submitted via MakeChild push button, then get values of
% `5 g0 w# t! `( I; Lrem fields that are in parent record* i: w, o7 J: X; U7 a
if ( sessionObj.NameValue("CloneParent") = 1 ) then
3 ~: X1 V" u% w. S, f      rem Get the parent record8 }# j, c" p% u
       entityDefName = GetEntityDefName) L! q  P. f% `9 R0 e
       pID = sessionObj.NameValue( "ParentID" )
& Y  Y6 U' \5 V9 a: M1 s7 _       set ParentRec = sessionObj.GetEntity( entityDefName, pID)0 x. F( ?% F1 s( U  |( ^5 i$ w
5 R$ \! g6 o! O  ]; U4 [
       DebugWin("CloneParent: " & sessionObj.NameValue("CloneParent"))* Z3 @- i; G2 ~" H  J. o
       DebugWin("ParentID: " & pID)" P5 U. q$ y% I! \7 D

" e/ p# h' T+ f0 `" |' M8 C5 h% O              ' Enumerate the fields and add them to the cloned object
, k) Y9 }( z% [5 ]: X% K       nameList = entityDefObj.GetFieldDefNames
6 t' J7 {$ X* t) R       For Each fieldName in nameList
8 L( g- I, }- D& ^( v, ^              DebugWin("Field Name: " & fieldName)" j* {- r1 e- x) Z8 [8 p
              fieldType = entityDefObj.GetFieldDefType(fieldName), r0 k* O1 [# L" Q3 o  o
         ' You have to do something special depending on the type
6 {8 q* [/ j" _+ s            Select Case fieldType
" x, P+ A) ~2 ]$ |! D7 Y1 U            Case AD_ID% B0 f# D& ~; x( k6 d
            Case AD_DBID. @$ e  u( [: r3 P& V" [- H* i
            Case AD_STATE
% `% ~, f3 e! a' T! u1 c% E            Case AD_JOURNAL
2 a# H; g0 O2 C- _4 o  [" _# Y            Case AD_QUESTIONMARK1 [' Q% o9 R2 ], g  `
            Case AD_STATETYPE
) h& m( J5 o+ E+ B. }* D8 Q# U) C              Case AD_ATTACHMENT_LIST
5 C( d( N& m9 Y  D                      ' Code here for dealing with attachments
& Y$ Q  T0 V1 ]1 K2 h6 j            Case AD_REFERENCE_LIST6 S1 {' G. i, q; ]1 F% z
                   DebugWin("AD_REFERENCE_LIST = " & fieldName)
8 f  Q  T3 H3 H0 J0 [. L5 R5 V                     Select Case fieldName* T  w2 K+ w* D4 H' o: ^
                     rem Ignore all these3 q3 I$ @7 \9 X, O
                     Case "childrecords"0 u9 T1 M0 W8 r" Q9 T% I' E4 {/ O
                     rem Process all these
1 |1 h7 v" D! B; J, K                     Case Else
9 S8 p8 p6 c/ Y) t2 @/ z; }; n                    refList = ParentRec.GetFieldValue(fieldName).GetValueAsList
  Q5 j4 N9 J) w9 }* y( Z                            DebugWin("LBound: " & LBound(refList))
! \( S; E+ m3 D0 }# P                            DebugWin("UBound: " & UBound(refList)): g  ?( P! C7 z$ o' [3 c' s# x
                    for i = LBound(refList) to UBound(refList)
6 J' G+ V' q4 s6 V' V4 l# R" c! e                        ' Add the value to the list5 B* c, W) N1 |# r. T
                                          DebugWin("Reference List Value: " & refList(i))8 s8 k8 ]  K: d
                        call AddFieldValue(fieldName, refList(i))
6 D2 G  S% t5 x4 P                    Next6 |9 B) k9 i$ V" h" U0 ?* c. ^9 M
                     end Select
& p! M; t+ q+ N  {              Case Else
2 C5 D8 f: U0 u9 P                  ' AD_SHORT_STRING, AD_MULTILINE_STRING, AD_INT, AD_DATE_TIME, AD_REFERENCE- R  O; g' u* a+ p( E" ]' s
                  ' eliminate some fields that are internal to CQ and not really writable
+ t. |0 T, B0 w5 V. \              ' there should really be a call to discriminate these fields, maybe next release
6 J2 j0 C" Y# N7 ~. u" a                     Select Case fieldName6 \8 A/ m8 x2 z: k- u4 J* l* b7 M
                     Case "is_active") \1 ~8 J: o& i7 S" g! f/ C
            Case "version"6 b$ D( F- p5 B+ u  b
            Case "lock_version"* {- E' A9 I& [$ U7 p
            Case "locked_by": u) }( c' s* a% M- j. d; h
            Case "is_duplicate"4 e2 H  O0 L6 K0 ?6 m" W% L
            Case "unduplicate_state"
4 [4 n# X7 s* l, G            Case Else
4 n+ g4 ^4 O  i) @- V                     rem      DebugWin("Setting value = " & ParentRec.GetFieldValue(fieldName).GetValue)1 V" I/ @, s0 `% h* c& g
                    ' Set the value of the cloned field to the same value it was in the current object0 l0 \1 {" W# \$ S$ F  \$ C% m
                call SetFieldvalue(fieldName, ParentRec.GetFieldValue(fieldName).GetValue)3 y' @4 Y) C7 g3 T  ~% |8 a
            end Select7 U: L- g$ L( x
        end Select
7 n2 j% C! C- W7 ?5 ?* `9 U       Next  H: {8 A, X+ s* i2 g5 c8 t, p: y
             rem Get the values of the fields in the parent record: p3 r: G9 @, P) J& f" X8 B- i) ]
       pHeadline = "Clone of " & pID & ": " & GetFieldValue("Headline").GetValue& c! \: m1 w8 q  b
       pDescription = ParentRec.GetFieldValue("Description").GetValue
* c! o$ R: j$ v, ^; o
( Y, A# I$ i& K- Q+ _4 H0 z              rem Set the value of the fields in the child record% R+ n# Y' Z9 }4 P
       rem SetFieldValue "Headline", pHeadline
; ~+ Q& A; Y+ p; r8 a  X       SetFieldValue "Add_description", pDescription 5 Y$ f( `6 `2 ^* |  x" l
       SetFieldValue "IsOriginal", "No"9 N8 |. A3 G& N# `: |
       SetFieldValue "RecordSet", pID/ h$ W1 A$ X' y1 @
       SetFieldValue "Headline", pHeadline
5 s6 t$ ^; A$ E9 H$ Z) u" A6 r  L% l
       rem Blank out the fields that make this clone unique- ^9 X8 S% s" [
       SetFieldValue "BranchName", "". ]3 H$ y8 G9 }& \! b; u: |# e2 j7 t
5 s! [# j! p/ e3 D/ p* O1 ^  q( y. q$ a' d
$ l0 O6 v" h" u5 m
       rem Clear session variable2 G# M0 U' {4 }" ?+ A( X. F
       sessionObj.NameValue "CloneParent", 0# _9 \- a4 B  h. o- @, d
else% Q4 s: t3 x9 \7 n6 {5 i' T) U" u
       SetFieldValue "IsOriginal", "Yes"
  @1 N! U5 Y; ~       SetFieldValue "RecordSet", GetFieldValue("id").GetValue
3 h/ R* a5 c0 B4 @3 Hend if
, k* o- ~0 S2 ]# @( P% C* N
1 d& y. q4 [( J3 KDebugWin("Submit_action_initialization::Ending")6 V2 Z+ q3 C# t: L
End Sub
- f  ~* o* Z; y/ k0 g; P& N
8 T, A% [  j2 ^- p2、在Recrod的Script的Basic中写入一个名叫cloneparent的函数6 }4 Q% r+ g" r
Function Defect_CloneParent(param). _2 U+ e4 G  j
  ' param As Variant# k5 X/ b) ~+ Y0 x  z2 n
  ' record type name is Defect" O5 _6 _0 i# n% e1 r$ F5 B
       set session = GetSession()
) c  p# i& \; u8 P8 K; \: m9 G! f5 D# y- ^7 V+ ]
       rem Set session variable to indicate record being submitted should & l; R, m: d( f! C. H' Q2 C2 ]
       rem be clone/copy of parent
# K( y) q* Y" V. s       session.NameValue "CloneParent", 1# ^3 s. j. u6 U) ?% a1 K, ~

# ^8 B9 N5 T+ U& G       rem Set a session variable to store the parent id
2 H0 \0 K4 \" m. H2 D; b6 D3 t       session.NameValue "ParentID", GetFieldValue("id").GetValue; W% i' t" c0 |+ ]
/ P2 [% o: z/ @8 q
End Function
- u, Q  J4 a; H% M- d; U% O0 R: X4 F% F) |8 ?
3、在Global scripts中创建一个DebugWin函数

; L8 }: l- ~5 i9 y8 \+ ~' Subroutine that prints to the debug console (if up)( n. G4 s( P( ?/ C. D# \- S& q
' some messages( |9 m1 Q4 ]6 j0 \9 v2 s
Sub DebugWin(logMessage)
- g! b8 Q) A; O/ o1 K' h: s1 e   9 _+ V; t1 V$ Q, `
       Dim sessionObj3 p- B) n5 s0 ^( r, ^

+ Q3 C" U+ q1 ~2 Z* O8 t       set sessionObj = GetSession % i' [& U' C2 i  k4 f( V
       sessionObj.OutputDebugString vbCrLf + "DEBUG: " + logMessage + vbCrLf5 G: I" e. c0 q( L1 d% B
      
3 ]. [; P% K" y1 {: U% m1 aEnd Sub" f5 h" b5 K* ]3 k6 Z5 ?8 `

3 Q& q1 R) @; t1 N: T% V5 O; H- I4、Use a List View widget. Keep the ‘Add button and rename it. Delete the ‘New’ and ‘Remove’ buttons (if desired).

& q: D/ I: I0 |* o8 b
, K1 J8 P8 \0 e* }[ 本帖最后由 晓筱 于 2006-9-7 17:54 编辑 ]

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

发表于 2006-9-8 15:05:10 | 显示全部楼层
LZ :. T$ T5 ]7 s+ p
有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的, I9 O* N& Q( |4 r
, V$ b3 t0 r; d2 j* ?
click "cloneparent"這個按鈕,就可以觸發發嗎,我試了下,似乎沒有調用initalization.
! V) ^- W  Y, O5 a; O3 V0 Y
' C+ S6 g+ G- q
, y$ O* U' _% ~% [請指教下!!& L- o8 ~+ ]* G- W" r0 G
謝謝!!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2007-11-2 22:44:43 | 显示全部楼层
不怕见笑,我第一次关注这个克隆(应该也叫继承吧)这个功能,了解的同仁能不能给我解释一下克隆的功能
1 J  ]5 r9 r, X$ O3 C# u& V! b能实现什么操作啊?) x' ?+ C9 g7 ~+ p3 Z) S
看着楼主处理界面很厉害 但偶不知道有何用意  再次请教, E6 D+ e. ?/ s! Y4 ~- T* M! [
CQ研究还不是很深,还劳烦大家耐心告知  谢谢
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-4-22 16:56:02 | 显示全部楼层
回复 chrissun 的帖子
3 O0 |$ J3 \/ j. d+ s  D+ l3 e3 p
5 U5 {/ ~- |! d2 {% ]  p, K可以的~可以参照下边的帖子' S2 _' g) b: [
http://bbs.scmlife.com/forum.php?mod=viewthread&tid=26507&page=1#pid1978292 M" I0 I; z) h
回复 支持 反对

使用道具 举报

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

4 f" U- m# F* i8 T1 _针对这个脚本不知道你还有没有影响!
! |% D# F* w5 q5 [! U, i, o0 k0 U+ [2 h3 ~# T) ~# ~7 G# a
当Headline和Description有初始化的值时,在克隆的时候出现的表单,Headline和Description为初始化的值,并不是克隆源的值。请问这个有解决办法吗?9 n4 u/ h; T1 i# V" ^" i* h9 _

" v* {) b7 P5 u! y. b% n/ c/ M这个克隆是不是没法克隆附件,谢谢. s; ?4 e( U2 r- E% q
回复 支持 反对

使用道具 举报

发表于 2016-6-15 15:23:23 | 显示全部楼层
ying 发表于 2006-9-8 15:05
6 Y- ]0 r* P. ]3 a- o. s- N: X' hLZ :
& e; }% r$ k" J! w% w4 {+ t4 s, g有個疑問,record type中的action submit動作 initalization的腳本,是怎麼被觸發的
- s2 V3 [- Z! G

( x* j: e$ t7 G同问,我在 initalization里写进去的脚本,明明保存了。但退出后再进来就消失了。知道的高手指导一下啊。谢谢谢谢
2 s7 p, k/ y* N5 b6 F
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2018-6-24 15:20 , Processed in 0.076779 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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