出直し!! ヘルプ

連載中

連載 終了

2023/05/28

Notes - Excel 連携:#10)フィルターの設定

これまで、ノーツデータをExcel シートに一覧出力する方法を記載してきました。今回は、フィルターを設定する方法です。以前記載した Notes - Excel 連携:#7 ウィンドウ枠の固定と組み合わせると使いやすいシートになりますね。


フィルターの設定

フィルターを設定するには、Range オブジェクトの AutoFilter メソッドを使用します。

Range.AutoFilter メソッド (Excel)

Microsoft Learn によると、多数の引数が定義されていますが、どれも省略可能となっています。すべて省略すると、Range の範囲でフィルターがセットされるようです。

私はずぼらなんで、以下のように記述し、1行目全体にセットしています。

   Call oXls.Rows("1:1").AutoFilter()

ちなみに、Rows は、行を表すプロパティです。#5 で列にアクセスするプロパティの Colmuns を紹介しましたが、その”行”版ですね。


ノーツデータをExcel シートに一覧出力

これまでの内容をまとめてコードにすると以下のようになります。

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim ndc As NotesDocumentCollection
   Dim nd As NotesDocument

   Dim oXls As Variant
   Dim oSheet As Variant

   Dim i As Integer

   '選択文書取得
   Set ndb = ns.CurrentDatabase
   Set ndc = ndb.UnprocessedDocuments

   'Excel の準備
   Set oXls = CreateObject("Excel.Application")
   Call oXls.Workbooks.Add
   Set oSheet = oXls.Workbooks(1).WorkSheets(1)

   '#5)列フォーマットを設定
   oSheet.Columns(1).NumberFormatLocal = "yyyy/m/d hh:mm"
   oSheet.Columns(2).NumberFormatLocal = "#,##0.0_ "
   oSheet.Columns(3).NumberFormatLocal = "@"

   'ヘッダ行の準備
   oSheet.Cells(1, 1).Value = "日付"
   oSheet.Cells(1, 2).Value = "数値"
   oSheet.Cells(1, 3).Value = "テキスト"
   '行フォーマットをテキストに指定
   oSheet.Rows(1).NumberFormatLocal = "@"

   '#4)ノーツ文書をワークシートに出力
   For i = 1 To ndc.Count
      Set nd = ndc.GetNthDocument(i)
      oSheet.Cells(i+1, 1).Value = nd.Fld_DT(0)
      oSheet.Cells(i+1, 2).Value = nd.Fld_Num(0)
      oSheet.Cells(i+1, 3).Value = nd.Fld_Text(0)
   Next

   '#7)ウィンドウ枠の固定
   oXls.ActiveWindow.SplitRow = 1
   oXls.ActiveWindow.FreezePanes = True

   '#10)フィルターの設定
   Call oXls.Rows("1:1").AutoFilter()

   oXls.Visible = True
End Sub


実行すると選択文書の内容を Excel に一覧出力し、1行目はスクロールが固定され、フィルター機能が有効となります。

実際に利用される際には、ヘッダ行やフォーマット、フィールド名は適宜変更し、調整ください。




前回 Notes - Excel 連携 次回

2023/05/24

『宛先選択』画面とドミノディレクトリ

ノーツメールで宛先を入力する画面があります。『宛先の選択』っていうダイアログの画面です。

この画面、シンプルなようでいろいろな機能があります。例えば、『ディレクトリ』です。こちらは、サーバのユーザ一覧である”ドミノディレクトリ”と自分の連絡先DB(個人アドレス帳)を切り替える機能と思われがちですが、それ以外の別のドメインのディレクトリを切り替えたり、特殊な用途のディレクトリを切り替えることができます。この機能は、グループ会社ごとでディレクトリを分けたり、グルーバルな会社で国やリージョンでディレクトリを分けた場合など、比較的規模が大きい環境で効果がある機能です。

今回話題にしたいのは、右上の『ビュー』という機能です。コンボボックスを開くと以下のような選択肢が表示されます。

  • 名前によるリスト
  • Notes 名の階層
  • 組織の階層
  • 言語による分類

これを切り替えると、左のリストボックスの表示が切り替わります。上記の画面は、『名前によるリスト』です。これを『Notes 名の階層』と切り替えると以下のようになります。

この画面は、ノーツユーザを組織でカテゴライズして表示しています。グループは組織がないので、”(階層なし)”と表示されています。

この機能、どうやって実現しているかというと、画面の表示の通り『ビュー』を切り替えることにより実現されています。ドミノディレクトリをデザイナーで開いて以下のビューを確認してください。

ビューの選択肢ドミノディレクトリの設計要素名
名前によるリスト($PeopleGroupsFlat)
Notes 名の階層($PeopleGroupsHier)
組織の階層($PeopleGroupsCorpHier)
言語による分類($PeopleGroupsByLang)

例えば、”($PeopleGroupsFlat)”ビューを開くと、以下のようになります。

このビューが、『宛先の選択』ダイアログに表示されていることが確認できますね。ノーツを構成している要素が、通常のノーツの設計で構成されていることがわかります。

こういった内部的な機能であってもユーザ(開発者)レベルで確認できるのが、ノーツの面白いところですね。

2023/05/21

リッチテキスト:#4)インデント

今回のテーマは、リッチテキスト内の文字のインデントとアウトデントです。メールをはじめノーツで文章を書く場合、体裁を整えるために頻繁に使いますよね。

ノーツクライアントの操作では、ショートカットキーを使用して操作すると便利です。
F8 キーでインデント、Shift + F8 でアウトデントの操作になります。F7 キーを使用すると1行目だけのインデント、Shift + F7 で1行目だけをアウトデントできます。

また、同様の操作はルーラを表示するとマウスで操作することもできます。ルーラの ▽ が1行目の設定、△ が2行目以降の設定となります。また、△ の下の長方形で、1行目2行目をセットで操作できます。

このインデントの設定は、上図の通り、改行で区切られた1行ごとに設定できます。ノーツではこの単位を”段落”と呼びます。LotusScript では、この段落を操作するために NotesRichTextParagraphStyle クラスが用意されています。

NotesRichTextParagraphStyle (LotusScript®)

様々なプロパティとメソッドが用意されていますが、インデントに関する設定は、以下の2つです。

プロパティ用途
FirstLineLeftMarginその名の通り、1行目の左マージンです。
LeftMargin2行目以降の左マージンを表します。
すべての行の左マージンをセットするには、FirstLineLeftMargin も同じ値にセットします。


NotesRichTextParagraphStyle の使い方

まず、NotesRichTextParagraphStyle の作成です。このクラスのオブジェクトは、NotesSession クラスの CreateRichTextParagraphStyle メソッドを使用します。

CreateRichTextParagraphStyle (NotesSession - LotusScript®)

作成したオブジェクトに対して、マージンの設定を行い、段落のスタイルを準備します。
そして、その設定をリッチテキストに反映します。その操作を行うのが、NotesRichTextItem クラスの AppendParagraphStyle メソッドになります。

AppendParagraphStyle (NotesRichTextItem - LotusScript®)

これで、リッチテキストに段落のスタイルがセットされました。以降、リッチテキストに文字を追加するとこのスタイルがセットされることになります。

具体的なサンプルコードは以下のようになります。

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument
   Dim nrti As NotesRichTextItem
   Dim nps As NotesRichTextParagraphStyle

   Set ndb = ns.CurrentDatabase
   Set nd = ndb.CreateDocument()

   nd.Form = "RichText"
   nd.Title = "リッチテキスト:#4)インデント"

   Set nrti = nd.CreateRichTextItem("Body")
   Set nps = ns.CreateRichTextParagraphStyle()

   '1行目
   Call nrti.AppendText("デフォルトのルーラ位置")

   '2行目
   nps.Leftmargin = 1.25 * RULER_ONE_INCH
   nps.Firstlineleftmargin = nps.Leftmargin
   Call nrti.AppendParagraphStyle(nps)

   Call nrti.AppendText("F8 キー分インデント。")

   '3行目
   nps.Firstlineleftmargin = 1.5 * RULER_ONE_INCH
   Call nrti.AppendParagraphStyle(nps)

   Call nrti.AppendText("F7 キー分だけ1行目をインデント。")
   Call nrti.AppendText("文字を折り返しさせると1行目だけが")
   Call nrti.AppendText("インデントされていることがわかります。")

   Call nd.Save(True, False)
End Sub

実行すると以下のように、行(段落)毎にインデントがセットされたリッチテキストが作成されます。

AppendParagraphStyle を実行すると段落が変更されますので、自動的に改行されることになります。


マージンの単位

ちなみに、これらプロパティでセットするマージンの値(単位)は、twip です。それぞれ、

  • 1 cm = 567 twip
  • 1 inch = 1440 twip

という関係になっています。コーディングでは以下の2つの定数が利用できます。

定数名
567RULER_ONE_CENTIMETER
1440RULER_ONE_INCH

なお、ノーツのデフォルトの左マージンは、2.54 cm となっていて中途半端な値です。上記定数を使用して計算すると、1 インチであることがわかります。
また、F7 / F8 キーでの移動量は、0.635 cm なのですが、これは 0.25 inch です。

これなら覚えやすいですね。

前回 リッチテキストの基本操作 次回

2023/05/17

ビューに文字でチャートもどきを表示

ノーツでアプリを作ていると、時間帯をチャートで表示したいってことがまれにありますよね。例えば以下のようなビューです。

実際に作成しようと思うと、なかなか面倒です。列ごとに式が微妙に変わりますし、バグも出しやすい設計と言えます。以前作ったときに再利用しやすいよう、整えた式があります。今回はそれを紹介します。


この式は、画面の通り1時間ごとに列を作成し、その列にあった式を記述します。列ごとで違う部分については、式の最初にパラメータとしてセットするようにしています。準備したパラメータは以下の6種類です。

パラメータ変数 用途
xTargetH何時の列かを指定
xUnitMins何分を1文字で表示するか
xST開始時刻
xED終了時刻
xSTR_Null開始-終了時刻 範囲外のあらわす文字
xSTR_Fill開始-終了時刻 範囲内のあらわす文字


各列にセットする実際の式は以下の通りです。

xTargetH := 9; となっているので、9 時台の列用の式で、10分間を1文字で表すようしています。StatTime と EndTime は文書内に保存された時刻情報(フィールド)となります。

REM {パラメータセット};
xTargetH := 9;
xUnitMins := 10;
xST := StartTime;
xED := EndTime;

xSTR_Null := "-";
xSTR_Fill := "*";

REM {分割数を算出};
xUnits := @Integer(60/xUnitMins+0.99);

REM {開始時刻が何個目か算出};
xST_Units := ((@Hour(xST)*60 + @Minute(xST)) - (xTargetH*60))/xUnitMins;
xST_Units := @If(
   xST_Units < 0;
      @Integer(xST_Units-0.99);
      @Integer(xST_Units)
);

REM {終了時刻が何個目か算出};
xED_Units := ((@Hour(xED)*60 + @Minute(xED)) - (xTargetH*60))/xUnitMins;
xED_Units := @If(
   xED_Units < 0;
      @Integer(xED_Units-0.99);
      @Integer(xED_Units)
);

REM {開始と終了が同じ場合マークを表示するよう修正};
xED_Units := @If(xST_Units = xED_Units; xED_Units + 1; xED_Units);

REM {表示する文字列を算出};
@If(
   xST_Units <= 0;
      @If(
         xED_Units < 0;
            @Repeat(xSTR_Null; xUnits);
         xED_Units >= xUnits;
            @Repeat(xSTR_Fill; xUnits);
            @Repeat(xSTR_Fill; xED_Units)
                              + @Repeat(xSTR_Null; xUnits-xED_Units)
      );
   xST_Units >= xUnits;
      @Repeat(xSTR_Null; xUnits);
      @If(
         xED_Units < xST_Units;
            @Repeat(xSTR_Null; xUnits);
         xED_Units >= xUnits;
            @Repeat(xSTR_Null; xST_Units)
                             + @Repeat(xSTR_Fill; xUnits-xST_Units);
            @Repeat(xSTR_Null; xST_Units)
                             + @Repeat(xSTR_Fill; xED_Units-xST_Units)
                             + @Repeat(xSTR_Null; xUnits-xED_Units)
      )
)


少し長い式にはなりますが、パラメータのセット以降は、変更する必要がないようにして、メンテナンス性を向上させています。このような構造にしておくと、8時 ~ 18時、24時間表示など要望が変わっても、簡単に対応できます。

また、5分間を1文字で表すような仕様変更も、xUnitMins := 5; とパラメータを変更して列幅を整えるだけで対応できますね。


2023/05/14

Notes - Excel 連携:#9)アクティブ ウィンドウってなんだろ?

Notes - Excel 連携:#7 で SplitRow や FreezePanes プロパティを紹介しました。

Microsoft Learn によると、これらプロパティは”アクティブ ウィンドウ”であることが前提となっています。#7 のコードでは、ActiveWindow プロパティから取得した Window オブジェクトなので問題ないといえます。

ただ、少し気になったので、少し実験してみました。以下のように、Excel のワークブックを2つ開き、Window オブジェクトを2つ作成。Window オブジェクトは、ActiveWindow プロパティを使わず、Windows コレクションオブジェクトから取得しています。

Set oXls = CreateObject("Excel.Application")
Call oXls.Workbooks.Add
Call oXls.Workbooks.Add

'Window 1
oXls.Windows(1).SplitRow = 1
oXls.Windows(1).FreezePanes = True

'Window 2
oXls.Windows(2).SplitRow = 2
oXls.Windows(2).FreezePanes = True

oXls.Visible = True

私は、”アクティブ ウィンドウとはフォーカスを持ったウィンドウ”だと思っていました。LotusScript で言うと、NotesUIWorkspace の CurrentDocument のようなイメージと解釈していました。

結果は、どちらの Excel(ワークブック)も正常に『ウィンドウ枠の固定』が設定されていました。うまくいって良かったのですが、私の想定は間違いでした。

そもそも、”oXls.Visible = True” を最後に実行しているので、UI には何も表示されておらず、フォーカスを持っているはずないですしね...

試しにネットで検索してみると、FreezePanes プロパティは、ウィンドウが最小化されている状態ではエラーが出るそうです。この場合は、”アクティブ”ではないということなのでしょうか...? Excel は難しいですね。

今回は結論がない記事で申し訳ないのですが、今日はこの辺で...

前回 Notes - Excel 連携 次回

2023/05/10

統計レポートとフォーム式

以前紹介した統計レポートについて、サーバ管理者的な側面から機能を説明しました。

今回はこの統計レポートについて、アプリ開発の側面から面白い機能が入っているのでご紹介します。


まずは、その機能を確認します。

統計レポートの[システム]ビューから文書を開くと、『統計モニター: 統計レポート』のタイトルで、ディスクドライブの情報やメモリの情報などサーバに関する統計情報が表示されます。


続いて、[メール&データベース]ビューから文書を開くと『統計モニター: メール & データベースレポート』のタイトルで、メールの送受信数など配信状況が表示されます。


文書のプロパティでそれぞれのフォーム名(Form フィールド)を確認するとどちらも "Statistics Report" で同じフォームが指定されています。


設計を開きフォームの一覧を確認すると、フォームが複数あります。


別名が "Statistics Report" となっているフォームを確認すると、[システム]ビューから文書を開いたときのデザインになっています。


[メール&データベース]ビューで表示したフォームは、”メール&データベース レポート(_M)”という名前になっていて、別名も"MDBR" となっており "Statistics Report" ではありません。


同じ文書をフォームを切り替えて表示しているような動作になっています。これを実現しているのがビューの『フォームの式』です。フォーム式は、このビューから開く文書をどのフォームで開くか指定する機能です。

[メール&データベース]ビューの設計を開き、オブジェクトの一覧の『ビューの選択』の次にある項目です。フォーム式は、以下のようになっています。

   @If(@IsNewDoc;form;"MDBR")


ビューに表示されている文書は新規文書ではないので、この式の結果は "MDBR" となります。これで、このビューから開く文書は、"MDBR" の別名が付いた”メール&データベース レポート(_M)”フォームで開くという動作になります。



このフォームを切り替えする機能は、ワークフローアプリなどで立場やステータスに応じて重要な項目を画面上部に配置し強調したり、印刷用のフォームで開きたい場合などに応用できます。

ノーツは、文書(データ)とフォーム(画面デザイン)は別物であるというわかりやすい事例ですね。

2023/05/07

リッチテキスト:#3)添付ファイルの作成

今回は、リッチテキストフィールドにファイルを添付する方法を確認しましょう。

ファイルを添付するには、NotesRichTextItem クラスの AppendDocLink メソッドを使用します。このメソッドは、添付ファイルのほかに、オブジェクトを埋め込んだり、オブジェクトリンクを貼り付けたりできます。今回は、一般に利用する既存ファイルを添付する方法についてのみ記載します。

このメソッドの構文と引数は、以下の通りとなります。

Call notesRichTextItem.EmbedObject( type%, class$, source$ )

  • Type%

数値型。以下の中から指定します。今回は添付ですので、別途定義された定数の EMBED_ATTACHMENT もしくは 1454 をしています。 

定数
1454 EMBED_ATTACHMENT
1453 EMBED_OBJECT
1452 EMBED_OBJECTLINK

  • class$

String 型。空のオブジェクトを埋め込む場合に使用する引数。既存ファイルを添付するの場合、null (空の文字列)を指定します。

  • source$

String 型。添付するファイルを指定します。  


例えば、以下のサンプルは、Dドライブ直下にあるテキストファイルを添付します。

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument
   Dim nrti As NotesRichTextItem

   Set ndb = ns.CurrentDatabase
   Set nd = ndb.CreateDocument()

   nd.Form = "RichText"
   nd.Title = "リッチテキスト:#3)添付ファイルの作成"

   Set nrti = nd.CreateRichTextItem("Body")
   Call nrti.AppendText("以下にファイルを添付します。")
   Call nrti.AddNewLine(1)
   Call nrti.EmbedObject(EMBED_ATTACHMENT, "", "D:\RichTest#3.txt")

   Call nd.Save(True, False)
End Sub


実行すると、以下のようなります。


ノーツクライアントから添付したときのように、ファイルに関連付けされたアイコンはセットされず、グレーの紙(?)の無機質なアイコンとなります。

また、ファイル名はアイコンの下ではなく、右横となります。また、画像ファイルのサムネイル表示もされません。ご注意ください。

どういった理由でこのような仕様となっているのかは知りませんが、ちょっと残念です...

 

前回 リッチテキストの基本操作 次回

2023/05/05

統計レポートの確認

前回は、統計レポートの収集方法についてまとめました。今回は収集された情報について整理します。統計情報は、events4.nsf の設定に従い、自動的に statrep.nsf 『統計モニター』データベースに記録されます。

まずは、その文書を確認しましょう。


統計レポートの確認

『統計モニター』データベースを開き、左のメニューの [統計レポート] を確認します。『カレンダー&スケジュール」や「システム」など、統計指標毎にサブメニューが用意されています。参照したい指標をクリックすると右側にその指標の代表的な統計情報がビューに表示されます。


文書を開くと統計情報の詳細が確認できます。


統計情報の種類

統計指標の一覧は、events4.nsf 内に存在します。データベースを開き [詳細] - [統計名] ビューを開いてください。指標の名前、タイプと説明が一覧表示されます。


ただ、残念なことに説明は日本語化されいません。これが日本語化され、統計レポートフォームのラベルと一致してもらえると、もっと活用しやすくなると思うのですが...


統計情報の指標名とフィールド名

なお、この統計指標名は統計レポート文書のフィールド名と一致しています。指標名=フィールド名であることを理解しておくと、注視したい指標だけを表示するビューを作成する場合などに便利です。


2023/05/03

統計レポートの設定

Domino サーバには標準でシステムをモニターする機能が用意されています。

今回は、その中の統計レポートについて紹介します。Domino サーバは、稼働中に発生する様々なイベントを収集しながら運用しています。このイベントを統計的に参照する機能が統計レポートです。

まずは、統計情報を確認してみましょう。

Domino Administrator クライアントを起動して、[サーバー] - [統計] タブを開きます。その時点のすべての統計情報が収集され表示されます。各指標は階層化されおり、必要な指標が探しやすくなっています。グラフのようなアイコンが指標で、コロンの左が指標名、右がその値となります。




サーバコンソールから show stat コマンドを実行することで、統計情報を一覧表示できます。こちらは、コンソール上にテキストデータとして表示されます。




この表示では、= の左が統計指標名、右がその値、で構成されています。このドット区切りの指標が正式な名称で、[サーバー] - [統計] タブでは、このドットの単位で階層化して表示されています。


統計レポートの構成要素

上記機能はその瞬間の統計情報を確認する機能でした。この統計情報を定期的に収集させる機能が統計レポートです。うまく活用すると稼働状況のトレンドを得ることができます。

統計レポートの構成要素は以下の通りです。

  • events4.nsf

『統計 & イベント』や『Monitoring Configuration』と呼ばれるデータベースです。統計レポートの収集設定を行うデータベースです。

  • statrep.nsf

収集した統計レポートを保存するデータベースです。 『統計モニター』や『Monitorring Results』と呼ばれます。

  • collector タスク

events4.nsf の指定に従い統計情報を収集するサーバタスクです。


events4.nsf の設定

events4.nsf を開き、左のメニューから [統計収集] を開きます。[新規統計の集計] ボタンをクリックして、設定を新規作成します。

[基本] タブでは、収集を実行するサーバと統計情報を収集されるサーバを指定します。自身のサーバだけでなく、他のサーバの統計情報を収集できますので、1台で複数のサーバの情報収集を任せることができます。


[オプション] タブでは、収集した統計を保存するデータベースを指定します。また、収集する間隔の指定や収集する統計指標をフィルタリングすることができます。


collector タスクの起動

events4.nsf の設定が終われば、collector タスクを起動します。

サーバ再起動時に自動的に稼働させるために、サーバの notes.ini の  ServerTasks 行に collect を追加します。

ServerTasks=Replica,Router,・・・・,HTTP,collect


起動すると、サーバタスクの一覧にタスク『Statistic Collecor』が表示されます。


統計情報の収集が開始されると、statrep.nsf に文書が生成されます。

statrep.nsf が存在しない場合は自動的に生成されます。なお、作成されるデータベースは、テンプレート statrep.ntf を引き継いだ状態で作成されます。


保存期間の設定

今回の設定を行うと、収集間隔毎に文書が自動作成されます。放置すると大量の文書が保存され、データベースが肥大化するので、対策をしましょう。

複製オプションの [スペースセーバー] タブの『次の日数内に変更がない文書を削除する』にチェックを入れ、日数を指定すると、自動的に古い統計情報は削除してくれます。