対話型でフィールド値を一括変更
ダウンロードしてすぐに使えます
Notes/Domino を運用していると、避けて通れないのがフィールド値の修正作業です。
「入力ミスに気づいたけど、対象文書が200件ある…」 「マイグレーションで型がズレてしまった…」 「Names フィールドが Abbreviated のまま保存されていて検索に引っかからない…」
こうした場面で、文書を1件ずつ開いて直していませんか?
今回公開するエージェントは、そんな地道な修正作業を対話形式でまとめて片付けるためのツールです。
どんなエージェント?
ひと言でいえば、選択した複数文書のフィールドを「値」と「データタイプ」の両面から対話的に書き換えるエージェントです。
ビューで文書を選択して実行すると、InputBox と MsgBox の問いかけに答えていくだけで、フィールドの中身を自由に変更できます。
できること
1. フィールド値の変更
もっとも基本的な機能です。指定したフィールドに対して新しい値を入力し、選択文書へ一括で反映します。テキスト・数値・日時のいずれにも対応しています。
2. データタイプの変換
「テキストとして保存されている数値を Number 型に直したい」といったケースに対応します。変換先として以下の6種類が選べます。
- Text
- Number
- DateTime
- TextList(カンマ区切り → 文字列配列)
- NumberList(カンマ区切り → 数値配列)
- Names系(Names / Readers / Authors)
3. Names・Readers・Authors の正規化
Names 系フィールドを選んだ場合、値を自動で Canonical 形式(CN=山田太郎/OU=Dev/O=Example)に変換したうえで、IsNames / IsReaders / IsAuthors フラグを正しくセットします。
「Abbreviated で入ってしまった名前を Canonical に統一したい」という場面で重宝します。
4. 複数値(配列)の入力
入力値にカンマが含まれている場合、「複数値として扱いますか?」と確認が入ります。「はい」を選べば TextList や NumberList として保存されるので、わざわざ @式やスクリプトを書く必要がありません。
5. 一括適用 or 個別入力の選択
1件目の文書で入力した内容を残りの文書すべてにそのまま適用するか、1件ずつ別の値を入力するかを選べます。
「全部同じ値に揃えたい」ときも、「文書ごとに違う値を入れたい」ときも、1つのエージェントで対応できます。
6. フィールドの削除と空白セット
値の入力欄を空のまま確定すると、「フィールドを削除するか」「空文字をセットするか」を選択できます。不要フィールドの掃除にも使えます。
7. 存在しないフィールドの新規作成
対象文書にフィールドが見つからない場合でも、型を指定して新たに作成できます。フォーム設計を変えずにフィールドを追加したい場面で便利です。
処理の流れ(ざっくり)
- フィールド名を入力 → 存在チェック(なければ型を選んで新規作成)
- 新しい値を入力 → 空ならフィールド削除 or 空白セットを選択
- データタイプ変更の確認 → 必要なら変換先の型を指定
- カンマの有無で複数値判定
- 1件目を保存
- 2件目以降 → 一括適用 or 個別入力を選択して処理
各ステップで「キャンセル」を選べば、未保存の文書に影響を与えずに中止できます。
こんなときに使えます
| シーン | 具体例 |
|---|---|
| 誤入力の一括修正 | 大量文書のステータスフィールドを間違えた値で登録してしまった |
| Names フィールドの正規化 | Abbreviated で保存された名前を Canonical に揃えたい |
| マイグレーション後の型修正 | テキストで移行された日付フィールドを DateTime に戻したい |
| 不要フィールドの一括削除 | 旧フォームの残骸フィールドをまとめて消したい |
| テスト・検証 | 開発中にフィールド値を素早く差し替えて動作確認したい |
注意点
- 一括適用では全文書が同じ値に上書きされます。 文書ごとに異なる値を保持したまま型だけ変えたい場合は、別途「データタイプ一括変換」エージェントの使用をおすすめします。(後日公開予定)
- 途中でキャンセルした場合、まだ保存されていない文書は変更されません。
- 保存時に
ComputeWithFormを実行するため、フォームの入力規則や計算フィールドが反映されます。意図しないフィールド変更が起きないか、事前にテスト文書で確認してください。
文書フィールド値 一括変更エージェント フローチャート
ダイアログ(InputBox / MsgBox)の流れを中心に記載
「変更するフィールド名を入力」"/] A -->|空| Z1([キャンセル終了]) A -->|入力あり| B{フィールドが存在する?} B -->|No| B1[/"② InputBox
「フィールド型を選択」
1=Text 2=Number 3=DateTime
4=Names 5=Readers 6=Authors"/] B1 -->|空 or 無効| Z1 B1 -->|有効| C B -->|Yes| C C[/"③ InputBox
「変更する値を入力」
(現在値が初期表示)"/] C -->|空| D C -->|入力あり| E D{{"④ MsgBox(はい/いいえ/キャンセル)
「フィールドを削除しますか?」
はい=削除 / いいえ=空白セット"}} D -->|キャンセル| Z1 D -->|はい:削除| U1 D -->|いいえ:空白セット| E E{{"⑤ MsgBox(はい/いいえ/キャンセル)
「データタイプを変更しますか?」"}} E -->|キャンセル| Z1 E -->|いいえ:変更しない| F E -->|はい| E1[/"⑥ InputBox
「変更後タイプ番号」
1=Text 2=Number 3=DateTime
4=TextList 5=NumberList 6=Names系"/] E1 -->|Names系| E2[/"⑦ InputBox
「1=Names 2=Readers 3=Authors」"/] E2 --> F E1 -->|Text〜NumberList| F F{カンマを含む?} F -->|No| U1 F -->|Yes| G{{"⑧ MsgBox(はい/いいえ/キャンセル)
「複数値として扱いますか?」"}} G -->|キャンセル| Z1 G -->|はい or いいえ| U1 U1["1件目の文書を保存"] U1 --> H{文書は1件だけ?} H -->|Yes| Z2([完了:1件処理済み]) H -->|No| I{{"⑨ MsgBox(はい/いいえ/キャンセル)
「この値を他の文書にも適用?」
はい=一括 / いいえ=個別"}} I -->|キャンセル| Z1 I -->|はい:一括| J["2件目〜最終文書に
同じ値・型で一括保存"] J --> Z3([完了:全件処理済み]) I -->|いいえ:個別| K["文書ごとに ③〜⑧ を繰り返し
(個別に値入力・型変換・保存)"] K --> Z3 %% ===== style ===== style A fill:#4361ee,color:#fff,stroke:#3a56d4 style B1 fill:#4361ee,color:#fff,stroke:#3a56d4 style C fill:#4361ee,color:#fff,stroke:#3a56d4 style E1 fill:#4361ee,color:#fff,stroke:#3a56d4 style E2 fill:#4361ee,color:#fff,stroke:#3a56d4 style D fill:#e76f51,color:#fff,stroke:#d4573f style E fill:#e76f51,color:#fff,stroke:#d4573f style G fill:#e76f51,color:#fff,stroke:#d4573f style I fill:#e76f51,color:#fff,stroke:#d4573f style U1 fill:#2a9d8f,color:#fff,stroke:#238377 style J fill:#2a9d8f,color:#fff,stroke:#238377 style K fill:#2a9d8f,color:#fff,stroke:#238377 style Z1 fill:#6c757d,color:#fff,stroke:#5a6268 style Z2 fill:#1a1a2e,color:#fff,stroke:#12121f style Z3 fill:#1a1a2e,color:#fff,stroke:#12121f style Start fill:#1a1a2e,color:#fff,stroke:#12121f
%REM
' ================================================================
' エージェント名:文書フィールド値変更(対話型)
'
' 【概要】
' 選択した複数の Notes 文書に対して、指定フィールドの
' 「値」および「データタイプ」を対話形式で変更できるエージェントです。
'
' 1件目の文書で入力した値を、残りの文書へ一括適用することも、
' 文書ごとに個別入力することも可能です。
'
' フィールドが存在しない文書に対しては、型を指定して新規作成できます。
'
'
' ================================================================
' 【本エージェントの特徴】
'
' ● 文書のフィールド値をユーザーが入力して変更できる
' ● フィールドのデータタイプ(Text/Number/DateTime など)の変更も可能
' ● Names/Readers/Authors フィールドを Canonical 化して正しく扱える
' ● 複数の文書に対して一括変更 or 個別変更 を選択できる
' ● 空文字入力時は「削除」「空白セット」「キャンセル」を選択可能
' ● 型変換を行うかどうかの確認ダイアログ付き
' ● 配列(TextList, NumberList)などの複数値も扱える
'
'
' ================================================================
' 【本エージェントと「データタイプ一括変換」エージェントの違い】
'
' ■ 本エージェント(データ修正エージェント)
' - フィールドの「値」と「データタイプ」を両方変更することができる
' - 1件目の文書に入力した値を、残り文書に一括で適用するため「型だけ変えたい」用途には不向き
'
' ◎ 注意点
' 一括変更の場合、ユーザーが入力した新しい値で全文書の値が上書きされるため
' 文書間でフィールド値の差異をそのまま残すことはできない
' ■ 使い分けの指針
' - 文書の値そのものを修正したいとき → 本エージェント
'
' - 文書間で値は保持したまま、型だけそろえたいとき
' → 「データタイプ一括変換」エージェントを使用すること
'
'
' ================================================================
' 【処理の流れ】
'
' ■ 1. 変更対象のフィールド名を InputBox で入力
'
' ■ 2. 最初の文書を取得し、フィールドの存在を確認
'
' ● 存在する場合:
' - フィールドの型(Text / Number / DateTime / その他)を判別
' - 現在の値を MSG_def として入力欄の初期値に設定
'
' ● 存在しない場合:
' - ユーザーにフィールド型を選ばせる
' 1=Text, 2=Number, 3=DateTime,
' 4=Names, 5=Readers, 6=Authors
'
' - 選択された型でフィールドを作成予定として扱う
'
'
' ■ 3. 1件目の文書に対する値入力
'
' - InputBox で新しい値を入力させる
'
' ● 入力が空の場合(キャンセル含む)
' → 「フィールド削除」「空白セット」「キャンセル」を選択
'
' → 「空白セット」の場合のみ、型変換確認(ConvertDataType)を実行
'
' ● 入力値がある場合
' → 型変換するかどうか確認(はい / いいえ / キャンセル)
' → 「はい」の場合は ConvertDataType を実行し型変換
'
' ● カンマが含まれる場合
' → 複数値として扱うかを確認
'
' ■ 4. 1件目の文書を UpdateDocument で保存
'
' ■ 5. 2件目以降の処理
'
' ● 一括適用するかどうか確認
' 「はい」 → 1件目の値・型をすべての文書に適用
' 「いいえ」 → 文書ごとに個別入力
' 「キャンセル」→ 処理中止
'
' ● 個別入力の場合も 1件目と同様の手順で処理
'
'
' ================================================================
' 【ConvertDataType の仕様】
'
' ● ユーザーに型変換を行うかどうか確認
' → 「はい」の場合のみ型変換
'
' ● 変換先型は以下から選択:
' 1 = Text
' 2 = Number
' 3 = DateTime
' 4 = TextList(文字列配列)
' 5 = NumberList(数値配列)
' 6 = Names系(別途 Names/Readers/Authors を選択)
'
' ● TextList / NumberList の変換規則
' - カンマ区切りで配列化
' - カンマ無しでも単一要素配列にする
'
' ● Names系変換規則
' - Canonical 化し、item.IsNames / IsReaders / IsAuthors を正しく設定
' - 名前型で複数値がある場合もすべて Canonical 化
'
'
' ================================================================
' 【UpdateDocument の仕様】
'
' ● removeCheck の値に応じて処理
' 6 = フィールド削除
' 7 = 空白セット
' 0 = 通常保存
'
' ● Names/Readers/Authors の場合:
' ・NotesName().Canonical に変換
' ・item.IsNames / IsReaders / IsAuthors を設定
'
' ● 通常の型:
' 1280 = Text
' 768 = Number
' 1024 = DateTime
'
' ● 配列もそのまま保存可能(TextList, NumberList)
'
' ● 保存前に doc.ComputeWithForm を実行し、計算式反映
'
'
' ================================================================
' 【エラー対策と型安全性】
'
' ● Split を行う時は常に 1次元配列に統一
' ● NumberList はすべて CDbl で精査
' ● Names 系は常に Canonical へ統一
' ● 変換不可能な値(数値でない、日時でない)があればキャンセル
'
'
' ================================================================
' 【このエージェントが適している用途】
'
' ● フィールド名を間違えて大量文書に誤入力してしまった時の修正
' ● Names 系フィールドの変換(Notes → Canonical の統一)
' ● 文書マイグレーション時のフィールド型修正
' ● テキスト・複数値の一括編集
'
'
' ================================================================
' 【注意事項】
'
' ● 途中でキャンセルした場合、未保存文書の変更は行われない
' ● 一括変更の際、型と Names 属性も引き継がれる
' ● 変換できない値はその文書をスキップする
'
'
' ================================================================
%END REM
Option Public
Sub Initialize
Dim Sess As New NotesSession
Dim DB As NotesDatabase
Dim DC As NotesDocumentCollection
Dim Doc As NotesDocument
Dim Item As NotesItem
Dim FieldName As String
Dim TmpValue As Variant
Dim GlobalValue As Variant
Dim ItemType As Integer
Dim RemoveCheck As Integer
Dim MulteCheck As Integer
Dim MSG_type As String
Dim MSG_def As String
Dim i As Integer
Dim DocCount As Integer
Dim isNames As Boolean, isReaders As Boolean, isAuthors As Boolean
Dim GlobalIsNames As Boolean, GlobalIsReaders As Boolean, GlobalIsAuthors As Boolean
Set DB = Sess.CurrentDatabase
Set DC = DB.UnprocessedDocuments
DocCount = DC.Count
If DocCount = 0 Then
MsgBox "文書が選択されていません。", 48, "エラー"
Exit Sub
End If
'=== フィールド名入力 ===
FieldName = InputBox("変更するフィールド名を入力してください。", "LotusNotes")
If FieldName = "" Then
MsgBox "処理をキャンセルしました。", 64, "キャンセル"
Exit Sub
End If
'=== 最初の文書 ===
Set Doc = DC.GetNthDocument(1)
Set Item = Doc.GetFirstItem(FieldName)
If Item Is Nothing Then
' フィールドが存在しない場合:型を選択
Dim typeInput As String, typeNum As Integer
typeInput = InputBox( _
"指定フィールド [" & FieldName & "] は存在しません。" & Chr(10) & _
"1=Text,2=Number,3=DateTime,4=Names,5=Readers,6=Authors", _
"フィールド新規作成")
If Trim(typeInput) = "" Then
MsgBox "処理をキャンセルしました。", 64, "キャンセル"
Exit Sub
End If
If Not IsNumeric(typeInput) Then
MsgBox "番号で入力してください。", 48, "入力エラー"
Exit Sub
End If
typeNum = CInt(typeInput)
If typeNum < 1 Or typeNum > 6 Then
MsgBox "1~6 の番号を入力してください。", 48, "範囲エラー"
Exit Sub
End If
Select Case typeNum
Case 1
ItemType = 1280
MSG_type = "[テキスト]"
MSG_def = ""
Case 2
ItemType = 768
MSG_type = "[数値]"
MSG_def = "0"
Case 3
ItemType = 1024
MSG_type = "[日時]"
MSG_def = Format$(Now, "yyyy/mm/dd hh:nn:ss")
Case 4
ItemType = 1280
MSG_type = "[Names]"
isNames = True
Case 5
ItemType = 1280
MSG_type = "[Readers]"
isReaders = True
Case 6
ItemType = 1280
MSG_type = "[Authors]"
isAuthors = True
End Select
Else
' 既存フィールド:型/値を取得
ItemType = Item.Type
isNames = Item.IsNames
isReaders = Item.IsReaders
isAuthors = Item.IsAuthors
Select Case ItemType
Case 1280: MSG_type = "[テキスト]"
Case 768: MSG_type = "[数値]"
Case 1024: MSG_type = "[日時]"
Case Else: MSG_type = "[その他]"
End Select
If IsEmpty(CVar(Item.Text)) Then
MSG_def = ""
ElseIf IsArray(Item.Values) Then
If UBound(Item.Values) = 0 Then
MSG_def = CStr(Item.Values(0))
Else
MSG_def = Join(Item.Values, ",")
End If
Else
MSG_def = Item.Text
End If
End If
'===========================================================
'■ 1件目の値入力
'===========================================================
TmpValue = InputBox("変更する値を入力してください。 " & MSG_type, "LotusNotes", MSG_def)
If TmpValue = "" Then
' 空欄(キャンセル含む) → 削除/空白セット
RemoveCheck = MessageBox( _
"フィールド:" & FieldName & " を削除しますか?" & Chr(10) & _
"[はい]=削除, [いいえ]=空白セット, [キャンセル]=中止", _
35, "確認")
If RemoveCheck = 2 Then Exit Sub ' キャンセル
If RemoveCheck = 7 Then
' 空白セット → 型変換を聞いてよい
Dim cv0 As Variant
cv0 = ConvertDataType("", ItemType, isNames, isReaders, isAuthors)
If cv0 = "__CANCEL__" Then Exit Sub
TmpValue = cv0
Else
' 削除の場合、値は空文字のままでOK(RemoveCheck=6をUpdate側に渡す)
TmpValue = ""
End If
Else
' 値あり → 型変換を確認
Dim cv As Variant
cv = ConvertDataType(TmpValue, ItemType, isNames, isReaders, isAuthors)
If cv = "__CANCEL__" Then Exit Sub
TmpValue = cv
End If
'=== 複数値確認(NamesでもTextでも共通で動く) ===
If Not IsArray(TmpValue) Then
If InStr(TmpValue, ",") > 0 Then
Dim IsMulti As Integer
IsMulti = MessageBox( _
"入力された値にカンマがあります。" & Chr(10) & _
"複数値として扱いますか?", _
35, "複数値確認")
If IsMulti = 2 Then Exit Sub
If IsMulti = 6 Then TmpValue = Split(TmpValue, ",")
End If
End If
'=== 1件目を更新 ===
Call UpdateDocument(Doc, FieldName, ItemType, TmpValue, RemoveCheck, isNames, isReaders, isAuthors)
' 一括適用用に1件目の状態を保持
GlobalValue = TmpValue
GlobalIsNames = isNames
GlobalIsReaders = isReaders
GlobalIsAuthors = isAuthors
Dim GlobalRemoveCheck As Integer
GlobalRemoveCheck = RemoveCheck
'=== 文書が1件だけなら終了 ===
If DocCount = 1 Then
MsgBox "1件の文書を処理しました。", 64, "完了"
Exit Sub
End If
'===========================================================
'■ 2件目以降の処理
'===========================================================
Dim ApplyAll As Integer
ApplyAll = MessageBox( _
"この値を他の文書にも適用しますか?" & Chr(10) & _
"[はい]=残りすべてに適用, [いいえ]=個別入力, [キャンセル]=中止", _
35, "一括変更確認")
If ApplyAll = 2 Then Exit Sub
Dim UseGlobal As Boolean
UseGlobal = (ApplyAll = 6)
For i = 2 To DocCount
Set Doc = DC.GetNthDocument(i)
Set Item = Doc.GetFirstItem(FieldName)
If Item Is Nothing Then GoTo SkipToNext
' 既存フィールドのフラグを取得(個別入力時に使用)
isNames = Item.IsNames
isReaders = Item.IsReaders
isAuthors = Item.IsAuthors
ItemType = Item.Type
If UseGlobal Then
' 一括適用:1件目と同じ型・Names属性を使う
Call UpdateDocument(Doc, FieldName, ItemType, GlobalValue, GlobalRemoveCheck, _
GlobalIsNames, GlobalIsReaders, GlobalIsAuthors)
Else
' 個別入力
If IsEmpty(CVar(Item.Text)) Then
MSG_def = ""
ElseIf IsArray(Item.Values) Then
If UBound(Item.Values) = 0 Then
MSG_def = CStr(Item.Values(0))
Else
MSG_def = Join(Item.Values, ",")
End If
Else
MSG_def = Item.Text
End If
TmpValue = InputBox("文書 " & i & " の新しい値を入力してください。 " & MSG_type, "LotusNotes", MSG_def)
If TmpValue = "" Then
RemoveCheck = MessageBox( _
"フィールド:" & FieldName & " を削除しますか?" & Chr(10) & _
"[はい]=削除, [いいえ]=空白セット, [キャンセル]=中止", _
35, "確認")
If RemoveCheck = 2 Then Exit Sub
If RemoveCheck = 7 Then
Dim cv2 As Variant
cv2 = ConvertDataType("", ItemType, isNames, isReaders, isAuthors)
If cv2 = "__CANCEL__" Then Exit Sub
TmpValue = cv2
Else
TmpValue = ""
End If
Else
Dim cv3 As Variant
cv3 = ConvertDataType(TmpValue, ItemType, isNames, isReaders, isAuthors)
If cv3 = "__CANCEL__" Then Exit Sub
TmpValue = cv3
End If
' 複数値判定(個別入力時)
If Not IsArray(TmpValue) Then
If InStr(TmpValue, ",") > 0 Then
MulteCheck = MessageBox( _
"カンマを含みます。複数値として扱いますか?", _
35, "複数値確認")
If MulteCheck = 2 Then Exit Sub
If MulteCheck = 6 Then TmpValue = Split(TmpValue, ",")
End If
End If
Call UpdateDocument(Doc, FieldName, ItemType, TmpValue, RemoveCheck, isNames, isReaders, isAuthors)
End If
SkipToNext:
Next
MsgBox "すべての文書を処理しました。", 64, "完了"
End Sub
'==============================================================
'■ データ型変換(2行以内ダイアログ & Names/Readers/Authors 選択付き)
'==============================================================
Function ConvertDataType(value As Variant, itemType As Integer, isNames As Boolean, isReaders As Boolean, isAuthors As Boolean) As Variant
Dim ChangeType As Integer
ChangeType = MessageBox("データタイプを変更しますか?", 35, "データタイプ変更確認")
If ChangeType = 2 Then
ConvertDataType = "__CANCEL__"
Exit Function ' キャンセル
End If
If ChangeType = 7 Then
ConvertDataType = value ' 「いいえ」→ そのまま
Exit Function
End If
' ここから実際に型変更するので Names系フラグはいったんクリア
isNames = False
isReaders = False
isAuthors = False
Dim typeInput As String
typeInput = InputBox( _
"変更後タイプ番号:" & Chr(10) & _
"1=Text,2=Number,3=DateTime,4=TextList,5=NumberList,6=Names系", _
"タイプ指定")
If Trim(typeInput) = "" Then
ConvertDataType = "__CANCEL__"
Exit Function
End If
If Not IsNumeric(typeInput) Then
ConvertDataType = "__CANCEL__"
Exit Function
End If
Dim NewType As Integer
NewType = CInt(typeInput)
If NewType < 1 Or NewType > 6 Then
ConvertDataType = "__CANCEL__"
Exit Function
End If
Dim tmp As Variant
Dim i As Integer
Select Case NewType
Case 1 ' Text
tmp = CStr(value)
itemType = 1280
Case 2 ' Number
If Not IsNumeric(value) Then
MsgBox "数値に変換できません。", 48, "変換エラー"
ConvertDataType = "__CANCEL__"
Exit Function
End If
tmp = CDbl(value)
itemType = 768
Case 3 ' DateTime
On Error Resume Next
tmp = CDat(value)
If Err <> 0 Then
Err = 0
MsgBox "日時に変換できません。", 48, "変換エラー"
ConvertDataType = "__CANCEL__"
Exit Function
End If
On Error GoTo 0
itemType = 1024
Case 4 ' Text List
tmp = Split(CStr(value), ",")
itemType = 1280
Case 5 ' Number List
Dim s As Variant, arr() As Double
s = Split(CStr(value), ",")
ReDim arr(LBound(s) To UBound(s))
For i = LBound(s) To UBound(s)
If Not IsNumeric(s(i)) Then
MsgBox "配列内に数値以外があります: " & s(i), 48, "変換エラー"
ConvertDataType = "__CANCEL__"
Exit Function
End If
arr(i) = CDbl(s(i))
Next
tmp = arr
itemType = 768
Case 6 ' Names / Readers / Authors(種類を別途指定)
Dim nrInput As String, nrType As Integer
nrInput = InputBox( _
"Names系の種類を指定してください:" & Chr(10) & _
"1=Names,2=Readers,3=Authors", _
"Names系タイプ指定")
If Trim(nrInput) = "" Then
ConvertDataType = "__CANCEL__"
Exit Function
End If
If Not IsNumeric(nrInput) Then
ConvertDataType = "__CANCEL__"
Exit Function
End If
nrType = CInt(nrInput)
If nrType < 1 Or nrType > 3 Then
ConvertDataType = "__CANCEL__"
Exit Function
End If
Select Case nrType
Case 1: isNames = True
Case 2: isReaders = True
Case 3: isAuthors = True
End Select
' 値そのものはここではまだそのまま(Canonical 化は UpdateDocument で実施)
tmp = value
itemType = 1280
End Select
ConvertDataType = tmp
End Function
'==============================================================
'■ 文書更新(Names/Readers/Authors の Canonical 化+フラグ設定)
'==============================================================
Sub UpdateDocument(doc As NotesDocument, fieldName As String, itemType As Integer, _
value As Variant, removeCheck As Integer, _
isNames As Boolean, isReaders As Boolean, isAuthors As Boolean)
Dim item As NotesItem
Dim i As Integer
Set item = doc.GetFirstItem(fieldName)
'=== 削除 / 空白処理 ===
Select Case removeCheck
Case 6 ' 削除
If Not (item Is Nothing) Then Call item.Remove
GoTo SaveDoc
Case 7 ' 空白セット
Call doc.ReplaceItemValue(fieldName, "")
GoTo SaveDoc
End Select
'=== Names/Readers/Authors の場合は Canonical 化 ===
If isNames Or isReaders Or isAuthors Then
Dim canonicalValue As Variant
Dim nm As NotesName
If IsArray(value) Then
Dim v As Variant
ReDim canonicalValue(LBound(value) To UBound(value))
For i = LBound(value) To UBound(value)
v = value(i)
If Trim(CStr(v)) <> "" Then
Set nm = New NotesName(Trim(CStr(v)))
canonicalValue(i) = nm.Canonical
Else
canonicalValue(i) = ""
End If
Next
Else
If Trim(CStr(value)) <> "" Then
Set nm = New NotesName(Trim(CStr(value)))
canonicalValue = nm.Canonical
Else
canonicalValue = ""
End If
End If
Call doc.ReplaceItemValue(fieldName, canonicalValue)
Set item = doc.GetFirstItem(fieldName)
If Not (item Is Nothing) Then
item.IsNames = isNames
item.IsReaders = isReaders
item.IsAuthors = isAuthors
End If
Else
'=== 通常フィールドの型ごとのセット ===
Select Case itemType
Case 1280 ' Text
Call doc.ReplaceItemValue(fieldName, value)
Case 768 ' Number
If IsArray(value) Then
' すでに配列の場合はそのまま
Call doc.ReplaceItemValue(fieldName, value)
Else
Call doc.ReplaceItemValue(fieldName, CDbl(value))
End If
Case 1024 ' DateTime
Call doc.ReplaceItemValue(fieldName, CDat(value))
Case Else
Call doc.ReplaceItemValue(fieldName, value)
End Select
End If
SaveDoc:
Call doc.ComputeWithForm(True, False)
Call doc.Save(True, True)
End Sub
おわりに
Notes/Domino の管理をしていると、こうした「ちょっとした修正だけど件数が多い」作業は意外と頻繁に発生します。
このエージェントをアプリケーションに入れておけば、フィールド周りのトラブルに素早く対処できるはずです。ソースコードを公開していますので、環境に合わせて自由にカスタマイズしてみてください。
Tatsuki Kazunori
ケートリック株式会社 CEO & CTOをしています。
Notes/Dominoの開発を得意としますが、 C++ / Java / PHP / Javascript などの言語を使ってWEBアプリ、iPhone / Android アプリ開発などをしたりします。
XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。
I am owner of KTrick Co., Ltd. and Notes/Domino developer. HCL Ambassador (IBM Champion for 2015 - current). I am interested in web application development and preferred languages are Notes/Domino, C++ / Java / PHP / Javascript.


