Excel VBAでTrac(SQLite)にチケットを追加する。同時にカスタムフィールドも追加する
チケットとカスタムフィールドまでを一気に登録してしまうマクロを作ってみましょう。
カスタムフィールドの追加はチケットを追加した後に、ticket_changeとticket_customを追加します。
Sub appendTicket()
' ループを回ってチケットを追加
Dim cnDatabase As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim row As Integer
cnt = "Driver=SQLite3 ODBC Driver; Database=D:\TracLight\projects\trac\tracplugin\db\trac.db" '**** SQLite3.xSet cnDatabase = New ADODB.Connection
cnDatabase.Open cnt
Sql = "SELECT * "
Sql = Sql + "from ticket t "
Worksheets("Sheet2").Select 'データはsheet2
rs.Open Sql, cnDatabase, adOpenFowordOnly, adLockOptimistic
Dim ticket_id As Long
Dim createTime As Date
Dim serialNow As Double
Dim longNow As Long
Dim customField As String
row = 2 '2行目からデータ
Do While ActiveSheet.Cells(row, 11).Value <> "" 'summaryに何かある場合追加する
createTime = Now ' 現在の時間を取得します
serialNow = createTime * 24 * 3600 - 2209161600# - 3600 * 9
longNow = serialNow
rs.AddNew 'レコードを追加します
rs!Time = "" & longNow
rs!changetime = "" & longNow
rs!Status = "new"
rs!Type = ActiveSheet.Cells(row, 1).Value
rs!component = ActiveSheet.Cells(row, 2).Value
rs!severity = ActiveSheet.Cells(row, 3).Value
rs!Priority = ActiveSheet.Cells(row, 4).Value
rs!owner = ActiveSheet.Cells(row, 5).Value
rs!reporter = ActiveSheet.Cells(row, 6).Value
rs!cc = ActiveSheet.Cells(row, 7).Value
rs!Version = ActiveSheet.Cells(row, 8).Value
rs!milestone = ActiveSheet.Cells(row, 9).Value
rs!resolution = ActiveSheet.Cells(row, 10).Value
rs!Summary = ActiveSheet.Cells(row, 11).Value
rs!Description = ActiveSheet.Cells(row, 12).Value
rs!Keywords = ActiveSheet.Cells(row, 13).Value
rs.Update
' 追加したレコードのIDを取得します
' SQLiteで使えるいい方法があれば教えてください
Sql2 = "SELECT max(t.id) "
Sql2 = Sql2 + "from ticket t "
Sql2 = Sql2 + "where changetime='" & longNow & "'"
Dim rs2 As New ADODB.Recordset
rs2.Open Sql2, cnDatabase
Dim ticket As Integer '追加したチケットのID
ticket = rs2.Fields(0).Value
rs2.Close
Dim name As String
Dim reporter As String
Dim newValue As String
reporter = ActiveSheet.Cells(row, 6).Value
j = 14 'ticketの項目が終わったところからはcustomfield
Do While ActiveSheet.Cells(1, j).Value <> ""
name = ActiveSheet.Cells(1, j).Value '1行目に項目名
newValue = ActiveSheet.Cells(row, j).Value '実際の値
If newValue <> "" Then
'
Dim rs3 As New ADODB.Recordset
Sql = "SELECT * from ticket_custom"
rs3.Open Sql, cnDatabase, adOpenFowordOnly, adLockOptimistic
rs3.AddNew 'レコードを追加します
rs3!ticket = "" & ticket
rs3!name = name
rs3!Value = newValue
rs3.Update
rs3.CloseSql = "SELECT * from ticket_change"
rs3.Open Sql, cnDatabase, adOpenFowordOnly, adLockOptimistic
rs3.AddNew 'レコードを追加します
rs3!ticket = "" & ticket
rs3!Time = longNow
rs3!Author = reporter
rs3!Field = name
rs3!oldvalue = ""
rs3!newValue = newValue '履歴になるので時間が必要
rs3.Update
rs3.Close
End If
j = j + 1
Loop
Application.Wait (createTime + 1# / 24 / 3600) 'changetimeが重複しないように最大で1秒待ちます
row = row + 1
LoopEnd Sub
sheet2にデータを準備します。N列以降はカスタムフィールドを追加します。例として、due_assignとdue_closeが書いてあります。
| 固定リンク
| コメント (0)
| トラックバック (1)
最近のコメント