投稿

10月, 2008の投稿を表示しています

他のエージェントを実行する

イメージ
ノーツDBにあるエージェントを呼び出して実行するという方法。
NotesAgentクラスのRunメソッドを使う。これは、実行された場所でエージェントを実行する。
ノーツDBのボタンなどに記述した場合、このエージェントはクライアント側で実行される。

同じようなものでRunOnServerメソッドがある。こちらは、サーバ上でエージェントを実行するものである。
場合によってうまく使い分けてほしい。

サンプルは、ボタンに記述してあるもので、単純に指定したエージェントを実行するだけのものである。

Sub Click(Source As Button)     Dim session As New NotesSession     Dim db As NotesDatabase     Dim agent As NotesAgent         Set db = session.CurrentDatabase     Set agent = db.GetAgent( "(NotesAgentクラス\他のエージェントを呼び出す)" )         'エージェントを実行する     Call agent.Run End Sub




メールアドレスの抽出その2

イメージ
メールアドレスの抽出で書いた記事だが、もっと簡単な方法があったので、掲載しておく。

@Name関数のオプションにある[Address821]を使えば良かったのだ。
これを使うと、メールアドレスから、RFC821形式でアドレスを返してくれるのだ。
しかも、アドレスの所は、複数値であっても有効なのである。

サンプルは、SendToフィールドの値からRFC821形式のアドレスを取得するものである。
CopyToやBlindCopyToからも取得したいなら、SendTo:CopyTo:BlindCopyToとリスト形式にすれば良いだけである。

------------------------------------------------------------------------
tmp := @Name([Address821];SendTo);
@Prompt([Ok];"メールアドレスの抽出";@Implode(tmp))


「ファイルを開く」ダイアログを表示する

イメージ
ファイルを開くダイアログを表示するという方法を紹介しよう。
@関数で言えば、@Prompt([LocalBrowse]~)に相当するのだが、LotusScriptの方がもう少し便利に使える。
ダイアログに表示するファイルの種類を、好きに指定できるのだ。

今回はサンプルを2つ用意した。
1つは、テキストファイル(拡張子がtxtとcsvのもの)を選択するもので、
もう1つは、ノーツDB(拡張子がnsfとntfのもの)を選択するものだ。

昨日の記事と照らし合わせてみてもらえると面白いだろう。

Sub Click(Source As Button)     Dim uiws As New NotesUIWorkspace     Dim ret As Variant          ret = uiws.OpenFileDialog( False, "ファイルを開く", "テキストファイル|*.txt|CSVファイル|*.csv" ) End Sub



Sub Click(Source As Button)     Dim uiws As New NotesUIWorkspace     Dim ret As Variant          ret = uiws.OpenFileDialog( False, "データベースを開く", "Notes Databases|*.nsf|Notes Templates|*.ntf" ) End Sub






「データベースを開く」ダイアログを表示する

イメージ
以前に、データベースの選択という記事で、「データベースを開く」ダイアログを表示するというサンプルを示したが、今回はそのLotusScript版である。
効果は同じなので、場面に応じて使い分けてほしい。

ここで気をつけてほしいのが、「PROMPT_CHOOSEDATABASE」という定数。
ヘルプによると、Release 6.0では実装されていないと書いてあるが、筆者の8.0.2の環境でも実装されていないようだ。
なので、PROMPT_CHOOSEDATABASEと書いてもコーディングエラーになる。
そこでサンプルでも、13という値を直接書いている。後で分からなくならないように、コメントを記述しておくことをお勧めする。

また、Promptメソッドの2番目以降(4番目と5番目は任意)は、何を書いても無視されるので、""にしておくこと。

Sub Click(Source As Button)     Dim uiws As New NotesUIWorkspace     Dim ret As Variant         'PROMPT_CHOOSEDATABASEは、リテラル値で13     ret = uiws.Prompt( 13, "", "" )     If Isempty( ret ) Then         Msgbox "データベースは選択されていません。", 0, "データベースの選択"         Exit Sub     End If     Msgbox ret(0), 0, "サーバ名"     Msgbox ret(1), 0, "データベースファイル名"     Msgbox ret(2), 0, "データベースタイトル" End Sub






増えたビューアイコン

イメージ
昔からノーツに携わっている人からしたら、「ずいぶん増えたなぁ」と思えるような画面です。
50個近くアイコンが増えましたね。
それにしても、同じようなアイコンがあるなぁ。なんで使い回ししないんだろ?

ちなみに、ビューのポップアップヘルプを有効にしておくと(ユーザプリファレンスで設定可能)、
アイコンの名前が表示される。
一応、全部違っているようなので、これで「違うアイコンです!」って言い切るつもりなんだろう・・・
プログラマの方は、このメッセージも確認してからビューアイコンを使うようにしてほしい。

フィールドの内容をクリップボードにコピー

イメージ
Notes/Domino8環境へのバージョンアップに手間取ったので、今日も手抜き。

フィールドの内容をクリップボードにコピーするサンプル。
まぁ、クリップボードを使うから、UIでの利用だな。と覚えておけばよいでしょう。
ということで、NotesUIDocumentクラスのメソッドなのです。

Sub Click(Source As Button)     Dim workspace As New NotesUIWorkspace     Dim uidoc As NotesUIDocument         Set uidoc = workspace.CurrentDocument         Call uidoc.GoToField( "Subject" )     Call uidoc.SelectAll     Call uidoc.Copy End Sub





環境のバージョンアップ

筆者の環境は、Lotus Notes/Dominoともに7.0.3であった。そこに、Sametimeをインストールして使っていた。
関わっていたプロジェクトも一段落したので、そろそろ環境をバージョンアップすることにした。

ということで・・・
Lotus Notes/Dominoをともに、8.0.2にしてみた。
Sametimeはインストールする気がなかったので、入れないでおいたら、ノーツクライアントが起動できない。
どうも、Sametimeのパスワードを入力するところで、止まってしまうようだ。

仕方がないので、Sametimeもインストールして、Domino 8.0.2+Sametime8.0というサーバ環境にしてみた。
その状態で、ノーツクライアントを起動すると、見事に起動できた。まさか、これが原因とは思いたくはないが・・・

とりあえず、これで、Windows XPにDomino 8.0.2 + Sametime 8.0 + Domino Designer + Domino Administratorという環境になった。


まだ保有している古いサンプルがいくつかあるが、これからはNotes/Domino 8でのサンプルも交えて記事を書いていけるようにしたい。

ノーツのバージョンを表示する

イメージ
今回も手抜き。
なかなかネタが・・・

ノーツのバージョンを表示するサンプルです。
バージョンには、リリース番号と言われるものとビルド番号と言われているものがあります。
当然、返ってくる値が違うので、うまく使い分けをすることが必要になります。

開発者のみなさんがよく使うのは、NotesBuileVersionプロパティの方ではないでしょうか?
@Version関数に相当するものです。

サンプルは、実行するノーツクライアントのバージョンを表示するものです。

Sub Click(Source As Button) Dim session As New NotesSession Msgbox "リリース番号:" & Chr$(9) & session.NotesVersion & Chr$(10) & _ "ビルド番号:" & Chr$(9) & session.NotesBuildVersion, 0, "このクライアントのノーツバージョン" End Sub

@関数のVersion関数では、NotesBuildVersionの結果と同じものが表示されます。

Notes/Dominoがわからないときはこちらへ!

文書の削除のチェック

イメージ
文書の削除イベントを拾うというもの。
文書のオープンや書き込みなどはフォーム単位で設定するが、フォームの中に「文書を削除した」というイベントはない。

実は、
設計要素-その他-データベースリソース-データベーススクリプトのQuerydocumentdeleteイベントにセットします。
つまり、各フォームではなく、データベース全体として捉えるのである。
ビューで複数文書を削除する場合など、選択する文書によってフォームが違ったりするし、フォームを開いている状態で、Deleteキーを押しても文書は削除できるし、というように、色々な場面で文書の削除ができるからであろう。
と勝手に推測している。

サンプルは、文書を削除する際に、本当に削除して良いかどうかの確認ダイアログを表示するものである。
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)     '削除の確認メッセージ(「はい」「いいえ」のボタンが出る)     res = Messagebox( "ホントに削除しますか?", 4 + 32, "文書の削除" )     '6は「はい」を選択、7は「いいえ」を選択、elseはエラー処理     Select Case res     Case 6:         Messagebox "削除フラグをOnにしますが、文書は削除されません。", 0, "文書の削除"     Case 7:         Continue = False     End Select End Sub

データ型について

イメージ
前にも書いたと思うが・・・みんなヘルプは読んでるかな?
ノーツは情報が少ない!と言われているけど、大抵のことはヘルプDBを読めば解決してくれるものだ。

ヘルプ、Administratorヘルプ、Designerヘルプ、日本語環境設定ガイド、Notes/Dominoリリース
ノーツDBなんだから、全文索引をつければ検索も快適に行えるし、サンプルコードだって豊富に付いている。

私がここに書いている記事も、ほとんどはヘルプからの引用だ。もちろん、実体験をしたからこそ、書けるものではあるが。
プログラムが動かない、どの関数を使えば良いか分からない!という時こそ、ヘルプを見てほしい。


CCur関数を使うと、小数点4桁以下が切り捨てられるという話があった。
まず、CCur関数ってどんな仕様だっけ?と思い、ヘルプを読んでみた。
そうしたら、
「CCur 関数は、小数 4 桁に丸めて expr の数値を Currency 型の値として返します。」
とあるではないか。
この関数を使う際、ヘルプを見てから使っていれば、このような疑問は起きなかったはずである。
(そもそも、よくこんな関数知っていたなぁ。というのが私の感想である)

では、どんな関数を使えば良いのか?それもヘルプに出ている。
「関連項目」として、関係する関数やクラスなどがリンクとして表記されているのだ。
そこから、探していけば答えはすぐに見つかるはず。

他人に聞くな。とは言わない。もちろん、自分より詳しい人はたくさんいるであろうから、彼らの智恵を借りることは良いことである。
しかし、自分で調べられるなら、その方が早いし、確実である。


まずは、ヘルプを読もう!
それからもで遅くないよ。




文書内のフィールドの値を取得する

イメージ
やってそうでやってなかったみたいなので・・・
今回は文書内のフィールドの値を取得してみよう。

doc(NotesDocumentクラスの変数)内のSubjectフィールドの値を取得する場合、
サンプル等でよく見かけるのが、
doc.Subject(0)という書式である。
これは、「拡張クラス」構文と言って、NotesDocumentクラスのGetItemValueメソッドと同じ働きをするものである。
なお、(0)はSubjectフィールドの1つめの値という意味である(フィールドは複数値を許可していることがあるので、このような設定が必要になる)。

だったら、GetItemValueメソッドは不要ではないか?と思ってしまうだろう。
ところが、次のような場合は、「拡張クラス」構文は利用できないので、GetItemValueメソッドを使う方が良いのである。
例)Subject_1、Subject_2、Subject_3のフィールドの値をそれぞれ、i(1)、i(2)、i(3)という変数に格納する。
普通なら、
i(1) = doc.Subject_1(0)
i(2) = doc.Subject_2(0)
i(3) = doc.Subject_3(0)
となるのだが、これではSubject_xxが100まであったら、とてもじゃないが書いていられない。
ということで、
For n = 1 to 3
i(n) = doc.GetItemValue( "Subject_" & cstr(n) )
Next
とするのだ。
こうすると、cstr(n)はループの回数に従って、1,2,・・・と増えていき、
結果として、Subject_1,Subject_2・・・としていくことができる。
後は、これをGetItemValueで取得していけば良いのである。

なので、処理の内容によって、うまく使い分けてほしい。



今回のサンプルは、至ってシンプル。ByCategoriesビューで最初に取得した文書のSubjectフィールドを取得して画面に表示するものである。

Sub Click(Source As Button)     Dim session As New NotesSession     Dim db As NotesDatabase     Dim view As…

アップデート講座を受講してみた

あんなもん受かるかぁ!で書いたが、Notes8のアップデート試験は散々な目にあった。
このままの調子で、再度受験しても受かるわけはないので・・・

IBM Lotus Domino8 アプリケーション開発アップデート
の認定講座を受講してきた。

講習自体はそんなに難しくはなく(1日コースなので、薄っぺらいこと・・・)、もっぱらどのような問題が試験に出たのか、どのような事を学習すればよいのか?ということに重きを置いてみた。
講師の方に色々と聞いてみたが、結局の所、ほぼ丸暗記することをお勧めされたのであった。
ということで、オンラインヘルプの必要箇所を印刷して暗記しよう!

それで、受かるのかなぁ?受験日も決めないといけないし・・・

NotesURLを作成する方法(@関数の場合)

イメージ
NotesURLを作成する方法(LotusScriptの場合)で紹介したNotesURLを作成する方法の@関数版。


サンプルは自文書のNotesURLを作成するもの。
ポイントは、ノーツDBのレプリカIDを取得するところ。
@ReplicaIDで取得すると、レプリカIDの中に":"が含まれるのだ。NotesURLとして利用する場合、この":"は不要(というか、あるとエラーになる)なので、取り除いておくことが必要になる。

srv := @Name([CN];@Subset(@DbName;1)); svn := @If(srv="";"localhost";srv); dbn := @ReplaceSubstring(@ReplicaID;":";""); view := @ViewTitle; docid := @Text(@DocumentUniqueID); ret := "Notes://" + svn + "/" + dbn + "/" + view + "/" + docid; @Prompt([Ok];"NotesURL";ret)

これを覚えておくと、Notes クライアント以外でメールを受け取った時に活用できるので、便利かな。

NotesURLを作成する方法(LotusScriptの場合)

イメージ
NotesURLとは、Notes://で始まるもので、ノーツDBの固有の文書を表すものである。
IEのアドレス部分に入力したり、「ファイル名を指定して実行」の所に入力したりすると、ノーツクライアントが起動して、指定した文書を開くことができるのである。

他システムからノーツ文書を開くときに便利に使える。

そのNotesURLを作成する方法を考えてみた。
サンプルは、現在の文書からNotesURLを作成するものである。
ビューで実行しても、文書を開いて実行してもできるようにしてある。
ただし、文書を開いて実行する場合、「現在のビュー名」が取得できないため、
"($All)"固定にしている。

Sub Initialize Dim uiws As New NotesUIWorkspace Dim uidoc As NotesUIDocument Dim udoc As NotesDocument Dim db As NotesDatabase Dim srv As NotesName Dim session As New NotesSession Dim docs As NotesDocumentCollection Dim uiview As NotesUIView Dim view As NotesView Dim nurl As String Dim svn As String Dim vname As String Set uidoc = uiws.CurrentDocument If uidoc Is Nothing Then Set db = session.CurrentDatabase Set docs = db.UnprocessedDocuments Set udoc = docs.GetFirstDocument Set uiview = uiws.CurrentView Set view = uiview.View vname = view.UniversalID Else Set udoc = uidoc…

スクリプトでテキストリストを操作する

イメージ
テキストリストを扱ってみよう。
テキストフィールドに複数の値をセットしたいときに便利。

サンプルは、自文書の返答文書として、文書を作成。
その文書のテキストフィールド(複数値可)に値をリストとして追加していくというもの。


Sub Click(Source As Button)     Dim session As New NotesSession     Dim db As NotesDatabase     Dim uiws As New NotesUIWorkspace     Dim uidoc As NotesUIDocument     Dim doc As NotesDocument         '返答文書関連の変数の定義     Dim resdoc As NotesDocument     Dim item As NotesItem     Dim subject As String         'DBの全文書関連の変数の定義     Dim docs As NotesDocumentCollection     Dim doc2 As NotesDocument     Dim i As Integer         '自DBを取得する     Set db = session.CurrentDatabase         '自文書を取得する     Set uidoc = uiws.CurrentDocument     Set doc = uidoc.Document         '返答文書の作成(resdocがdocの返答文書になる)     Set resdoc = db.CreateDocument     Call resdoc.MakeResponse( doc )         'テキストフィールドをクリアする     Set item = resdoc.ReplaceItemValue( "TextField" , "" )         'DBの全文書のタイトルを取得して、テキストリスト形式で返答文書に埋め込む     Set docs = db.AllDocuments     For i = 1…

文書のアイテムの名前の一覧

イメージ
Notes文書のアイテム一覧を表示する方法である。

DB中の各フォームのフィールド一覧で紹介したNotesFormクラスのFieldsプロパティと似ているが、文書内に存在するアイテムが対象となる。従って、フォームにない隠しフィールドも分かるようになる。

Sub Click(Source As Button)     '自文書を取得するための変数の定義     Dim uiws As New NotesUIWorkspace     Dim uidoc As NotesUIDocument     Dim doc As NotesDocument         '結果表示用変数の定義     Dim sbj As String     Dim i As Integer         '自文書の取得     Set uidoc = uiws.CurrentDocument     Set doc = uidoc.Document         i = 0     '文書のアイテム一覧を取得する     Forall x In doc.Items         i = i + 1         sbj = sbj & Cstr( i ) & "." & x.Name & Chr$(10)     End Forall         Messagebox sbj, 0, "文書のアイテム一覧" End Sub



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!

文書のアイテムの最終更新日

イメージ
文書にあるアイテムの最終更新日を取得する方法。
これでどのフィールドの値が変更されたかどうかが確認できるかな?

サンプルは、自文書の各アイテムの最終更新日を表示するものである。

Sub Click(Source As Button)     Dim uiws As New NotesUIWorkspace     Dim uidoc As NotesUIDocument     Dim doc As NotesDocument         Dim sbj As String     Dim i As Integer         '自文書の取得     Set uidoc = uiws.CurrentDocument     Set doc = uidoc.Document         i = 0     sbj = ""         '文書中の全アイテム分繰り返す     Forall x In doc.Items         i = i + 1         'x.Nameがアイテム名で、x.LastModifiedがアイテムの最終更新日         sbj = sbj & Cstr( i ) & "." & x.Name & "の最終更新日 " & Cstr( x.LastModified ) & Chr$(10)     End Forall         '結果の表示     Messagebox sbj, 0, "文書中のアイテムの最終更新日" End Sub

Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!



親文書を検索する

イメージ
自文書の親文書を検索する方法を紹介する。

サンプルは、ビューから実行する物で、選択した文書の親文書のタイトル(Subjectフィールド)を表示するものである。
親文書が存在しない場合は、その旨のメッセージを表示するようになっている。


Sub Initialize     '自DBの定義     Dim session As New NotesSession     Dim db As NotesDatabase     Dim docs As NotesDocumentCollection     Dim doc As NotesDocument         '親文書の定義     Dim pid As String     Dim pdoc As NotesDocument         '現在選択されている文書の取得     Set db = session.Currentdatabase     Set docs = db.UnprocessedDocuments     Set doc = docs.GetFirstDocument         '親文書の文書IDを取得する(存在しない場合は、Nullを返す)     pid = doc.ParentDocumentUNID     If pid = "" Then         Messagebox "この文書には親文書は存在しません。", 0 + 16, "親文書の検索"         Exit Sub     End If         '取得した親文書のIDを元にDBを検索(実際に親文書があるかどうか)     Set pdoc = db.GetDocumentbyUNID( pid )     If pdoc Is Nothing Then         Messagebox "親文書が存在しません。削除された可能性があります。", 0 + 16, "親文書の検索"     Else         '親文書のタイトル(Subjectフィールドの内容)を表示する         Messagebox "親文書のタイト…

メールアドレスの抽出

イメージ
文書中のメールアドレスから、アドレス部分だけを抽出する方法。

どのアドレスに送信してきたのかを確認するのに使えるかな。
Address821形式であれば、そのまま抽出すればよいのだが、
Address822形式の場合、フレーズパートが付いてくるので、分かりづらい。

サンプルは、そのフレーズパートを除いてしまうものである。

@For( i:=1; i<=@Elements(SendTo); i:=i+1; tmp:=tmp:@If(@ValidateInternetAddress([Address821];SendTo[i])=""; SendTo[i]; @Right(@Left(SendTo[i];">");"<") ) ); @For( i:=1; i<=@Elements(CopyTo); i:=i+1; tmp:=tmp:@If(@ValidateInternetAddress([Address821];CopyTo[i])=""; CopyTo[i]; @Right(@Left(CopyTo[i];">");"<") ) ); @For( i:=1; i<=@Elements(BlindCopyTo); i:=i+1; tmp:=tmp:@If(@ValidateInternetAddress([Address821];BlindCopyTo[i])=""; BlindCopyTo[i]; @Right(@Left(BlindCopyTo[i];">");"<") ) ); @Prompt([Ok];"メールアドレスの抽出";@Implode(@Unique(@Trim(tmp))))

Notes/Dominoについてなんでも聞いてみよう!