2025/10/14

Environ 関数 (LotusScript)

先日、Dominoデザイナーヘルプを見ていて Environ 関数をたまたま発見しました。LotusScript を使い始めてほぼ 30 年になるのですが、恥ずかしながらこの関数の存在を知りませんでした。

今回は備忘録を兼ねて Environ 関数についてまとめます。


Environ 関数

Windows の環境変数を取得する関数です。構文は次の通り。

Environ[$] ( { environName | n } )

引数は以下のどちらかを指定します。

1 environName  文字列 環境変数名
n 数値 n 番目の環境変数

戻り値は、Environ$ とした場合は文字列、Environ の場合は Variant 型となります。


環境変数の取得

以前『Windows のテンポラリフォルダの取得』の記事では、Windows API を使う方法を紹介しました。しかし、Environ 関数を使えば、1 行で解決できます。

sTmpFol = Environ$("TEMP")

こんな便利な命令があったんですね。デザイナーヘルプをもっと隅々までチェックしておけばよかったです...。


テンポラリフォルダ以外にもさまざまな環境変数があります。使いそうなものを抜粋すると次の通りです。

TEMP
TMP
テンポラリフォルダ
HOMEDRIVE ホームドライブ
HOMEPATH ホームパス
Path パスの一覧
OneDrive OneDrive フォルダ
windir Windows フォルダ

また、環境変数というだけあって、Windows や PC に関する基本的な情報も取得できます。

USERNAME ユーザ名
COMPUTERNAME コンピュータ名
PROCESSOR_ARCHITEW6432 CPU
PROCESSOR_IDENTIFIER CPU の詳細


環境変数の種類

引数に数値を指定すると n 番目の環境変数が取得できます。これを利用してすべての環境変数を順に確認することができます。

Option Declare

Sub Initialize
   Dim b As Boolean
   Dim i As Integer

   i = 0
   Do
      i = i + 1
      b = ShowEnv_n(i)
   Loop Until b = False
End Sub

Function ShowEnv_n(ByVal viIndex As Integer) As Boolean
   Dim s As String

   s = Environ$(viIndex)
   If s <> "" Then
      MsgBox CStr(viIndex) & ") " & s
      ShowEnv_n = True
   End If
End Function

実行すると、次のようになります。


上記のサンプルのように、引数に数値を指定した場合は「環境変数名=環境変数の値」を返します。引数に環境変数名を指定すると値だけを返すので注意してください。


2025/10/13

クラス化に挑戦: #14)クラス化とコメント

クラス化は開発効率を高めるために有効な開発手法となるのですが、コメントの書き方でさらに効果を高めることが可能です。


メソッドのコメント

一般的に通常の関数には関数の機能や使い方をヘッダコメントに記述します。クラスのメソッドも同様です。以下のコードは、前回 Location クラスに追加した CalcDistance メソッドにコメントを追加した例です。メソッドの使い方、引数の型と説明、戻り値、必要に応じて利用時の注意などを記載します。

%REM
自身の GPS 座標と引数で指定した座標との距離(m)を返します。

◆ 引数
voDestination Location 距離を求める GPS 座標

◆ データ型(戻り値)  Double
%END REM

   Public Function CalcDistance(voDestination As Location) As Double
      CalcDistance = distance(zdLatitude, zdLongitude, voDestination.Latitude, voDestination.Longitude)
   End Function

このようにメソッドの直上に記述すると、デザイナーでメソッドを使用する際にポップアップヘルプとして表示されます。

クラスの利用者が欲するコメントを書いておくと、それだけで開発がすすめられます。ただのコード内のコメントではなくなりますので、記述するモチベーションが上がりますね。


プロパティのコメント

プロパティの定義は Get / Set の 2 つのモジュールに分かれます。コーディング上はそれぞれコメントを記述できますが、ポップアップヘルプに表示されるのは先に記述されたコメントとなります。ですので Get と Set のモジュールは連続して記述してその上にコメントを書くといいでしょう。

%REM
検索キーワードを表します。

◆ データ型  String
◆ アクセス  取得、設定
%END REM

   Public Property Get Keyword As String
      Keyword = zsKeyword
   End Property

   Public Property Set Keyword As String
      zsKeyword = Keyword
   End Property


クラスのコメント

クラス定義の上に記述したコメントがポップアップヘルプとして利用されます。このヘルプはクラス定義に対してと New でそのクラスを選んだ場合とで共通です。


ですので、記述するコメントはクラスの機能とオブジェクトの作成方法である New の引数を記述しておきましょう。また、このクラスで必要となる他の他の設計要素についても記述すると間違いなく利用できますね。

%REM
Location クラス ( lsGoogleMap ライブラリ )
---------------------------------------------------
GPS の位置情報を管理します
 
◆ オブジェクトの作成 ( New の引数 )
vdLatitude      Double   緯度
vdLongitude  Double   経度

◆ 関連設計要素
  (なし)
%END REM

Public Class Location
         ・・・
   Public Sub New(ByVal vdLatitude As Double, ByVal vdLongitude As Double)
         ・・・
   End Sub
         ・・・
End Class


まとめ

今回はクラスライブラリのコメントと効果的な使い方についてまとめました。汎用的なクラスになればなるほど、自分以外の開発者が使うことになるので、それを意識してわかりやすく、使いやすいコメントを記述するようにしましょう。


前回 クラス化に挑戦


2025/10/12

ビューのカテゴリと読者権限

前回はビューに合計を表示する方法と読者権限利用時の注意について記載しましたが、ビューのカテゴリに関しても類似した注意が必要です。例えば、以下の画面のようにカテゴリは表示されているのですが、カテゴリを開いても文書が表示されないという現象があります。

この現象は、カテゴリ内の文書すべてに対して参照権限がない場合に発生します。参照権限がある([Admin] ロールを持つ)ユーザでビューを確認すると、カテゴリ内の文書が表示されます。このカテゴリ部分だけが見えていたということになります。


対応策

この問題はビューのプロパティで回避できます。[スタイル]タブで『空のカテゴリを表示しない』にチェックを入れると解消できます。

設定後のビューではカテゴリは消えていることが確認できます。こんな機能があるのであれば、合計が一致しない問題も改善してほしくなりますね。


裏技

『空のカテゴリを表示しない』のチェックを外すと文書は見えなくてもカテゴリが表示されました。この挙動を利用した裏技があります。カテゴリしか表示されていなくても、@DbColumn で取得することができるんです。


@DbColumn("":"NoCache"; "":""; "vAllCategories"; 1)

参照権限を設定している文書が集まるアプリで、カテゴリの選択肢だけは共通化したい場合に利用できます。参照権限がない文書から(部分的ですが)値を取得する裏技ということですね。


2025/10/11

ビューの合計と読者権限

ノーツのビューには合計を表示する機能があります。次の画面ではカテゴリ内の合計をカテゴリと同列に表示、総合計を最終行に表示しています。合計はカテゴリを閉じても表示されているので、データの概要をつかむのに便利です。Excel の小計機能のようなものですね。


合計の出し方

まず、合計を出したい列(今回は単価)のプロパティの[ソート]タブの一番下の項目、合計で ”合計” を選択します。これだけで合計が出力されます。

次に、ビューのプロパティの[スタイル]タブで合計の色を指定します。そのままだと各文書の単価と合計が同じ色で表示されて見にくくなるので、必ず設定しましょう。

たったこれだけの操作で合計を出力できます。


読者権限設定時は注意

合計は簡単で便利な機能なのですが、弱点もあります。

最初の画像の最終列が読者フィールドの値で、3 文書で参照権限を制限しています。[Admin] ロールを持たないユーザに切り替えてこのビューを表示します。すると文書は見えないのに、合計には合算されています。

合計金額は、最初の画像と同じとなっており、全件分の合計が必ず表示されるようです。読者フィールドを利用したアプリで合計を使う場合、注意しましょう。


2025/10/10

@Subset の使い方

今回は @Subset という関数の使い方をまとめます。リスト値(複数値、配列)を操作する上で必須となる関数です。


@Subset の仕様と構文

@Subset はリスト値から部分リスト値を抽出する場合に使用します。構文は次の通りです。

@Subset( list ; number )

1 list 文字列リスト
数値リスト
日付/時刻値リスト
抽出元のリスト値
2 number 数値 抽出する値の数


@Subset の動作

まずは単純な例です。list に次の 5 つの値が入っていて、3 を指定した場合の結果です。リストの前から指定した数だけのリスト値が返されます。

list @Subset( list ; 3 )
@関数
LotusScript
HTML
JavaScript
Java
@関数
LotusScript
HTML

おもしろいのは負の数を指定できることです。この場合、リストの後ろから指定した数だけ取得します。例えば -3 を指定した場合は次のようになります。

list @Subset( list ; -3 )
@関数
LotusScript
HTML
JavaScript
Java
HTML
JavaScript
Java

リスト値の要素数を意識することなく、一発で後ろから取得できるなんて高性能な関数ですね。LotusScript で記述すると 1 行では済まないので、@関数が便利だと感じる瞬間ですね。


指定した要素番号の値を取得

1 を指定するとリスト値の先頭、-1 を指定すると最後の要素を取得できます。この機能を利用して、要素番号 n の値だけを取得するには次のように記述します。

@Subset(@Subset(list; n); -1);

上記はリストの前から n 番目を取得しますが、次のように記述すると後ろから取得できます。

@Subset(@Subset(list; -n); 1);

リストの要素のアクセスは list[3] のように [ ] で指定することができます。ただ、この機能は Notes Release 6 からの新機能(20 年以上前です)で、それ以前から Notes 界隈にいる人は今でも @Subset 二段掛けを使う人が多いと思います。


まとめ

今回は @Subset の使い方についてまとめました。このブログ内ですでに何度も登場している関数ですね。他の事例については当ブログ内の 出直し!!ヘルプ @関数編 @Subset 内に「関連記事」としてまとめています。


2025/10/03

共通部品にチャレンジ:#11)LotusScript 実行ログ - 実行環境の取得

今回 LotusScript 実行ログ出力機能に追加するのは、実行環境の情報を取得する機能です。バージョンや環境に依存する問題の確認に利用できます。


フォームの修正

ACL タブの後ろに ”実行環境” タブを追加します。そのタブ内にカスケード表を作成して、フィールドを配置します。


項目 フィールド名 種類 補足
バージョン(ビルド) NotesVersion テキスト 編集可能
NotesBuildVersion
@Platform Platform
@@Platform([Specific]) PlatformSpecific


ライブラリの修正

新規追加した上記フィールドをセットするコードをライブラリに追加します。実行環境も ACL 情報と同じく、実行につき一度だけの取得となるので、初期化処理に追加します。

Private Function xInitLog(ByVal vsLogTitle As String)
         ・・・
   'アクセスレベル
   Dim lOpt As Long
   xndLog.AccessLevel = CStr(xndbCur.QueryAccess(sName))
   lOpt = xndbCur.QueryAccessPrivileges(sName)
   xndLog.AccessOption = xGetACLOptionName(lOpt)
   xndLog.UserRole = xndbCur.QueryAccessRoles(sName)

   '実行環境
   xndLog.NotesBuildVersion = xns.NotesBuildVersion
   xndLog.NotesVersion = xns.NotesVersion
   xndLog.Platform = Evaluate(|@Platform|)
   xndLog.PlatformSpecific = Evaluate(|@Platform([Specific])|)


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

バージョン(ビルド)情報は NotesSession クラスから取得し、OS の情報は @Platform 関数を利用して取得しています。こんな時に Evaluate 関数は便利ですね。


まとめ

最近の LotusScript の実行環境は、Windows 上のノーツクライアントだけでなく、Nomad など多岐にわたります。ログにこの機能を付けておくとどのクライアントで発生した問題であるかを確認できますね。

これで、当初予定していた機能が完成しました。さまざまなアプリケーションに組み込んでログ効率的に管理し、サポートにかかる時間を極力削減しましょう。


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


2025/10/02

共通部品にチャレンジ:#10)LotusScript 実行ログ - ACL の取得

今回は LotusScript を実行しているユーザの ACL 情報を取得します。想定外のエラーの場合、権限に起因する場合もあります。この情報があればトラブル対応の時間短縮になるかもしれませんね。


フォームの修正

ログに ACL 情報を表示するためのフィールドを作成します。

新しいタブを追加(タブ表に 1 行追加)してタイトルに ”ACL” を指定します。そのタブ内にカスケード表を作成して、フィールドを配置します。

作成するフィールドは次の通りです。

項目 フィールド名 種類 補足
アクセスレベル AccessLevel ダイアログリスト 編集可能 キーワードは後述
ロール UserRole テキスト 複数値も可、改行区切り
オプション AccessOption チェックボックス キーワードは後

項目 種類 補足
アクセスレベル 選択肢を入力 なし|0
投稿者|1
読者|2
作成者|3
編集者|4
設計者|5
管理者|6
オプション 文書の作成|CreateDocuments
文書の削除|DeleteDocuments
個人エージェントの作成|CreatePersonalAgents
個人フォルダ/ビューの作成|CreatePersonalFoldersAndViews
共有フォルダ/ビューの作成|CreateSharedFoldersAndViews
LotusScript/Javaエージェントの作成|CreateLotusScriptJavaAgents
パブリック文書[読者]|ReadPublicDocuments
パブリック文書[作成者]|WritePublicDocuments
文書を複製またはコピー|ReplicateOrCopyDocuments

アクセスレベルとロールは重要な情報なので、基本情報のタブにも表示します。


項目 フィールド名 種類 式 / 補足
アクセスレベル AccessLevel_D ダイアログリスト 表示用の計算結果 AccessLevel
キーワードは 
AccessLevel と同じ
ロール UserRole_D テキスト UserRole
複数値も可、カンマ区切り


ライブラリの修正

続いて、追加したフィールドに値をセットするプログラムの作成です。ACL 情報は実行につき一度だけの取得でいいので、初期化処理に追加します。

Private Function xInitLog(ByVal vsLogTitle As String)
         ・・・
   'DB情報
   xndLog.DBTitle = xndbCur.Title
   xndLog.Server = xndbCur.Server
   xndLog.FilePath = xndbCur.FilePath

   'ACL 情報
   Dim lOpt As Long
   xndLog.AccessLevel = CStr(xndbCur.QueryAccess(sName))
   'アクセスレベル
   lOpt = xndbCur.QueryAccessPrivileges(sName)
   xndLog.AccessOption = xGetACLOptionName(lOpt)
                   'ACL オプション
   xndLog.UserRole = xndbCur.QueryAccessRoles(sName)
          'ロール

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

QueryAccessPrivileges メソッドで取得した値は、フォームで利用するのは少し複雑です。そこで新しい関数 xGetACLOptionName で値を選択肢の文字列に変換しています。

End Function Private Function xGetACLOptionName(ByVal vlOpt As Long) As Variant
   Dim asOpt() As String
   Dim asReturn() As String
   Dim i As Integer
   Dim j As Integer

   '一度だけ実行なので定数化しない
   ReDim asOpt(8)
   asOpt(0) = |CreateDocuments|
   asOpt(1) = |DeleteDocuments|
   asOpt(2) = |CreatePersonalAgents|
   asOpt(3) = |CreatePersonalFoldersAndViews|
   asOpt(4) = |CreateSharedFoldersAndViews|
   asOpt(5) = |CreateLotusScriptJavaAgents|
   asOpt(6) = |ReadPublicDocuments|
   asOpt(7) = |WritePublicDocuments|
   asOpt(8) = |ReplicateOrCopyDocuments|

   'ビットごとに確認
   j = 0
   ReDim asReturn(j)
   For i = 0 To UBound(asOpt)
      If vlOpt And (2 ^ i) Then
         'ビットが立っているので戻り値の配列に追加
         ReDim Preserve asReturn(j)
         asReturn(j) = asOpt(i)
         j = j + 1
      End If
   Next

   xGetACLOptionName = asReturn
End Function

なお、ACL 情報の取得については、『アクセス権限とロールの取得 - LotusScript』と『QueryAccessPrivileges の判定と演算子の活用』で紹介しているので参照ください。


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


2025/10/01

共通部品にチャレンジ:#9)LotusScript 実行ログ - 経過時間の測定と出力

作成中のLotusScript 実行ログ出力ライブラリに処理時間を測定する機能を追加します。

まず、ログ出力の開始から終了までの経過時間を測定して記録します。

ついでに、ログ出力間の経過時間も測定し、閾値を越えるとログの先頭に表示する機能も作ります。この機能があれば簡易的にボトルネックを探すことができますね。


経過時間の測定方法

Now で取得できる時間の最小単位は秒のため経過時間測定には少々おおざっぱです。そこで、今回は Timer を使ってミリ秒単位で測定することとします。


◇ フォームの修正

まず、経過時間を表示するフィールドを実行時間欄に追加します。


項目 フィールド名 種類 補足
経過時間 LogElapsedTime 数値 編集可能 少数 2 桁


◇ スクリプトライブラリの修正

まず、(Declarations) に開始時点の Timer 値を記録する変数宣言を追加します。

         ・・・
'カウンタ
Private xlMessage As Long      '通常ログ出力件数
Private xlError As Long             'エラーログ出力件数

'経過時間管理
Private xsgST As Single            '実行開始時の Timer 値

初期化関数である LogOpen で Timer 値を代入します。

Public Function LogOpen(ByVal vsLogTitle As String) As Boolean
         ・・・
   If xbIsOpen = True Then Exit Function


   '時間管理
   xsgST = Timer()

   'ログ文書の作成
         ・・・

最後に終了処理で経過時間を記録します。

Private Function xLogClose() As Boolean
         ・・・
      xndLog.LogEndTime = Now

      '経過時間
      xndLog.LogElapsedTime = Timer() - xsgST


      xndLog.LogMessageCount = xlMessage
         ・・・

これで、実行時間欄に経過時間が表示されます。


ログ間の経過時間の記録

続いては、ログの出力間隔の経過時間を記録する機能を作ります。この作業はスクリプトライブラリの修正だけで対応します。


◇ 初期設定

この処理で使用する変数を(Declarations) に追加します。経過時間は紫色で表示するのでそのフォント変数と経過時間等の変数を 2 つ追加します。

         ・・・
'フォント定義
Private xnrtsDT As NotesRichTextStyle        'ログ時刻
Private xnrtsMsg As NotesRichTextStyle     '通常のメッセージ
Private xnrtsErr As NotesRichTextStyle       'エラーメッセージ
Private xnrtsET As NotesRichTextStyle        '経過時間
         ・・・
'経過時間管理
Private xsgST As Single             '実行開始時の Timer 値
Private xsgPrev As Single         'ひとつ前のログ出力時の Timer 値
Private xsgET_TH As Single    '経過時間の閾値(秒)

         ・・・

経過時間用のフォント設定を初期化に追加します。

Private Function xInitFont(vnrti As NotesRichTextItem)
         ・・・
   '経過時間
   Set xnrtsET = xns.CreateRichTextStyle()
   xnrtsET.NotesColor = 11     '濃い紫
   xnrtsET.FontSize = 10
   xnrtsET.NotesFont = vnrti.GetNotesFont(sFont, True)
   xnrtsET.Bold = False

End Function

経過時間は一番左に小数点揃え表示するため、段落の設定を調整します。

Private Function xInitParagraphStyle()
   '通常のメッセージ
   Set xnrtpsMsg = xns.CreateRichTextParagraphStyle()
   xnrtpsMsg.FirstLineLeftMargin = 1 * RULER_ONE_INCH
   xnrtpsMsg.LeftMargin =
8.5 * RULER_ONE_CENTIMETER
   Call xnrtpsMsg.SetTab(3.5 * RULER_ONE_CENTIMETER, TAB_DECIMAL)
   Call xnrtpsMsg.SetTab(8.0 * RULER_ONE_CENTIMETER, TAB_RIGHT)

End Function

この設定を行うことにより段落は次のように設定されます。

初期化処理である LogOpen で経過時間に関連する変数を初期化します。次のログ出力までの経過時間を知るために、開始時間を xsgPrev に保管しておきます。

Public Function LogOpen(ByVal vsLogTitle As String) As Boolean
         ・・・
   If xbIsOpen = True Then Exit Function


   '時間管理
   xsgST = Timer()
   xsgPrev = xsgST
   xsgET_TH = 0.5     ' 処理時間出力閾値

         ・・・

なお、処理時間を出力する閾値は、とりあえず 0.5 秒としておきます。


◇ 経過時間の算出と出力

ログ間の経過時間の計算は単純です。現在の Timer 値と前回の Timer 値 xsgPrev の差をで算出します。算出後は次のログに備えて xsgPrev に現在の値をセットします。

Private Function xPrintLog(ByVal vbIsError As Boolean, ByVal vsMessage As String) As Boolean
   Dim sgET As Single
   Dim sgNow As Single

   '経過時間
   sgNow = Timer()
   sgET = sgNow - xsgPrev
   xsgPrev = sgNow


   '通常ログのスタイル適用
   Call xnrti.AppendParagraphStyle(xnrtpsMsg)

   '経過時間を次を右寄せにするためのダミータブ
   Call xnrti.AddTab(1)


   '経過時間
   If sgET >= xsgET_TH Then
      '閾値を越えているので出力
      Call xnrti.AppendStyle(xnrtsET)
      Call xnrti.AppendText(Format(sgET, "#.00"))
   End If
   Call xnrti.AddTab(1)

         ・・・

経過時間は、閾値を超えた場合に出力します。出力項目である経過時間、時刻、メッセージの間にはタブをセットします。段落設定と合わせると、次のように体裁よく表示されます。

なお、経過時間の検証を行うにはスクリプトを一時停止する必要があります。デバッガでステップ実行するか Sleep 関数を使うと確認できます。

      If i = 5 Then Sleep 5     ' 5 秒停止


まとめ

今回は経過時間の測定と出力に対応しました。

ミリ秒単位の測定に使用した Timer 関数については過去の記事『実行時間の計測(Timer 関数)』を参照ください。また、ログの出力では少々細かいタブの設定を利用しました。タブの設定と動作については『リッチテキスト:#9)タブの設定』を参考にしてください。


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


2025/09/27

共通部品にチャレンジ:#8)LotusScript 実行ログ - 日付順ビューの作成

ログ出力ができるようになったので、ログを見やすく表示するビューが必要ですね。


使用するフィールド

ビューの作成で利用できるフィールドをまとめます。

項目 フィールド名 種類 補足 / 式
開始時刻 LogStartTime 日付/時刻  
DB 名 DBTitle テキスト  
タイトル Title テキスト 処理の名前、または、エージェント名
エラーフラグ IsError テキスト 1 = エラーあり
エラー LogError テキスト  最後のエラーメッセージ
実行サマリー LogSummary テキスト  最後のサマリーメッセージ
実行ユーザ名 UserName  名前  

エラーと実行サマリは出力関数をコールするたびに上書きしますので ”最後” に出力されたメッセージとなります。


ビューの作成

サンプルとして最初に掲載した画像のビューを作成します。年/月/日でカテゴライズして、日付順に表示します。

ビューの各列と設定をまとめました。列名に ( ) が付いているのは非表示列です。また、設定の ↓ は降順、▼ はカテゴリ列を表します。

列名 設定 補足 / 式
1 (背景色)   @If(
   IsError = "";
      (-1):(-1):(-1):(-1):(-1):(-1);
      255:255:240:(-1):(-1):(-1)
)
2 (年) @Year(LogStartTime)
3   ↓▼ @Text(@Year(LogStartTime)) + " 年"
4 (月) @Month(LogStartTime)
5   ↓▼ @Month(LogStartTime)
6 (日) @Day(LogStartTime)
7   ↓▼ @Text(@Day(LogStartTime)) + " 日"
8 開始 LogStartTime
9 DB名 DBTitle
10 タイトル Title
11 (背景色&文字色) @If(
   IsError = "";
      (-1):(-1):(-1):(-1):(-1):(-1);
      255:255:240:255:0:0
)
12 エラー / サマリ @If(
   IsError = "";
      LogSummary;
      LogError
)

エラーのログは目立つように背景を黄色、エラーメッセージを赤で表示します。列番号 1 と 11 でコントロールしています。この設定方法については『ビューで条件に応じて色を設定する方法』を参照してください。

今回はサンプルとして、ログを日付順に表示するビューを作成しました。実際に利用する際には、DB 別、ユーザ別、エラーのみのビューなどがあると便利です。必要に応じて作成しましょう。


次回予告

基本的な機能が完成したので、今後はログ出力であったらいいな的な機能を順に追加していきます。次回は、処理時間を測定する機能を追加します。スクリプト全体の処理時間だけでなく、ログ出力間の処理時間が閾値を越えると表示機能も作ります。


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


2025/09/26

共通部品にチャレンジ:#7)LotusScript 実行ログ - 基本機能のテスト

前回までに作成したスクリプトライブラリの動作確認をします。簡単なサンプルプログラムを作成して、ライブラリの使い方と実行結果を確認しましょう。


エージェントの作成とテスト

新規でエージェントを作成します。名前には別名を付けた方がテストになりますね。トリガーはアクションメニューから実行として、対象は ”なし” とします。

サンプルで作成するプログラムは、1 ~ n までの総和を求めるプログラムです。計算の経過をログに出力します。

Option Declare
Use "StdLog"    '実行ログ の組み込み

Sub Initialize
   Dim i As Integer
   Dim iMax As Integer
   Dim iSum As Integer
   Dim s As String

   On Error GoTo ErrProc

   '初期化
   iMax = 10

   'ログの開始
   Call LogOpen("StdLog のテスト")
   Call PrintLog("1 ~ " & CStr(iMax) & " までの総和を求めます...")

   '1 ~ iMax までの総和を計算
   For i = 1 To iMax
      s = CStr(i) & ") " & CStr(iSum) & " + " & CStr(i) & " = "
      iSum = iSum + i
      '計算経過の出力
      Call PrintLog(s & CStr(iSum))
   Next

   Call PrintSummary("1 ~ " & CStr(iMax) & " までの総和は " & CStr(iSum) & " です。")

   'ログの終了
   Call LogClose()

   Exit Sub

ErrProc:
   Call PrintError(Error$ & " (Err = " & CStr(Err) & ", Erl = " & CStr(Erl) & ")")
   End
End Sub

ライブラリの使い方は、

  1. ライブラリ StdLog を Use で呼び出す
  2. LogOpen 関数でログ出力を開始
  3. PrintLog など Print* 関数でログを出力
  4. 最後に LogClose をコールしてログ出力を終了
となります。

実際に実行すると次のような文書が作成されます。


エラーログの出力のテスト

サンプルプログラムでは、不測の事態に備え On Error でエラー処理を記述しており、エラー発生時には PrintError 関数でそのエラー情報を出力しています。

その動作確認のため、For ループ内の最後の行にエラーを強制的に発生させます。

      Error 1000, "検証のために発生させたエラー"

実行結果を確認するとログ内では赤字でラーメッセージが表示され、エラーの箇所が一目瞭然ですね。

なお、エラーが発生した場合、End 命令でスクリプトを終了しています。LogClose をコールせずに終了しているのですが、『StdLog: LogClose() が実行されずに終了しました...』と出力されています。Terminate の設定が正しく動いていることが確認できます。


次回の予定

テスト実行できるようになり、ログがたまってくるとビューが欲しくなります。そこで、次回はログを見やすく表示するビューを作成します。


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