Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

今日から始める LotusScript - Domino クラスライブラリの使い方(Version 1.1)

13,184 views

Published on

LotusScript の使い方については Domino Designer のヘルプに詳細が載っています。私自身、過去にヘルプを読んで始めました。ただ、分量が多く、最初にヘルプのみだとどれから手を付ければよいのか?で悩みます。そこで、Domino クラスライブラリに焦点をあてて、「よく使用する」または「重要なもの」に厳選する形で資料にまとめました。(以前の資料に加筆・修正しました)

Published in: Software
  • Login to see the comments

今日から始める LotusScript - Domino クラスライブラリの使い方(Version 1.1)

  1. 1. 今日から始める LotusScript Domino クラスライブラリの使い方 株式会社ソルクシーズ 吉田 武司 1 2018/06/18 Version 1.1
  2. 2. 特記事項  本資料の掲載内容は、できる限り正確を期するよう に努めてはおりますが、い かなる明示または暗黙の 保証も責任も負いかねます。  本資料の情報は、使用先の責任において使用され るべきものであることを、あ らかじめご了承ください。  掲載情報は不定期に変更されることもあります。他 のメディア等に無断で転載 する事はご遠慮下さい。  当資料をコピー等で複製することは、執筆者の承諾 なしではできません。  当資料に掲載された製品名または会社名は それぞれの各社の商標または登録商 標です。 2
  3. 3. はじめに 3
  4. 4. きっかけ  LotusScript の使い方については Domino Designer のヘルプに詳細が載っていま す。私自身、過去にヘルプを読んで始めました。ただ、分量が多く、最初にヘ ルプのみだとどれから手を付ければよいのか?で悩むかと思います。  BASIC 言語ですので、Excel などのVBA(Visual Basic forApplications)等のプロ グラミング経験があれば、比較的スムーズに習得できますが、それでも Notes/Domino の特有の部分があります。  そこで、以下に焦点をあてて資料にまとめることにしました。  Domino クラスライブラリの使用に焦点をあてる(NotesDatabase や NotesView など、 Notes/Domino のオブジェクト・データの操作に使用するクラス)  「よく使用する」または「重要なもの」に厳選する 4
  5. 5. 当資料の対象者  LotusScript の学習を始めた人を対象として想定しています。  アプリケーション開発でよく使用する Domino クラスライブラリの使い方から今後学習を進 めていくための取っ掛かりになればと考えて作成しています。  フォームやビュー、簡単な式言語など、Notes/Domino アプリケーションの開発 の基礎的な部分はある程度理解していることを前提としています。  Domino Designer の使い方および一般的なプログラミング用語(クラス、変数、 型など)については触れていません。詳細は、ヘルプなどを参照ください。 5
  6. 6. 前提  最初からすべてを把握するのは大変なので、別の方法がある・説明を省略して いる場合があります。中級・上級と進む中で詳細は徐々に把握して行きましょ う。  プログラムの例外処理などは省略しています。  Notes/Domino の [アプリケーション] は、以前のバージョンでは [データベース] と呼ばれていました。そのため、資料によっては記述が異なる場合があります。 クラス名では、データベースが使用されているため、当資料では、基本 [デー タベース] と記述しています。 6
  7. 7. 使用するアプリケーション/データベースの説明  アプリケーション/データベースには、以下の設計要素がある前提です。  フォーム:製品:fmProduct  フィールド  製品 ID:ProductID:テキスト  製品名:ProductName:テキスト  価格:Price:数値  ビュー:全製品一覧:vwAll  選択式  SELECT deleteFlag != "1 "  列  製品 ID:ProductID  製品名:ProductName  価格:Price 7
  8. 8. LotusScript の記述場所  基本、後述するプログラムは、同一アプリケーション/データベース内のエー ジェント(LotusScript)として作成します。 8 対象は「なし」 タイプは「LotusScript」 「Initialize」に記述
  9. 9. プログラムの実行と結果の確認  基本、メニューバーのアクションからエージェントを実行します。  ステータスバーをクリックして結果を確認します。 9 注意 ステータスバーでは、同じ結果が続く場合、重複して 表示されません。そのため、同じ結果になるエージェ ントを連続実行しても結果は一行のみです。 下図の場合、エージェントを3回実行しても 「CN=Administrator/O=test CN=Administrator/O=test CN=Administrator/O=test」とはならず、 「CN=Administrator/O=test」の一行のみになります。 テスト時にはご注意ください。
  10. 10. 行番号の表示方法  メニューバー [ファイル] - [プリファレンス (設定)] を開きます。  一般  エディター  テキスト・エディター  行番号の表示:有効 10
  11. 11. 概要 11
  12. 12. LotusScript とは  LotusScript は、IBM Notes/Domino アプリケーションで利用可能な BASIC スクリ プト言語です。  式言語では、記述ができない、または難しい処理を行いたい場合に利用します。  エージェント(スケジュール実行を含む)、ボタン、フォームを開く・更新・ 保存・閉じるなどの様々なイベントで実行可能です。  スクリプトライブラリとして作成すると、クラス、関数、および変数を共有す ることができ、開発効率・保守性があがります。  Domino データへのアクセスやクライアントの操作には、Domino クラスライブ ラリを使用します。(以後、クラスと記述します) 12
  13. 13. クラスの種類 バックエンドクラスとフロントエンドクラス ※ 大きく2つに分けることができます。  バックエンドクラス(Database クラス)  データベース、ビュー、文書、その他のオブジェクトへアクセスできます。  ユーザー(クライアント)だけではなく、サーバーも利用できます。  フロントエンドクラス(UI クラス)  ユーザーがクライアントで現在作業中のオブジェクトにアクセスできます。  サーバーは利用できません。(UI・クライアント から操作していないため) 13 例 開いている文書やビューへのアクセス 画面を閉じるなどのクライアント操作
  14. 14. クラスの関係図  バージョン 8 以前の Domino Designer には、右 図のようなクラスの関係図 があり、理解するのに大変 役立ちました。  基本、矢印の元のクラスか ら先のクラスへと辿ってア クセスします。取得したい クラスから遡ればどのよう に辿っていけば良いのかが わかります。  残念ながら 8.5 以降はこの 図はないようです。しかし、 大きな変更はないので以前 の図も参考になります。 14
  15. 15. クラスの一覧  Button  Field  Navigator  NotesACL  NotesACLEntry  NotesAdministrationProcess  NotesAgent  NotesColorObject  NotesDatabase  NotesDateRange  NotesDateTime  NotesDbDirectory  NotesDocument  NotesDocumentCollection 15  NotesDOMAttributeNode  NotesDOMCDATASectionNode  NotesDOMCharacterDataNode  NotesDOMCommentNode  NotesDOMDocumentFragmentNode  NotesDOMDocumentNode  NotesDOMDocumentTypeNode  NotesDOMElementNode  NotesDOMEntityNode  NotesDOMEntityReferenceNode  NotesDOMNamedNodeMap  NotesDOMNode  NotesDOMNodeList  NotesDOMNotationNode  NotesDOMParser  NotesDOMProcessingInstructionNode  NotesDOMTextNode  NotesDOMXMLDeclNode  NotesDXLExporter  NotesDXLImporter  NotesEmbeddedObject  NotesForm  NotesInternational  NotesItem  NotesLog  NotesMIMEEntity  NotesMIMEHeader  NotesName  NotesNewsletter  NotesNoteCollection  NotesOutline  NotesOutlineEntry  NotesRegistration  NotesReplication  NotesReplicationEntry  NotesRichTextDocLink  NotesRichTextItem  NotesRichTextNavigator  NotesRichTextParagraphStyle  NotesRichTextRange  NotesRichTextSection  NotesRichTextStyle  NotesRichTextTab  NotesRichTextTable  NotesSAXAttributeList  NotesSAXException  NotesSAXParser  NotesSession  NotesStream  NotesTimer  NotesUIDatabase  NotesUIDocument  NotesUIScheduler  NotesUIView  NotesUIWorkspace  NotesView  NotesViewColumn  NotesViewEntry  NotesViewEntryCollection  NotesViewNavigator  NotesXMLProcessor  NotesXSLTranformer 多すぎ…どれから見ていけばよいのやら…
  16. 16. よく使用するクラス ※ 最初は、よく使用する以下のクラスから覚えていきましょう。  バックエンドクラス  NotesSession  NotesDatabase  NotesView  NotesDocument  NotesDocumentCollection  NotesItem  NotesAgent  フロントエンドクラス  NotesUIWorkspace  NotesUIDatabase  NotesUIView  NotesUIDocument 16
  17. 17. Hello world! 17
  18. 18. Hello world! (1)  クライアントのステータスバーへ “Hello world!”と表示するエージェント を作成します。  エージェントの名前(任意)を入力します。  タイプ [LotusScript] を選択して、新規エージェントを作成します。 18
  19. 19. Hello world! (2)  [プロパティ] の [基本] タブの実行時の [対象] を [なし] に設定します。 19
  20. 20. Hello world! (3)  新規エージェントを作成すると下図のような画面が開きます。 1. 左に [オブジェクト] タブがあります。 2. [Initialize] をクリックします。 3. 右に Initialize サブルーチンが表示されます。ここにプログラムを記述します。 ※ Initialize は、エージェント実行時に最初に実行されます。 ※ オブジェクトの最上位を選択すると全プログラムが表示されます。 20
  21. 21. Hello world! (4) 21 1行目 Initialize サブルーチンの開始行。変更なし 2行目 Print ステートメントの後に表示したい文字列を指定 今回は、”Hello world!” を指定 文字列は、ユーザー名をクライアントのステータスバーに表示 3行目 Initialize サブルーチンの終了行。変更なし Print の後は、半角スペース
  22. 22. Hello world! (5)  メニューバー [アクション] – [(各エージェント)]を実行します。  ステータスバーをクリックして結果を確認します。 22
  23. 23. Hello world! 補足「オブジェクト」タブ (1)  (Options)  Option Public  モジュールレベルの明示的な宣言が、規定で Public となるように設定します。  変更する必要が無い場合、そのままでよいでしょう。  Public については、Dim ステートメントのヘルプを参照ください。  Option Declare  変数の暗黙の宣言を禁止します。事前に宣言せずに変数を使用するとエラーとなります。綴りミスや意図しない 箇所での宣言を防げます。  Use "[スクリプトライブラリ名]"  今回は使用していませんが、スクリプトライブラリを使用するための宣言ができます。  %REM ~ %END REM  コメントです。プログラムの実行には影響しません。デフォルトでは緑で表示されます。  新規作成時にプログラムの説明(名前、作成日と作成者など)が自動作成されます。プログラムを別の人または 後から自分が見た際に理解し易くなるように説明を追加しましょう。  (Declarations)  変数の宣言に使用できます。 23
  24. 24. Hello world! 補足「オブジェクト」タブ (2)  Initialize  モジュール(エージェント)がロードされると記述したプログラムが実行されます。  Terminate  モジュールがアンロードされると記述したプログラムが実行されます。  終了時に実行したいプログラムを記述するのですが、使用しないことが多く最初は覚えなく てもよいでしょう。 ※ 上記以外にも Sub ステートメント(サブルーチン)、Function ステートメ ント(関数)を追加できます。 24
  25. 25. コメント 25
  26. 26. コメントの記述方法  スクリプト内にコメント記述するには以下の方法があります。 26 2行目 Rem ステートメント(一行のコメント) 先頭に“REM ”を付ける 4行目 シングルクォート/アプストロフィ(一行のコメント) 先頭に “ ’ ”を付ける 5行目 スクリプトの後ろにも記述できます 7-9行目 %Rem 命令(複数行のコメント) コンパイラは、%REM と %END REM の間にあるすべてのテキストを無視します。 Rem ステートメント: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/LSAZ_REM_STATEMENT.html %Rem 命令: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/LSAZ_PCTREM_DIRECTIVE.html
  27. 27. LotusScript のデバッグ スクリプトデバッガ 27
  28. 28. LotusScript のデバッグを有効にする  LotusScript には、デバッグを補助するツールとして、スクリプトデバッガが あります。  LotusScript をステップ(1行)単位で実行でき、変数の値を確認しながら動 作確認/デバッグできるため、とても重宝します。  スクリプトデバッガは、メニューバー [ツール] – [LotusScript のデバッグ] から有効にします。  有効な状態で LotusScript を実行するとスクリプトデバッガが自動で表示さ れます。 28 LotusScript の 実行
  29. 29. スクリプトデバッガ:画面 29 スライドシューにすると GIF アニ メーションとして再生されます。
  30. 30.  実行  エラーまたはブレークポイントまで実行  ステップ イン [F8]キー  ステップ単位で実行  ステップ オーバー [Shift] + [F8] キー  ステップ単位で実行  別のサブプログラム(Sub/Function)を呼び出す処理の場合、呼び出し先のサブプログラムが一度に(裏で)実行され、次 の行に処理が進む  ステップ アウト [Ctrl] + [F8] キー  現在のサブプログラムを最後まで実行  スタックされている次のサブプログラムに処理が移る  停止  直ちに、デバッガを終了  デバッガの終了  直ちに、デバッガを終了  LotusScript のデバッグが無効になる スクリプトデバッガ:機能 30 スクリプトをステップ単位で実行する: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_STEPPING_THROUGH_A_SCRIPT.html 初期の演習では Initialize のみで、 別のサブプログラムが無いため、後で 見直せばよいでしょう [ステップ イン] を使用して デバッグを進める
  31. 31.  ステップ単位では無く、特定の行の前まで処理を一気に進めたい場合、ブレー クポイントを設定して、[実行] ボタンをクリックします。 スクリプトデバッガ:ブレークポイント 31 ダブルクリックで ブレークポイント を指定
  32. 32.  ブレークポイントは、対象の行を選択してダブルクリックして設定します。  もう1回ダブルクリックすると無効になります。  無効の場合、停止しません。  更に1回ダブルクリックすると消去になります。  ダブルクリックする以外に、メニューバーのデバッグから各種選択する方法、 [F9] キーで変更する方法があります。  ブレークポイントが設定できない行もあります。ご注意ください。  Dim ステートメント(変数の宣言)など スクリプトデバッガ:ブレークポイントの設定(有効)/無効/消去 32
  33. 33.  設定したブレークポイントは、[ブレークポイント]タブに一覧で表示されます。 また、ダブルクリックすると設定した行が選択された状態になります。 スクリプトデバッガ:[ブレークポイント]タブ 33
  34. 34. スクリプトデバッガ:[変数]タブ  [変数]タブで、現在の変数の状態を確認できます。目的のオブジェクトが取得 できているのか?値の変更が行われているのか?などを確認できます。 34 例)変数 doc 内のフィールド(Item)の値
  35. 35.  Print ステートメントの出力は、[出力]タブに表示されます。 スクリプトデバッガ:[出力]タブ 35
  36. 36.  [コール]タブには、現在実行スタックにあるサブプログラムのリストが実行順 に表示されます。このリストの一番上には現在実行中のサブプログラムが表示 されます。  LotusScript の学習を進めていくと複数のサブプログラム(Sub/Function)を コールする(呼び出す)場合があります。現時点では、このようなタブがある ことだけを覚えておけば良いでしょう。 スクリプトデバッガ:[コール]タブ 36
  37. 37. 基本的なバックエンドクラス 37
  38. 38. 基本的なバックエンドクラス  NotesSession クラス  実行中の環境を表します。現在のユーザーに関する情報や環境変数などにアクセスできます。  Notes/Domino 利用中の最上位となるクラスの1つです。NotesSession クラスから辿っていく と各バックエンドクラスにアクセスすることができます。  NotesDatabase クラス  データベースにアクセスするためのクラスです。  NotesView クラス  ビュー/フォルダにアクセスするためのクラスです。  NotesDocument クラス  文書にアクセスするためのクラスです。 38
  39. 39. バックエンドクラスとオブジェクトの関係 39 NotesSession NotesDatabase NotesView クライアント/サーバー環境 アプリケーション/ データベース ビュー 文書 オブジェクト クラス NotesDocument
  40. 40. 文書へのアクセスの基本 40 NotesSession NotesDatabase NotesView クライアント/サーバー環境 ビュー 文書 オブジェクト クラス NotesDocument ※ アクセス方法は上記以外にもあります。 Notes クライアントから 文書を手動で開くように アプリケーション/ データベース 各バックエンドクラスから 文書へアクセスする
  41. 41. Step1-1:現在のユーザー名を取得 NotesSession クラス 41 2行目 現在のセッションにアクセスして変数 session に格納 他のクラスとは違って New を使用するのを忘れないように注意 3行目 ユーザー名を格納する変数 user を宣言 4行目 NotesSession クラスの UserName プロパティから現在のユーザーの完全識別名を取得、変数 user に格納 共通名のみを取得する場合、CommonUserName プロパティを使用 (例:完全識別“CN=Administrator/O=test”の場合、共通名は“Administrator”) 5行目 Print ステートメントを使って、ユーザー名をクライアントのステータスバーに表示 NotesSession: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESSESSION_CLASS.html
  42. 42. Step1-2:現在のデータベースのタイトルを取得 NotesDatabase クラス 42 3行目 NotesDatabase クラスの変数 db を宣言 4行目 NotesSession クラスの CurrentDatabase プロパティから現在のデータベースを取得、変数 db に格納 その際、Set ステートメントを使用 5行目 NotesDatabase クラスの Title プロパティからデータベースのタイトルを取得 Print ステートメントを使って、タイトルをクライアントのステータスバーに表示 NotesDatabase: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESDATABASE_CLASS.html
  43. 43. Step1-3:ビューの名前を取得 NotesView クラス 43 4行目 NotesView クラスの変数 view を宣言 6行目 NotesDatabase クラスの GetView メソッドからビュー(別名:vwAll)を取得、変数 view に格納 その際、Set ステートメントを使用 7行目 NotesView クラスの Name プロパティからビューの名前を取得 Print ステートメントを使って、名前をクライアントのステータスバーに表示 NotesView: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESVIEW_CLASS.html
  44. 44. Step1-4:ビューの最初の文書の作成日時を取得 NotesDocument クラス 44 5行目 NotesDocument クラスの変数 doc を宣言 8行目 NotesView クラスの GetFirstDocument メソッドからビューの最初の文書を取得、変数 doc に格納 その際、Set ステートメントを使用 9行目 NotesDocument クラスの Created プロパティから文書が作成された日付/時刻を取得 Print ステートメントを使って、名前をクライアントのステータスバーに表示 NotesDocument: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESDOCUMENT_CLASS.html
  45. 45. 基本的なフロントエンドクラス 45
  46. 46. 基本的なフロントエンドクラス  補足  クライアントの状態(現在開いているデータベースやビュー、文書など)にアクセスするためのクラスです。  ユーザーがクライアントから直接実行しているスクリプトからのみ使用できます。スケジュールエージェン トでは使用できません。(エラーになります)  ダイアログボックスを表示したり、ビューやフォームを閉じるなど UI に関する操作ができます。  NotesUIWorkspace クラス  現在のクライアントのワークスペースのウィンドウにアクセスするためのクラスです。  NotesUIDatabase クラス  現在、クライアントで開いているデータベースにアクセスするためのクラスです。  NotesUIView クラス  現在、クライアントで開いているビューにアクセスするためのクラスです。  NotesUIDocument クラス  現在、クライアントで開いている文書にアクセスするためのクラスです。 46
  47. 47. 各フロントエンドクラスとオブジェクトの関係 47 NotesUIWorkspaceクライアント環境 アプリケーション/ データベース ビュー 文書 オブジェクト クラス NotesUIDatabase NotesUIView NotesUIDocument
  48. 48. アクセスの基本 48 クラス ※ アクセス方法は上記以外にもあります。 NotesUIWorkspace NotesUIDatabase NotesUIView NotesUIDocument クライアント環境 ビュー 文書 オブジェクト アプリケーション/ データベース Notes クライアントで 現在開いている オブジェクトへアクセス可能 NotesUIWorkspace クラスから 直接アクセス可能
  49. 49. Step2-1:ダイアログボックスを表示 NotesUIWorkspace クラス 49 2行目 現在のワークスペースのウィンドウにアクセスして変数 ws に格納。New を使用するのを忘れないように注意 3行目 ダイアログボックスでのユーザーの選択結果を格納する変数 askme を宣言(Integer 型) 4行目 NotesUIWorkspace クラスの Prompt メソッドを使用して、ダイアログボックスを表示 第1引数は、ダイアログボックスのタイプ(種類)の指定 今回は、はい/いいえ(Yes/No)ボタンがある PROMPT_YESNO タイプを指定 第2引数は、タイトルバーに表示する文字列を指定。第3引数は、表示する文字列を指定 ダイアログボックスでのユーザーの選択結果は、変数 askme へ格納 ユーザーがはい(Yes)を選択した場合、askme = 1、いいえ(No)を選択した場合、askme = 0 5行目 変数 askme によって、処理を分岐 ※ 式言語の @Prompt に相当 ※ ダイアログボックスを表示する方法は、この他に MessageBox 関数とステートメント、NotesUIWorkspace クラスの DialogBox メソッド がある NotesUIWorkspace: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESUIWORKSPACE_CLASS.html NotesUIWorkspace - Prompt: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_PROMPT_METHOD_7966_ABOUT.html
  50. 50. Step2-2:現在のデータベースを閉じる NotesUIDatabase クラス 50 3行目 NotesUIDatabase クラスの変数 uidb を宣言 4行目 NotesUIWorkspace クラスの CurrentDatabase プロパティから現在のデータベースを取得、変数 uidb に格納 NotesSession クラスの CurrentDatabase プロパティと違って、戻り値は NotesUIDatabase オブジェクトである ことに注意 5行目 NotesUIDatabase クラスの Close メソッドを実行 データベースのすべてのビュート文書を閉じてから、データベースを閉じる ※ データベースを開いた状態で実行すること NotesUIDatabase: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESUIDATABASE_CLASS.html NotesUIDatabase - Close: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_CLOSE_METHOD_UIDB.html
  51. 51. Step2-3:現在のビューを印刷する NotesUIView クラス 51 3行目 NotesUIView クラスの変数 uiview を宣言 4行目 NotesUIWorkspace クラスの CurrentView プロパティから現在のビューを取得、変数 uiview に格納 戻り値は NotesUIView オブジェクトであることに注意 5行目 NotesUIView クラスの Print メソッドを実行して、ビューを印刷 第1引数は、印刷部数 第7引数は、False(デフォルト)の場合、選択している文書の内容。True の場合、ビューを印刷 引数なし “uiview.Print”とした場合、印刷ダイアログを表示 ※ ビューを開いた状態で実行すること NotesUIView: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESUIVIEW_CLASS.html NotesUIView - Print: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_PRINT_METHOD_4867_ABOUT.html
  52. 52. Step2-4:文書を編集モードにする NotesUIDocument クラス 52 3行目 NotesUIDocument クラスの変数 uidoc を宣言 5行目 現在の文書のモード(編集/読み込み)を格納する変数 editmode を宣言(Boolean 型) 6行目 NotesUIWorkspace クラスの CurrentDocument プロパティから現在の文書を取得、変数 uidoc に格納 戻り値は NotesUIDocument オブジェクトであることに注意 7行目 NotesUIDocument クラスの EditMode プロパティから現在の文書が編集モードであるかどうかを取得、変数 editmode へ格納(編 集モード: True, 読み込みモード: False) 8行目 変数 editmode によって、処理を分岐 9行目 現在開いている文書が編集モードの場合、ダイアログボックス(タイプ: PROMPT_OK)を表示 11行目 現在開いている文書が読み込みモードの場合、EditMode プロパティへ True を設定して、編集モードに変更 ※ 文書を開いた状態で実行すること NotesUIDocument: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESUIDOCUMENT_CLASS.html NotesUIDocument - EditMode: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_EDITMODE_PROPERTY.html 9行目の結果11行目の結果
  53. 53. ビューの文書の処理 53
  54. 54. ビューの文書の処理  ビューに表示されている文書を処理する機会は、とても多いです。  例)  ビューに表示されている文書の [ステータス] フィールドの値をすべて“完了”にしたい  ビューのデータを CSV に書き出したい  キー(特定の値)に一致する文書のデータを取得したい  ビューからの文書の取得でよく使うのは以下の方法です。  ビューの列の値を検索して、キーに一致する文書を取得する  GetDocumentByKey メソッド  GetAllDocumentsByKey メソッド  ビューの最初の文書から順番に取得する  GetFirstDocument メソッド  GetNextDocument メソッド 54
  55. 55. Step3-1:ビューの列の値を使用して文書を検索する NotesView クラス/GetDocumentByKey メソッド 55 6,9行目 製品 ID を格納するための String クラス(文字列)の変数 key を宣言。初期値“L01”を設定 10行目 NotesView クラスの GetDocumentByKey メソッドを使用して、ビューの左端ソート列(製品 ID の昇順でソー ト)と第1引数に指定した変数 key が一致する文書を検索 完全一致で検索する場合、第2引数には、True を指定 戻り値は NotesDocument オブジェクトであることに注意(複数の文書が一致する場合は最初の文書のみ) 11行目 変数 doc が Nothing かどうかで分岐 12行目 製品名を出力。[製品名(ProductName)]フィールドの値を取得したい場合、“doc.ProductName(0)”と記述 フィールド値の取り扱い・記述については、後述 NotesView - GetDocumentByKey: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_GETDOCUMENTBYKEY_METHOD.html
  56. 56. Step3-2:ビューの文書を順番にすべて取得する NotesView クラス/GetFirstDocument, GetNextDocument メソッド 56 8行目 NotesView クラスの GetFirstDocument メソッドを使用して、ビューの最初の文書を取得 9,12行目 While ステートメントを使用して、変数 doc が Nothing になるまで 9~12行を繰り返す 10行目 製品名を出力 11行目 NotesView クラスの GetNextDocument メソッドを使用して、変数 doc の次の文書を取得 取得した次の文書は、変数 doc に格納(上書き) NotesView - GetFirstDocument: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_GETFIRSTDOCUMENT_METHOD_VIEW.html NotesView – GetNextDocument: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_GETNEXTDOCUMENT_METHOD_VIEW.html While ステートメント: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/LSAZ_WHILE_STATEMENT.html
  57. 57. Step3-2:ビューの文書を順番にすべて取得する:補足(1) NotesView クラス/GetFirstDocument, GetNextDocument メソッド 57  注意事項  今回の演習では、文書を変更していないためビューの表示に影響がありません。  しかし、文書を削除したり、値を変更する場合は注意が必要です。理由は、 文書の削除や ビューの条件式によって、文書がビューに表示されなくなったりビューの表示順が変わって しまうためです。そうなると次の文書を返す GetNextDocument メソッドは期待する結果を 返さない場合があります。処理途中のビューがどのような状態であるかを意識しながらプロ グラミングする必要があります。 文書A 文書B 文書C 1番目 2番目 3番目 文書A 文書C 1番目 2番目 削除 ① 文書Bの取得 ② 文書Bの削除 例)文書を削除した場合 ③ ビューの自動更新 表示内容・順番の変化
  58. 58. Step3-2:ビューの文書を順番にすべて取得する:補足(2) NotesView クラス/GetFirstDocument, GetNextDocument メソッド 58  注意事項(続き:ヘルプより抜粋)  GetNexDocument メソッド(NotesView クラス)  ループ内の文書を処理するときは、文書を削除しないでください。または、ビューに表示されなくなったり位置 が変更されるような形で、文書を変更しないでください。次の文書であったはずの文書がビュー内の別の位置に あると、GetNextDocument メソッドは実用的な結果を返さない場合があります。この問題の最も一般的な症状は、 文書をループしたときに文書がスキップされることです。  この問題に対処するには、文書を変更する前には常に GetNextDocument を呼び出す(※1)ようにロジックを変 更します。あるいは、NotesView.AutoUpdate (= False) を使用して、ビューの使用中にビューの索引が再作成 されるのを防止(※2)します。  別の章「ビューの文書の処理2」で上記対処方法の演習があります。 ※1:演習「Step6-1:ビューの文書を順番にすべて処理する(事前に次の文書を取得)」参照 ※2:演習「Step6-2:ビューの文書を順番にすべて取得する(自動更新の無効)」参照  AutoUpdate プロパティ(NotesView クラス)  【注意】このプロパティは、現在実行しているコードによる更新のみを処理します。データベースに Updall タ スクを実行するような他のコードは、このプロパティの値に関係なく、ビューの索引と NotesViewNavigator を 更新します。ビューのすべての文書を処理する必要がある場合は、静的なままのビューに頼らないでください。 この問題を解決する方法については、『すべての文書とすべての未処理文書を収集する』を参照してください。 NotesView - GetNextDocument: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_GETNEXTDOCUMENT_METHOD_VIEW.html NotesView - AutoUpdate: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_AUTOUPDATE_PROPERTY.html
  59. 59. Step3-3:ビューの列の値を使用して文書を検索する(複数) NotesView クラス/GetAllDocumentsByKey メソッド, NotesDocumentsCollection クラス 59 4行目 NotesDocumentCollection クラスの変数 dc を宣言 11行目 NotesView クラスの GetAllDocumentsByKey メソッドを使用して、ビューの左端ソート列(製品 ID の昇順でソート)と第1引 数に指定した変数 key が一致する文書をすべて検索 部分一致(前方)で検索する場合、第2引数には、False を指定 戻り値は NotesDocumentCollection オブジェクトであることに注意(複数の文書のコレクション/一覧) コレクション内の文書には順序は決まっていない。順不同であることに注意 14,17行目 While ステートメントを使用して、変数 doc が Nothing になるまで 14~17行を繰り返す 11行目 NotesDocumentCollection クラスの GetNextDocument メソッドを使用して、変数 doc の次の文書を取得 NotesView - GetAllDocumentsByKey: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_GETALLDOCUMENTSBYKEY_METHOD.html NotesDocumentCollection: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESDOCUMENTCOLLECTION_CLASS.html [Step3-1:ビューの列の値を使用して文書を検索する] [Step3-2:ビューの文書を順番にすべて取得する] を組み合わせて製品IDが [L] で始まる製品を検索
  60. 60. 文書の処理 60
  61. 61. 文書の処理  文書の処理パターンは、多岐にわたります。当資料では簡単な処理を例として記述します。  文書の新規作成  文書の更新  文書の削除  上記以外にも編集モードで表示している文書の操作(NotesUIDocument クラス)、エージェントでは なく、フォーム(PostOpen や QuerySave など)やボタン(Click)のイベントに記述する場合もあ ります。  文書に含まれるフィールドを LotusScript では、アイテム(Item)と呼びます。  フィールドを表すクラスは、NotesItem と NotesRichTextItem(リッチテキスト)クラスです。  フィールドを扱う方法は、以下になります。 1. 「拡張クラス」構文を使用  参考資料:AppendItemValue - 「拡張クラス」構文  https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_APPENDITEMVALUE_METHOD.html 2. NotesDocument クラスの GetItemValue, AppendItemValue, ReplaceItemValue メソッドなどを使用 3. NotesItem クラスにアクセスして、各種プロパティやメソッドを使用 ※ 1と2の方法では、NotesItem クラスにアクセスする必要はありません。 61
  62. 62. Step4-1:文書を新規作成する NotesDatabase クラス/CreateDocument メソッド, NotesDocument クラス/Save メソッド 62 6行目 NotesDatabase クラスの CreateDocument メソッドを使用して、新規文書となる NotesDocument オブジェクトを 変数 doc に格納 7-10行目 変数 doc のフィールドに値を設定 “doc.(フィールド名) = (設定値)”で値を設定可能(「拡張クラス」構文) フィールドが存在しない場合、新規にフィールドが作成される 但し、プロパティやメソッドなどの予約語と被るフィールドは作成不可 また、文字列や数値以外の読者や作成者フィールドとして設定する場合、上記方法ではなく NotesItem クラスを 使った方法で作成/設定する必要あり 11行目 NotesDocument クラスの Save メソッドを使用して、変数 doc を保存 保存を忘れないようにすること NotesDatabase - CreateDocument: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_CREATEDOCUMENT_METHOD.html NotesDocument - Save: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_SAVE_METHOD_DOC.html
  63. 63. Step4-2:文書を更新する NotesDocument クラス 63 12行目 “doc.(フィールド名) = (設定値)”で値を設定可能(「拡張クラス」構文) [価格(Price)]フィールドは複数値ではないが、フィールドのデータは複数値を考慮して配列で返ってくる そのため、後に“(0)”を付けて“doc.Price(0)”として配列の最初の値を取得(※1)、2を掛けている 13行目 NotesDocument クラスの Save メソッドを使用して、変数 doc を保存 保存を忘れないようにすること ※1 次頁「Step4-2:文書を更新する:補足」参照 [Step3-1:ビューの列の値を使用して文書を検索する] を一部修正 [製品ID] が“L01”の文書の [価格] を2倍にする
  64. 64.  Notes/Domino の文書のフィールドは、複数の値を保持できます(但し、リッチテキストは除く)。  身近な例としては、メール DB の宛先フィールドやディスカッション DB のカテゴリです。  文書のプロパティで複数の値が保存されていることが確認できます。  そのため、値が配列で返ってくることを前提にプログラミングする必要があります。  スクリプトデバッガで値を確認すると、複数値かどうかに関係なく配列として扱われていることがわかります。 Step4-2:文書を更新する:補足 フィールドの値の取り扱いについて 64 ① 複数値:No ② 複数値:Yes doc.field_1(0) → “りんご” doc.field_2(0) →“りんご” doc.field_2(1) →“みかん” doc.field_2(2) →“もも”
  65. 65. Step4-3:文書を削除する NotesDocument クラス/Remove メソッド 65 12行目 NotesDocument クラスの Remove メソッドを使用して変数 doc の文書を削除 第1引数に True を指定した場合、スクリプトが文書を開いた後に他のユーザーが文書を変更した場合でも削除 NotesDocument – Remove: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_REMOVE_METHOD_DOC.html [Step3-1:ビューの列の値を使用して文書を検索する] を一部修正 [製品ID] が“C01”の文書を削除する
  66. 66. Step4-4:文書を新規作成する(作成者フィールドの追加) NotesItem クラス 66 5行目 NotesItem クラスの変数 item を宣言 12行目 第1引数はフィールドを作成する文書を設定(変数 doc) 第2引数は作成するフィールドの名前 第3引数は設定する値 第4引数はフィールドの種類 今回は作成者とするため“AUTHORS”を指定(名前の場合“NAMES”/ 読者の場合“READERS”) 13行目 NotesItem クラスの IsSummary プロパティを True に設定 ビューやフォルダにフィールドの値を表示する場合、IsSummary プロパティが True の必要があるが、NotesItem クラスから作成 したフィールドの IsSummary プロパティは、デフォルトが False である。よって、明示的に True を設定 NotesItem: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESITEM_CLASS.html NotesItem – IsSummary: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_ISSUMMARY_PROPERTY.html [Step4-1:文書を新規作成する] を一部修正 [From]作成者フィールドに管理者のユーザーを設定する
  67. 67. エージェントの操作 67
  68. 68. NotesAgent クラス 68  エージェントを表します。  様々なプロパティやメソッドがありますが、最初は以下のメソッドのみ覚えて おけばよいでしょう。  Run メソッド  エージェントを実行します。  注意事項  エージェントを再帰的に実行することはできません。(自分自身を呼び出すことはできません)  ユーザーは呼び出し先エージェントと直接対話することはできません。呼び出し先エージェント内で、Print ス テートメントを使用した場合、クライアントのステータスバーには表示されず、クライアントの log.nsf に出力 されます。  呼び出し先エージェントをデバッグすることはできません。  戻り値は、エージェントを呼び出せたかどうかの結果であり、呼び出し先エージェントがエラーが無く実行さ れたかどうかは関係ありません。
  69. 69. Step5-1:別のエージェントを実行する NotesAgent クラス 69 4行目 NotesAgent クラスの変数 agent を宣言 6行目 NotesDatabase クラスの GetAgent メソッドからエージェント(※1)を取得、変数 agent に格納 7行目 NotesAgent クラスの Run メソッドを実行して、6行目で取得したエージェントを実行 結果をステータスバーに表示 ※1 「Step2-1:ダイアログボックスを表示 NotesUIWorkspace クラス」で作成したエージェント NotesAgent: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_NOTESAGENT_CLASS.html NotesAgent - Run: https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/basic/H_RUN_METHOD_6415.html
  70. 70. ビューの文書の処理2 70
  71. 71. Step6-1:ビューの文書を順番にすべて処理する(事前に次の文書を取得) NotesView クラス/GetFirstDocument, GetNextDocument メソッド 71 5行目 NotesDocument クラスの変数 docTemp を宣言 11行目 処理対象文書である変数 doc のオブジェクト参照を変数 docTemp にコピー 12行目 事前に次の文書を取得しておく 13-16行目 以後、コピーした変数 docTemp に対して処理を行う 上記例では、価格が100円未満の文書を削除 価格が100円未満の文書を削除する
  72. 72. Step6-2:ビューの文書を順番にすべて処理する(自動更新の無効) NotesView クラス/AutoUpdate プロパティ, GetNextDocument メソッド 72 8行目 NotesView クラスの AutoUpdate プロパティに False を設定して、ビューの自動更新を無効する 13行目 文書(変数 doc)の[削除フラグ(deleteFlag)]フィールドに "1" を設定(存在しない場合は新規に作成) 16行目 文書がビューの選択式(表示条件)の対象外となってもこのエージェント処理中はビューの状態は変化しない(自 動更新無効のため)。そのため、GetNextDocument メソッドで次の文書が取得可能 ※注意 「Step3-2:ビューの文書を順番にすべて取得する:補足(2)」で説明したように、このエージェント以外から ビューの更新はありえる。また、Remove メソッドで文書そのものを削除した場合、変数 doc が Nothing となり以 後の処理で利用できなくなる 価格が100円未満の文書をビューから非表示にする ビューの選択式 SELECT deleteFlag !=“1” [削除フラグ(deleteFlag)]フィールドが“1”の場合、非表示
  73. 73. Step6-3:ビューの文書を順番にすべて処理する(事前に次の文書を取得+自動更新の無効) NotesView クラス/AutoUpdate プロパティ, GetNextDocument メソッド 73 9行目 NotesView クラスの AutoUpdate プロパティに False を設定して、ビューの自動更新を無効する 12行目 処理対象文書である変数 doc のオブジェクト参照を変数 docTemp にコピー 13行目 事前に次の文書を取得しておく ヘルプより抜粋(AutoUpdate プロパティ) このプロパティを明示的に false に設定してビューの自動更新を無効にすることをお勧めします。特に、ビューがナビゲータやエントリコ レクションのベースとなっている場合は、ビューの自動更新は無効に設定してください。自動更新を行うと、パフォーマンスが低下し、コ レクション内のエントリが無効になる (「エントリが索引に見つかりません」と表示される) 場合があります。 価格が100円未満の文書を削除する [Step6-1:ビューの文書を順番にすべて処理する(事前に次の文書を取得)] [Step6-2:ビューの文書を順番にすべて処理する(自動更新の無効)] の組み合わせ AutoUpdate プロパティを False に設定するもう一つの利点は、更新頻度が多 い場合にパフォーマンスの低下を防げる点です
  74. 74. ビューの文書の処理:まとめ  ビューの文書を処理する場合、ビューの更新(自分自身・他者)を意識してプ ログラミングする必要があります。  文書を取得する方法としては、検索系のメソッドを使う方法もあります。一度 ヘルプに目を通しておいてください。  NotesDatabase クラスの FTSearch メソッドや Search メソッド  NotesView クラスの FTSearch メソッド  迷ったら以下のパターンで考えるとよいでしょう。  文書の新規・更新・削除がある場合 「Step6-3:ビューの文書を順番にすべて処理する(事前に次の文書を取得+自動更新の無効)」  文書の参照のみの場合 「Step3-2:ビューの文書を順番にすべて取得する」でも可 もちろん、「Step6-3:ビューの文書を順番にすべて処理する(事前に次の文書を取得+自動更新の無効)」でも可 74
  75. 75. まとめ 75
  76. 76. ヘルプ  気になることや困ったらヘルプを見ましょう!  特にサンプルコードが記載されている“例”は理解の手助けになります。  Domino Designer のメニューバー [ヘルプ] - [ヘルプ目次] から開きます。  IBM Domino Designer Basic 版 ユーザーガイドおよびリファレンス  LotusScript 言語  LotusScript /COM/OLE クラス 76
  77. 77. 最初に目を通しておきたいヘルプ項目 IBM Domino Designer Basic 版 ユーザーガイドおよびリファレンス  LotusScript /COM/OLE クラス  LotusScript: LotusScript のクラスの使用  << ケース別に利用可能なプロパティやメソッドがまと められている >>  LotusScript クラス A-Z  << クラスの詳細はここで確認 >> 77  LotusScript 言語  スクリプトとステートメントの作成規則  識別子の作成規則  ラベル  キーワード  特殊文字  データ型、定数、変数  LotusScript のデータ型の概要  式と演算子  文字列演算子の一覧  スクリプトのフローの管理  ブロックステートメント  分岐ステートメント  繰り返しステートメント  早期終了ステートメント  LotusScript 言語リファレンス  << 関数やステートメントの詳細はここで確認 >>  言語とスクリプトの制限  数値データの制限  文字列データの制限  配列変数の制限  ランタイムエラーメッセージ  << エラーの原因はここで確認 >> 特にお勧めの項目は、黄色表記しています。 << >> の箇所は、量が多いので「こんなのが あるんだ……」程度に見ておいて、必要な時 に再度確認しましょう。
  78. 78. 最後に  今回は、入門編として LotusScript の学習を始める上で最初に理解しておいた方 が良い部分のみを厳選しました。それでもこの頁数になってしまいました。  LotusScript は奥が深く、まだまだ語り足りない部分がありますが、そこが面白 いところです。  ノーツクライアントのみではなく、Excel やWord を操作することもでき、工夫 次第で様々なアプリケーションが開発できます。  当資料が LotusScript の学習を始めた方のお役に立ててれば幸いです。 78
  79. 79. 79 最後までご覧いただきありがとうございました
  80. 80. 補足資料 80
  81. 81. 覚えておきたいプロパティ・メソッド  各クラスで覚えておくとよいプロパティ・メソッドを抜き出しました。  これ以外のプロパティ・メソッドが必要なケースもあります。あくまで参考レベルです。  演習で紹介したものも含みます。  余裕がある時にヘルプで確認しておくと後々参考になると思います。 81 特に重要なものは、黄色表記しています 関係するものは代表的なプロパティ・ メソッドの下にまとめました 例)
  82. 82. バックエンドクラス (1)  NotesSession  プロパティ  CurrentDatabase  UserName  CommonUserName  メソッド  Evaluate  GetDatabase  SetEnvironmentVar  GetEnvironmentString  GetEnvironmentValue 82  NotesDatabase  プロパティ  FilePath  FileName  Server  Size  SizeQuota  SizeWarning  CurrentAccessLevel  メソッド  GetAgent  GetDocumentByUNID  GetDocumentByID  GetProfileDocument  OpenMail  Search  FTSearch  QueryAccessRoles  NotesView  プロパティ  AllEntries  メソッド  GetAllDocumentsByKey  GetDocumentByKey  GetFirstDocument  GetNextDocument  GetLastDocument  GetPrevDocument  FTSearch  NotesDocument  プロパティ  Size  UniversalID  NoteID  メソッド  AppendItemValue  ReplaceItemValue  ComputeWithForm  CopyToDatabase  CopyAllItems  CopyItem  GetFirstItem  GetAttachment  GetItemValue  GetRead  MarkRead  MarkUnread  HasItem  Remove  RemovePermanently  RemoveItem  Save  Send
  83. 83. バックエンドクラス (2)  NotesDocumentCollection  プロパティ  Count  メソッド  GetFirstDocument  GetNextDocument  GetLastDocument  GetPrevDocument  RemoveAll  StampAll 83  NotesItem  プロパティ  IsAuthors  IsNames  IsReaders  IsSummary  Text  Values  メソッド  AppendToTextList  CopyItemToDocument  Remove  NotesAgent  メソッド  Run
  84. 84. フロントエンドクラス (1)  NotesUIWorkspace  プロパティ  CurrentDatabase  CurrentDocument  CurrentView  メソッド  AddDatabase  ComposeDocument  EditDocument  EditProfile  GetCurrentDatabase  OpenDatabase  ReloadWindow  ViewRefresh 84  Open 系  ComposeDocument  EditDocument  OpenFrameSet  OpenView (NotesDatabase)  SetTargetFrame  Prompt, Dialog, PickList 系  DialogBox  OpenFileDialog  SaveFileDialog  Prompt  PickListCollection  PickListStrings
  85. 85. フロントエンドクラス (2)  NotesUIDatabase  プロパティ  Database  Documents  メソッド  Close  OpenView 85  NotesUIView  プロパティ  Documents  View  メソッド  Close  Print  SelectDocument  DeselectAll  NotesUIDocument  プロパティ  AutoReload  CurrentField  DialogBoxCanceld  Document  EditMode  IsNewDoc  Ruler  メソッド  Close  FieldGetText  FieldSetText  FieldAppendText  GotoField  GotoTop  GotoBottom  GotoNextField  GotoPrevField  Print  Refresh  RefreshHideFormulas  Reload  Save

×