Notesってノーツと読むんだよ。

基本2

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

オブジェクト変数宣言方法

他の言語でオブジェクト指向を勉強されている方はほとんど問題ないと思いますが、
オブジェクト指向プログラミングがはじめての方には
大抵、ノーツ・スクリプトを勉強するときに
Dim session As New NotesSession
や、
Set db = session.CurrentDatabase
などのオブジェクト変数宣言で「?????????」になり、
苦手意識が一気に加速することがあるかと思います。
これは、各クラスのスーパークラス(上位)からサブクラス(下位)への上下関係というか
包含関係を憶えないと話しになりません。

が、ここでは考え方を提示しますので、
完全に包含関係を憶えなくても「なんとなく」宣言できるようになるかと。

その前に(考え方)

通常、人間があるDBのある目的の文書を開こうとするとどうやるでしょうか?

以下では例として、
山本太郎さんという人の電話番号を、電話番号台帳DBから探したいとします。
そのDBはアイウエオ順にカテゴライズされているビューを持っているとします。

  1. WorkSpace上に電話番号台帳DBがあるとして、そのDBを開きます。
  2. アイウエオ順というビューを開きます。
  3. アイウエオ順のカテゴリから「ヤ」のカテゴリを開き、目視で山本太郎さんの文書を探します。
  4. 探し出したら、その文書を開きます。
  5. 目的の文書のtelという項目を参照します。

こんな順番で目的の情報を取得しますよね?
これを順序よくスクリプトでやらせればいいだけなのです。
ただし、人間には出来ても、スクリプトには「分からない」部分があります。
そこをオブジェクト変数宣言で順序よく目的の文書や情報にたどりつけるようにするわけです。

実際どのように?

上の例に沿って、ノーツ・スクリプトでプログラミングしていきます。

が、人間は目視で文書やDBにたどりつけますが、
スクリプトの場合は目視はできませんよね。(苦笑

まぁまず目的の文書から宣言しちゃいましょう。
文書自体、NotesDocumentクラスよりオブジェクト変数を生成するので、
Dim doc As NotesDocument 
となりますね。

あとはdocというオブジェクト変数に文書の実体を与えればいいだけなのですが、
スクリプトには先に言った通り、目視という人間様の技は使えません。
ので、ここでビューより検索という技(メソッド)を使用するわけです。
では、その目的の文書にたどりつくための検索をかけるビューを先に宣言しちゃいましょう。
ビューを取得するには、NotesViewクラスが必要です。

ここでは、docオブジェクト変数より先にviewオブジェクト変数を追加します。
※Dim文自体の宣言優先順位は関係ありませんが、
一応順序立てるためにも、先にviewオブジェクト変数を宣言しておくのがいいかと。
Dim view As NotesView
Dim doc As NotesDocument 
あとは、viewオブジェクト変数に実体を与えれてればいいわけです。
が、ここで一度デザイナー・ヘルプでNotesViewクラスを確認します。

NotesViewクラスの説明の「アクセス方法」のところに、
「ビューまたはフォルダには、ビューまたはフォルダを含む
NotesDatabase オブジェクトを介してアクセスします。
アクセスする方法には、次の2つがあります。」と書かれていて、その下に、
「・アクセスするビューまたはフォルダの名前か別名が分っているときは、
GetView メソッドを使います。」とあり、
今回はビュー名がもともと分かってるのでこちらで。

そこから、GetView メソッドの説明にある「例を表示」リンクを開き、
最初の例を参照すると、
Dim view As NotesView
Set view = db.GetView( "Main View" )
という形でビューを取得しています。
コレに習って、「アイウエオ順」というビューをviewオブジェクト変数に与えます
Dim view As NotesView
Set view = db.GetView("アイウエオ順")
Dim doc As NotesDocument
そのviewオブジェクト変数より、NotesViewクラスのGetDocumentByKeyメソッドを
使用して、「ヤ」カテゴリの「山本太郎」をキーワードとして検索をかけた結果を
docオブジェクト変数に渡します。
※ここではGetDocumentByKeyメソッドの説明を省きます。
ので、各自でデザイナー・ヘルプで確認の事。
Dim view As NotesView
Set view = db.GetView("アイウエオ順")
Dim doc As NotesDocument
Dim kyes(1) as String
keys(0) = "ヤ"
keys(1) = "山本太郎"
Set doc = view.GetDocumentByKey(keys)
viewオブジェクト変数に「アイウエオ順」のビューをsetしたら、
dbオブジェクト変数が引っ付いて来てしまいました。。。ね。
これは「アイウエオ順」というビューが
どこのDBにあるかを宣言しなければいけない。ということです。

ここで再度デザイナー・ヘルプでGetViewメソッドを確認すると、
GetViewメソッドはNotesDatabaseクラスのメソッドのうちの1つであることが
判るはずです。
つまり、NotesDatabaseクラスから作られたdbオブジェクト変数に
今回の「電話番号台帳」というDBを与えてあげればいいのです。

で、デザイナー・ヘルプのGetViewメソッドの定義位置「NotesDatabase」のリンクより
NotesDatabaseクラスの説明の「作成方法とアクセス方法」を参照すると、
「・サーバーとファイルの名前が分かっている既存のデータベースにアクセスするには、
New または NotesSession の GetDatabaseメソッドを使います。」
とありますので、
今回は以下の説明につながるように、
NotesSessionのGetDatabaseメソッドよりDBを取得することにします。

GetDatabaseメソッドの説明になる「例を表示」リンクを開くと
Dim db As NotesDatabase
Set db = session.GetDatabase( "Barcelona", "plan.nsf" )
という形で、サーバ名とDBファイル名を指定し、DBを取得しています。
コレに習って、「A/ド壺」というサーバの「電話番号台帳.nsf」というファイル名のDBを、
dbオブジェクト変数に与えます。
Dim db As NotesDatabase
Set db = session.GetDatabase("CN=A/O=ド壺","電話番号台帳.nsf")
Dim view As NotesView
Set view = db.GetView("アイウエオ順")
Dim doc As NotesDocument
Dim kyes(1) as String
keys(0) = "ヤ"
keys(1) = "山本太郎"
Set doc = view.GetDocumentByKey(keys)
さて、ここでもdbオブジェクト変数を宣言したら、
sessionオブジェクト変数がついてきたわけですが、
まず何も考えず、GetDatabase メソッド(NotesSessionクラス)の「例を表示」の一行目にあった
Dim session As New NotesSession 
の行を一番上に追加します。
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.GetDatabase("CN=A/O=ド壺","電話番号台帳.nsf")
Dim view As NotesView
Set view = db.GetView("アイウエオ順")
Dim doc As NotesDocument
Dim kyes(1) as String
keys(0) = "ヤ"
keys(1) = "山本太郎"
Set doc = view.GetDocumentByKey(keys)
実言うと、一番分かりづらいのはNotesSessionだと思うのですが、
通常のWebアプリ、リレーショナルDBで使われるセッションと同じようなものです。
接続状況を表すモノですが、Notes/Dominoの場合
DBへの接続状況を表す=現在使用している(スクリプトを利用する)ユーザが
どこにいる(どのDBを開いている)かを示します。
他にも、そのセッションを張っているユーザの情報などの取得等でも
sessionオブジェクト変数を宣言することになります。
※NotesSessionクラスの詳細に関してはデザイナー・ヘルプを確認してください。

今までの上の例では、電話番号台帳のDBとは別のDBよりスクリプトを動かし、
電話番号台帳DBを呼び出して、目的の文書にアクセスする。ことを目的としています。

もし、スクリプトを動作させるイベント
(=そのイベントをキックするユーザ・セッション)が現在同じDB内であれば、
上の例でのdbオブジェクト変数の取得の仕方も以下3行目のように変更することが可能です。
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase 
Dim view As NotesView
Set view = db.GetView("アイウエオ順")
Dim doc As NotesDocument
Dim kyes(1) as String
keys(0) = "ヤ"
keys(1) = "山本太郎"
Set doc = view.GetDocumentByKey(keys)
つまり、どのイベントに入力されたスクリプトを動かして、何をアクセスするかによって、
Setから始まる行の記入方法が変わるわけです。

あと、今まではバックエンド側からのDBとビューを取得したわけですが、
このスクリプトが、文書を検索すべき「アイウエオ順」ビューの何らかのアクション・ボタンの
Clickサブルーチン(Sub Click ~ End Sub までの間)に埋め込まれた場合、
Dim wks As New NotesUIworkspace
Dim uiView As NotesUIView
Set uiView = wks.currentview
Dim view As NotesView
Set view = uiView.View
Dim doc As NotesDocument
Dim kyes(1) as String
keys(0) = "ヤ"
keys(1) = "山本太郎"
Set doc = view.GetDocumentByKey(keys)
と、フロントエンドから現在のビューをuiViewオブジェクト変数に取得し
それをバックエンド用viewオブジェクト変数に与えてから、検索を掛ける
という方法も取れます。
※フロントエンドとバックエンドの違いは別途説明します。

この辺の宣言方法に慣れると、
上記のようにサブクラスからスーパークラスへ辿らなくても、
ぱぱぱっと入力できるようになります。
慣れるまでは、デザイナー・ヘルプの各クラスの
「アクセス方法」と「例を表示」をよく参照してください~。

ツッコミ・コメント

名前:
コメント:
  • べっ、べつにアンタのためじゃないんだからね!(*´ω`)☆ http://s.64n.co/ -- age (2012-01-12 09:29:18)


目安箱バナー