2025/09/23

共通部品にチャレンジ:#4)LotusScript 実行ログ - ログの開始(LogOpen 関数)

前回から開始したスクリプトライブラリ作成作業の続きです。今回はログ出力を開始する処理に関して記載します。


◇ ログの開始(LogOpen 関数)

まず、ライブラリ利用者とのインターフェースとなる LogOpen 関数です。初期化できていない場合とすでに Open 済みの場合はキャンセルするエラーチェックをしてから、処理を行います。

ログ DB に新規文書を作成し、ログ文書の初期化(後述)を行い、フラグや戻り値を整えています。

Public Function LogOpen(ByVal vsLogTitle As String) As Boolean
   Dim s As String

   On Error GoTo Err_General

   If xbIsInit = False Then Exit Function
   If xbIsOpen = True Then Exit Function

   'ログ文書の作成
   Set xndLog = xndbLog.CreateDocument()
   xndLog.Form = "fStdLog"

   'ログ文書の初期化
   Call xInitLog(vsLogTitle)

   '終了処理
   xbIsOpen = True
   LogOpen = True

   '処理開始メッセージの出力
   Call PrintLog(xcsLibName & |: ログ出力の開始 (| & xcsLibName & | | & xcsLibVersion & |)|)

   Exit Function

Err_General:
   s = "LogOpen でエラーが発生しました。" & Chr(10)
   s = "問題を解決するまでログ出力はできません。" & Chr(10)
   s = s & Error$ & " (Err = " & CStr(Err) & ", Erl = " & CStr(Erl) & ")"
   MsgBox s, 16, xcsLibName
   Exit Function
End Function

最後に PrintLog をコールして、ログの開始とライブラリのバージョンを記録します。この関数はログを出力する関数なのですが、これについては次回紹介します。


◇ ログ文書の初期化

xInitLog はログの基本情報を文書にセットする関数です。ログの開始時刻、エージェントの情報、ユーザ名や DB の情報を記録しています。

Function xInitLog(ByVal vsLogTitle As String)
   Dim na As NotesAgent
   Dim sTitle As String
   Dim v As Variant
   Dim sName As String

   '初期化
   sTitle = vsLogTitle
   sName = xns.UserName

   '開始日時
   xndLog.LogStartTime = Now

   'エージェント情報
   Set na = xns.CurrentAgent
   If Not(na Is Nothing) Then
      'エージェントと別名を分離
      v = Split(na.Name, "|")
      xndLog.AgentName = xRemoveFirst(v)    'エージェント名
      xndLog.AgentAlias = v                                     'エイリアス名

      'タイトルの指定がない場合、エージェント名をセット
      If sTitle = "" Then
         sTitle = xndLog.AgentName(0)
      End If
   End If

   'ログタイトル
   xndLog.Title = sTitle

   'ユーザ名
   xndLog.UserName = sName

   'サーバエージェント
   If xns.IsOnServer Then
      xndLog.IsOnServer = "1"
   End If

   'DB情報
   xndLog.DBTitle = xndbCur.Title
   xndLog.Server = xndbCur.Server
   xndLog.FilePath = xndbCur.FilePath

   'リッチテキスト準備
   Set xnrti = xndLog.CreateRichTextItem("Body")

   'フォントの準備
   Call xInitFont(xnrti)
End Function

また、リッチテキストフィールドを作成して、ライブラリ内の Private 変数に格納しています。このフィールドは、さまざまなシーンで利用するのでライブラリ全体からアクセスできるようにしています。


◇ エージェント名と別名を分離

NotesAgent クラスの Name プロパティは別名を含めて "|" 区切りで返します。そこで Split 関数で配列化した後、xRemoveFirst 関数でエージェント名と別名を分離しています(前述の xInitLog  関数の下記部分)。

Private Function xInitLog(ByVal vsLogTitle As String)
   Dim na As NotesAgent
         ・・・
   'エージェント情報
   Set na = xns.CurrentAgent
   If Not(na Is Nothing) Then
      'エージェントと別名を分離
      v = Split(na.Name, "|")
      xndLog.AgentName = xRemoveFirst(v)    'エージェント名
      xndLog.AgentAlias = v                                     'エイリアス名
         ・・・
 End Function

xRemoveFirst 関数は、引数の配列から最初の要素を削除(引数の配列を更新)し、削除した要素を戻り値として返します。

Private Function xRemoveFirst(rvArray As Variant) As Variant
   Dim i As Integer

   '最初の要素を戻り値にセット
   i = LBound(rvArray)
   xRemoveFirst = rvArray(i)

   '各要素を1つ前に詰める
   For i = LBound(rvArray)+1 To UBound(rvArray)
      rvArray(i-1) = rvArray(i)
   Next

   '最大要素番号を1つ減らす
   If LBound(rvArray) = UBound(rvArray) Then
      '要素が一つなので初期化
      ReDim rvArray(UBound(rvArray))
   Else
      ReDim Preserve rvArray(UBound(rvArray)-1)
   End If
End Function


◇ フォントの準備

ログ文書の初期化の最後でコールしている xInitFont 関数はログ出力で利用するフォント情報を初期化する関数です。今回のログ出力では、項目ごとにフォントを切り替える仕様としています。頻繁にアクセスするので、フォント情報もライブラリ内の Private 変数に格納します。

Private Function xInitFont(vnrti As NotesRichTextItem)
   Dim sFont As String

   sFont = "メイリオ"

   '通常のメッセージ
   Set xnrtsMsg = xns.CreateRichTextStyle()
   xnrtsMsg.NotesColor = 0     '黒
   xnrtsMsg.FontSize = 10
   xnrtsMsg.NotesFont = vnrti.GetNotesFont(sFont, True)
   xnrtsMsg.Bold = False

   'ログ時刻
   Set xnrtsDT = xns.CreateRichTextStyle()
   xnrtsDT.NotesColor = 15    '薄いグレー
   xnrtsDT.FontSize = 10
   xnrtsDT.NotesFont = vnrti.GetNotesFont(sFont, True)
   xnrtsDT.Bold = False

   'エラーメッセージ
   Set xnrtsErr = xns.CreateRichTextStyle()
   xnrtsErr.NotesColor = 2     '赤
   xnrtsErr.FontSize = 10
   xnrtsErr.NotesFont = vnrti.GetNotesFont(sFont, True)
   xnrtsErr.Bold = True    ’太字
End Function

通常のメッセージは黒、エラーは太字の赤字として目立たせています。また、ログの出力時刻はさほど重要ではないのでグレーとしています。

なお、フォントをセットする(NotesFont プロパティ)ためにリッチテキストフィールド(NotesRichTextItem オブジェクト)が必要です。文書を作成してからでないと利用できないため LogOpen 関数コール時に初期化しています。


前回 共通部品にチャレンジ


0 件のコメント:

コメントを投稿