当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。

テクてく Lotus 技術者 Slack に参加しよう!

2008年8月28日木曜日

筆者の環境

今更ながらだが、筆者の環境について書いておこう。

今までの記事を読んでもらってる方は気がついているだろうが、
筆者はNotes/Domino 7.0.xを利用している(たまに、Notes/Domino 6.5も利用する)。

8.0ではないのだ。
なので、コンポジットアプリケーションが何だ。とか、Eclipseが何だ。とかいう話にはまったくついていけてない。
なので、8.0へのバージョンアップ試験も散々だったのだ。
http://guylocke.blogspot.com/2008/07/blog-post_11.htmlを参照。

しかし、そろそろNotes/Domino 8.0についても本格的にやっていかないと、仕事に支障が出るであろうと思われるので、なんとか導入したい。
導入できたら、そこからのTipsなんかも書いていくつもりだ。



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月27日水曜日

レジストリへの書き込み

昨日に続いて、レジストリアクセスの方法である。
今日は、指定したレジストリに値を登録する方法である。
RegReadの代わりに、RegWriteを使うだけ。

RegWriteそのものの使い方は、インターネットで検索してほしい。

※なお、レジストリを扱うので、自己責任で試してみてほしい。

----------------------------------------------------------
Dim wscript As Variant 'WScriptのオブジェクト
Dim tmp As String 'レジストリキー
Dim ret As String '戻り値

Set wscript = CreateObject( "Wscript.Shell" )
tmp = "レジストリのキー"
ret = wscript.RegWrite( tmp, "レジストリへの格納値", "REG_SZ" )

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月26日火曜日

レジストリ内容の取得

Window Scriptを使ったテクニックをもう一つ紹介する。

以前、Window Scriptを使って、応答を待つプログラムの起動の仕方というものをやった。
http://guylocke.blogspot.com/2008/05/windowsscript.html

今回は、これを使って、レジストリの内容を取得するということをやってみたい。
とは言っても、とても簡単だ。
Window ScriptのRegReadメソッドを使うだけ。
RegReadでインターネットを検索すると、具体的な説明がたくさん見つかると思うので、参照してほしい。


※なお、レジストリを扱うので、自己責任で試してみてほしい。

---------------------------------------------------------------------------
Dim wscript As Variant
Set wscript= CreateObject( "Wscript.Shell" )
ret = wscript.RegRead( "取得したいレジストリのキー" )
Msgbox ret

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月25日月曜日

GetEmnbeddedObjectメソッドでのトラブル・・・

筆者がGetEmnbeddedObjectメソッドを利用していて遭遇したトラブルとその回避策について書いてみよう。

http://guylocke.blogspot.com/2008/05/blog-post_22.html
で書いたが、リッチテキスト内の添付ファイルを取得する際、
NotesRichTextItemクラスのGetEmbeddedObjectメソッドを利用した。
通常であれば、これで問題なく取得できるのだが・・・

なんとGetEmbeddedObjectで添付ファイルを取得できないということが発生したのだ。
その文書を眺めてみると、どうみてもそのファイルは存在している。
ためしに添付ファイルをダブルクリックして、起動してみるときちんと起動する。
で、そのファイル名をクリップボードにコピーして、ダイレクトに指定してみるも、やはり取得できない。
理由が全く分からない。

理由が分からなくても回避しなくてはならない。
ということで、以下のように回避した。

---------------------------------------------------------------------------------------
変更前
anames = "添付ファイルの内部ファイル名"
Set afile = ritem.GetEmbeddedObject( anames )

変更後
anames = "添付ファイルの内部ファイル名"
varData = ritem.EmbeddedObjects
Forall xx in varData
If xx.Name = anames Then
Set afile = xx
End If
End Forall


EmbeddedObjectsプロパティを利用することで、そのリッチテキスト内の全添付ファイルを取得するのである。
後は、指定したファイルかどうかを確認していくのである。
なぜか、このやり方では、添付ファイルが取得できたのである。

さすが、Lotus Notes。奥が深い・・・


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月23日土曜日

テンプレートからDBを作成

今回は、LotusScriptでNotesDBをテンプレートから作成する方法。

テンプレートDBが****.ntfの場合、手動でNotes DBを作成するのと同じようなことができる。
・テンプレート名が書いてある場合、「テンプレートを引き継いで設計」のオプションがついた状態になる。
・ACLに[****]というエントリがあると、テンプレートでは、その内容でACLが作成される。
 -Default-が「読者」でも、[-Default-]が「なし」の場合、作成されたNotes DBの-Default-は「なし」になるのである。

------------------------------------------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim curdb As NotesDatabase
Dim newdb As NotesDatabase

Set curdb = session.CurrentDatabase
Set newdb = curdb.CreateFromTemplate( curdb.Server, "newdb.nsf", False )
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月20日水曜日

不定回数の繰り返し処理

なにげに使ってきたDo命令。
今回はこのDo命令にスポットを当ててみる。
言うまでもなく、繰り返し処理を行う命令である。
For ~ Nextと違って、繰り返し回数が決められていないものである。
そのため、誤って無限ループを作ってしまう可能性もあるものである。
(筆者は、1度だけやってしまったことがある。本番用のプログラムで大慌てしたものだ)

サンプルは、繰り返しの度にダイアログメッセージを表示するものである。
そこでクリックされたボタンの種類により、繰り返し処理を行うかどうかを決めている。

------------------------------------------------------------------------------
Sub Click(Source As Button)
'ループ処理の前に条件提示
flag = Messagebox("ループ処理を行いますか?" & Chr(10) & "ここで、「いいえ」を押すとループ処理を行いません。", 4 + 32, "質問")

'ループの直前に条件を判断する(条件によってはループの中の処理を行わないこともある)
Do While flag = 1 Or flag = 6
flag = Messagebox( "「キャンセル」を押すと、ループを抜けます。", 1 + 48, "タイトル" )
Loop
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月19日火曜日

x秒待つ

夏休み明け一発目なので、軽い奴にしましょう。

タイマー機能です。
指定した数値の秒数だけLotusScriptの実行を停止するものです。

サンプルは、入力した数値の秒数だけ停止するものです。
Sleep前後の時間を記録しておくことにより、実際に停止していたのは何秒だったのかを表示します。

----------------------------------------------------------------------------------------------
Sub Click(Source As Button)
Dim FromTime As String
Dim ToTime As String
Dim x As Integer

res = Inputbox( "何秒待つか入力してください。", "x秒待つ", "0" )
If res = "" Then
Msgbox "キャンセルしました"
Else
x = Cint( res )
FromTime = Now
Sleep x
ToTime = Now
Msgbox "Sleep前: " + FromTime + Chr$(10) + "Sleep後: " + ToTime
End If
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月11日月曜日

バイト数による文字列の抜き出し

文字列の抜き出し関数のサンプル。

※Midbp関数は、Mid関数と違い、日本語文字は2バイトとしてカウントするので、1バイト/2バイト混在時の検索に役立つ。


------------------------------------------------------------------------------
Sub Click(Source As Button)
Dim stra As String
Dim strb As String

stra = "ABCDEFghijklmnOPQRSTUVWXYZ"

'11バイト目から3バイト分抜き出す
strb = Midbp$( stra, 11, 3 )
Messagebox strb, 0, "抜き出した文字列"
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月8日金曜日

データベースの検索4(@関数による検索)

今回の検索は、文書そのものではなく、文書の一部のデータである。
@DBColumnを使うと、ビューの特定の列の値や特定のアイテム値のリストを取得することができる。

サンプルは、自DBのビューの1列目を取得して、リスト形式で表示するものである。

--------------------------------------------------------------------------------------------
REM "2つ目のパラメータはNULLの場合、自分のDBを表す。";
TEMP := @DbColumn("Notes":"NoCache";"";"(ByCategory)";1);
@Prompt([OKCANCELLIST];"DB内の検索";"検索結果が表示されます。";"";TEMP)

※実行するには、検索キーでカテゴライズされたビューがあることが必要となる。


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月7日木曜日

文書リンクの作成

リッチテキストフィールド内に文書リンクを作成するメソッドとして、
AppendDocLinkがある。
大変便利なメソッドで、ワークフローや掲示板からの通知によく使うのではないかと思われる。


このメソッドを使うときの注意点が1つある。
文書リンク元のDB(文書リンクの文書があるDBということ)に、デフォルトビューが設定されている必要がある。




サンプルは、自分自身に返答文書を作成して、その中に自分書の文書リンクを保存するものである。

Sub Click(Source As Button)
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim udoc As NotesDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim resdoc As NotesDocument
Dim ritem As NotesRichTextItem

Set uidoc = uiws.CurrentDocument
Set udoc = uidoc.Document
Set db = session.CurrentDatabase
Set resdoc = db.CreateDocument
Set ritem = New NotesRichTextItem( resdoc, "Body" )
resdoc.Form = "Response"
resdoc.Subject = "文書リンク付返答文書"
Call resdoc.MakeResponse( udoc )
Call ritem.AppendDocLink( udoc, udoc.Subject(0) )
Call resdoc.Save( True, True )
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月6日水曜日

リッチテキストが壊れる・・・途中経過

今は8月。
リッチテキスト破壊事件?から、すでに4ヶ月以上が経過しています。
実は、まだ解決していないのです。

一時期、後一歩!!というところまで来たのですが、残念ながら・・・
ということでした。
IBM様との約束で、詳しい内容が言えないので、今はこれ以上の情報が載せられません。

ですが、解決した暁には、きっとご報告できることでしょう。
その日を待って・・・


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

日付の計算

http://guylocke.blogspot.com/2008/05/blog-post_06.html
では、LotusScriptで日付の計算を行ったが、それを@関数で実行する方法である。
と言っても、考え方は全く同じ。

Aという日付からBという日付までの期間を求める方法。

1.Cという計算結果フィールドを作成する。
2.式にB-Aと入力する。

この答えが期間になる。
ただし、結果は秒数として算出されるので、注意が必要。

経過分数が欲しい場合 C/60
経過時数が欲しい場合 C/60/60
経過日数が欲しい場合 C/60/60/24
経過年数が欲しい場合 C/60/60/24/365(閏年が入るので、割り切れないこともある)

今日時点の年齢を求めるのなんかは関数を作るより簡単で良いかも。
例)生年月日をBirthday、年齢をAgeとする。
Ageフィールドの計算結果に、
(@Today-Birthday)/60/60/24/365
と入力しておけばよい(Birthdayフィールドが空だとエラーになるので、初期値を入れておくこと)。

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年8月5日火曜日

バックグラウンドでの再計算

バックグラウンドで文書を作成すると、フォームに設定してあるInput Translation、Input Validationイベントなどが有効にならない。
それらを有効にさせたい場合は、下記のメソッドを利用する。

Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument

Set db = session.CurrentDatabase
Set doc = db.CreateDocument
・・・
flag = doc.ComputeWithForm( True, True )

if flag = True then
Call doc.Save( True, True )
end if
End Sub

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ