目次


Lotus Notes/Domino カレンダー・アプリケーションの構築

Comments

はじめに

Lotus Notes カレンダーは、Lotus Notes の中でも最も有名で使いやすいコンポーネントの 1 つです。カレンダーはさまざまな目的で使用できます。一般的な使い方をいくつか挙げてみましょう。

  • 会議室の予約
  • 機器の予約
  • 共有ビジネスまたは部署のカレンダー
  • リソースまたはイベントの計画
  • 休暇の計画

エンドユーザーへの機能だけでなく、Notes カレンダーはアプリケーション開発者にとっても非常に役立ちます。この記事では、簡単なカレンダー・アプリケーションの作成方法を手順を追って説明します。この記事は、経験豊かな Lotus Notes/Domino 開発者で、基本的な Notes カレンダー機能に習熟している方を対象に書かれています。

アプリケーションのアーキテクチャー

カレンダー・アプリケーションは、フォームとビューの 2 つの主要コンポーネントで構成されます。フォームは、予定の日付、時刻、および件名などの情報を取得するために使用されます。ビューは、フォームから提供された特定の日付と時刻に基づいて件名を表示します。信じられないかもしれませんが、繰り返しイベントを管理するカレンダー・アプリケーションに必要なものは、この 2 つの要素だけなのです。

プログラミングを開始する前に、カレンダー・アプリケーションを構築する際のルールと、繰り返しイベントを管理するプロセスについて理解しておきましょう。

ルール

  • 予定フォームには開始日フィールドが必要です。このフィールドは、カレンダー上のどの場所にイベントを表示するのかを決めます。開始日は、カレンダー・アプリケーションのアンカーとなります。
  • 予定フォームには期間が必要です。このフィールドは数値型で、イベント用の連続した日付を表します。(予定フォームに、開始時刻と終了時刻を含めることができます。しかし、これらはオプションの値で、カレンダーに実際にイベントを表示するために必須ではありません。)
  • カレンダー・ビューの列 1 には、昇順にソートした日付/時刻の値を含める必要があります。この列は、ユーザーには表示しません。(カレンダー・ビューを正しく表示するには、最初の列を昇順にソートしなければなりません。)
  • カレンダー・ビューの列 2 には、カレンダー・イベントの期間を含める必要があります。この値は、予定を何日間連続して表示するのかを決めます。期間の値は、正の値または負の値です。正の値の場合、カレンダー・イベントは開始日の右側 (将来) に表示されます。負の値の場合、カレンダー・イベントは開始日の左側 (過去) に表示されます。
  • ビューのスタイルは [カレンダー] に設定してください。この設定により、ビューの外観が、従来の外観から実際のカレンダーへと変更されます。

それでは、アーキテクチャーと繰り返しカレンダー・イベントを管理する実装オプションについて、詳しく見ていきましょう。アプリケーションの複雑さは、繰り返しイベントを管理するプロセスに起因します。どのソフトウェア言語でもそうであるように、ソリューションを設計、開発、および実装する方法は数多くあります。次のセクションでは、可能性のある 2 つのアーキテクチャーについて考察します。

単一文書を使用した繰り返しイベントの管理

すでに、カレンダー・アプリケーションの主要要素であるフォームとビューについて説明しました。次のステップとして、繰り返しイベントを管理するオプションを取り上げます。最初のアプローチは、連続するカレンダー・イベントを管理するシンプルかつ効率的な方法です。

連続イベントとは、最初の日付を起点として継続する予定のことです。言い換えると、カレンダーの複数の日付に表示される 1 つの予定を作成することになります。しかし、カレンダーの日付は、4月4日から7日までのように、連続した日付でなければなりません。単一文書によるアプローチでは、1 つの文書が作成され、カレンダーの日付の範囲にわたってこの予定が表示されます (図 1 参照)。このアプローチは、実装が簡単です。カレンダー・アプリケーションの作成に興味がある場合や、既存のアプリケーションにすぐにカレンダーを追加したい場合は、この方法がスターティング・ポイントとして適しています。

図 1. 単一文書による繰り返しイベント
画面イメージ
画面イメージ

このアプローチの最大の利点は、実装の簡単さです。最小の努力で、新しいアプリケーションを作成できます (または、2 つのフィールドを追加し、カレンダー・ビューを作成することによって、既存のアプリケーションを拡張できます)。また、すべてのカレンダー日付は同じ (つまり 1 つの) 文書を参照するので、ユーザーは 1 つの文書を更新するだけでかまいません。変更内容は、それぞれのカレンダー日付に反映されます。たとえば、予定の本文に会議室の電話番号を追加するケースを考えましょう。作成者は 1 箇所を変更するだけでよく、変更内容は、すべてのカレンダー日付にすぐに反映されます。チームの他のメンバーは、どの文書をダブルクリックしても、同一の情報を見ることができます。

このアプローチの欠点は、複雑な繰り返しイベントを管理できないことです。たとえば、「第 2 金曜日」または「各月の 3 日」などのイベントをスケジュールしたいとき、単一文書によるアプローチでは、ユーザーがそれぞれの日付でエントリを手動で作成する必要があります。

次のセクションでは、繰り返しイベントに対応する、より堅牢で総合的なアーキテクチャーについて解説します。

複数文書を使用した繰り返しイベントの管理

複数文書によるアプローチでは、最初の予定で指定された繰り返しイベントのパラメーターに基づいて、個別の文書が作成されます。たとえば、ユーザーが 1 つの予定を作成すると、その予定からカレンダーの各日付用の文書が個別に生成されます (図 2 参照)。このアーキテクチャーは、スケジューリングの自由度を大幅に高めますが、実装はかなり複雑になります。

図 2. 複数文書による繰り返しイベント
画面イメージ
画面イメージ

この 2 番目のアプローチを実装するには、最初の予定フォームで追加情報を入手することが必要です。これは、ユーザーに繰り返しイベントのパラメーターの入力を求めるダイアログウィンドウによって管理します。パラメーターには、毎週、毎日、曜日、週末をスキップ、毎月、カスタム日付などがあります。最初の予定を保存するときに、すべての繰り返し日付が計算され、該当する各カレンダー日付に個別の文書が生成されます。

この 2 番目のアプローチを使用すると、柔軟性が大きく向上するとともに、繰り返しイベントを管理する機能が得られます。このアーキテクチャーの実装によって、次のような繰り返しイベントを作成できます。

イベントのタイプ
日付4月4日 (1 日のイベント)
毎日4月4日から4月7日まで (連続)
毎週月、水、金
毎月(日付)毎月 1 日
毎月 (曜日) 毎月第 3 金曜日
カスタム日付カンマで区切られたカレンダー日付のリスト
週末をスキップ土曜日または日曜日のイベントは作成しません
次の営業日計算された日付が週末の場合は、月曜日に移動します

もう 1 つの利点として、イベントの移動と削除が挙げられます。各イベントは個別の文書として保存されているので、ユーザーは他の関連イベントに影響を与えることなく、1 つのカレンダー・イベントを移動、削除、または更新できます。

このアプローチの欠点は、イベント日付を計算するために、複雑なアルゴリズムが必要な点です。また、このアプローチでは、各イベントごとに個別の文書が作成されます。作成者がすべての関連イベントで件名または本文を更新したい場合は、各文書を 1 つずつ更新しなければなりません。

また、スケジュール済みの予定を削除するときも追加作業が必要です。関連するすべての予定を削除するには、作成者が各文書を個別に削除するか、関連イベントを自動的に削除するサブルーチンを組み込む必要があります。

シンプルなイベント・カレンダーの作成

それでは、単一文書によるアプローチを利用して、簡単なカレンダー・アプリケーションのサンプルを作成してみましょう。まず、Lotus Domino Designer Client を起動し、空のデータベースを作成します (図 3 参照)。データベースを作成するには、Domino Designer Client で [ファイル] - [データベース] - [作成] を選択します。アプリケーションのタイトルとファイル名を指定します。必ず、テンプレートのタイプとして [- 未入力 -] を選択してください。

図 3. [データベースの作成] 画面
画面イメージ
画面イメージ

[ファイル名] フィールドでは、スペースを削除した方がよいでしょう。スペースが含まれると、Web アプリケーションとして使用するときに問題が生じることがあります。たとえば、「Meeting Calendar.nsf」は「MeetingCalendar.nsf」に置き換えます。

予定フォームの作成

予定フォームは、イベントの開始と終了の日付、期間、作成者、件名、および詳細を入手するために使用されます。期間は自動的に計算されます。繰り返しイベントの管理を含め、カレンダー・アプリケーションに関わるほとんどの作業は、予定フォームに属します。

フォームを作成するには、[新規フォーム] ボタンをクリックするか、[作成] - [設計] - [フォーム] メニューを選択します。

フィールドの定義

次に、下表に示すフィールドを追加します。フィールドを作成するには、[作成] - [フィールド] メニューを選択します。フォーム内の各フィールドでは、必ず、データ型、式、および他のプロパティを設定してください。

フィールド名備考
StartDate日付/時刻、編集可能DEFAULT StartDate:= @If(@IsNewDoc; @Today; @Return(StartDateTime)); StartDate[フィールド] プロパティダイアログで、スタイルを [日付/時刻制御] に設定します。
EndDate日付/時刻、編集可能n/a[フィールド] プロパティダイアログで、スタイルを [日付/時刻制御] に設定します。
Duration数値、計算結果@If(StartDate = ""; 0; EndDate = ""; 0; @BusinessDays(StartDate; EndDate)) この式は、開始日と終了日に基づいて、期間を計算します。
Personテキスト、作成時の計算結果@Name([CN]; @UserName)この式は、作成者の名前を自動的に計算します。
Subject テキスト、編集可能n/an/a
Bodyリッチテキスト、編集可能n/an/a

フィールド名、型、およびスタイルはプロパティダイアログで定義します。フィールドの式は、Designer Client の下側にあるプログラムペインの [値] または [デフォルト値] セクションに入力します。プログラムペインが表示されていないときは、[表示] - [プログラムペイン] を選択してください。(Domino Designer Client の使い方の詳細については、Domino Designer 製品のマニュアルを参照してください。)

グローバルオブジェクトの定義

次のステップでは、フォームに関連するグローバルオブジェクトを (Globals) セクションで定義します。オブジェクトを一度定義すると、フォーム全体からそのオブジェクトを参照できます。これによって、コードが簡素化されるとともに、アプリケーションのコードの効率が高まります。

(Global) の下の (Declarations) セクションで、次のように設定します。

Dim doc As NotesDocument ' 現在のカレンダー文書を参照
Dim ws As NotesUIWorkspace ' 現在のアプリケーション・ワークスペースを参照
Dim s As NotesSession ' 現在のNotes セッションを参照
Dim db As NotesDatabase ' 現在の Notes データベースを参照
Dim sDate As NotesDateTime ' 開始日の計算用の一時変数
Dim eDate As NotesDateTime ' 終了日の計算用の一時変数

(Options) セクションに「Option Explicit」を追加することをお勧めします。Option Explicit によって、すべての変数の宣言 (たとえば、DIM) が強制されるので、デバッグの際に役立ちます。変数が定義されていない場合は、ステートメントが構文エラーとみなされます。これによって、コード内の問題 (変数名のタイプミスなど) を発見し易くなります。

カレンダーの予定フォームは、図 4 のようになっています。

図 4. カレンダーの予定フォーム
画面イメージ
画面イメージ

ウィンドウタイトルを「Appointment」に設定します。このタイトルは、Lotus Notes Client でフォームが開かれるたびに、ウィンドウの一番上に表示されます。タイトルによって、アプリケーションの内容がわかりやすくなります。ウィンドウタイトルは、アプリケーション内の別の場所では使用されないので、好みの値に変更できます (たとえば、「Appointment」、「Meeting」、「"Meeting by " + ユーザー名」など)。

文書が開かれた後、予定フォームでデフォルトの開始日をセットします。

Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)

	Set ws = New NotesUIWorkspace
	Set s = New NotesSession
	ApptDate = ws.CurrentCalendarDateTime

End Sub

予定が表示された後、文書へのハンドルを取得します。LotusScript イベントでは、予定レコードへの情報の設定や予定レコードからの情報の取得に、doc オブジェクトがよく使用されます。

Sub Postopen(Source As Notesuidocument)

	Set doc = source.Document

End Sub

カレンダー・ビューで使用する 2 つの変数 StartDateTime と CalendarDateTime を計算します。これらの変数には、連続するカレンダー日付の配列が含まれます。次のコードは、データをフォーマットし、予定フォームで値を設定します。

Sub Postrecalc(Source As Notesuidocument)
	
	Dim mydate As NotesItem
	Set doc = source.Document
	Set mydate = doc.GetFirstItem("StartDate")
	Set sDate = New NotesDateTime(mydate.DateTimeValue.DateOnly)
	Set doc.StartDateTime = sDate
	Set eDate = New NotesDateTime("")
	Set eDate = sDate
	eDate.AdjustDay(doc.Duration(0) - 1)
	Set doc.EndDateTime = eDate
	doc.CalendarDateTime = doc.StartDateTime

End Sub

文書を保存するたびに、現在の文書が更新されます。これによって、フォームの保存時 (たとえば、ユーザーが [ファイル] - [保存] を選択したときなど) に、最新のデータがユーザーに表示されます。

Sub Querysave(Source As Notesuidocument, Continue As Variant)
	Source.Refresh
End Sub

フォームのプロパティの設定

最後に、[フォーム] プロパティダイアログで、最初のタブの [オプション] セクションにある [フィールドを自動更新] オプションをオンにします (図 5 参照)。このオプションは、予定フォームでデータが変更されたときに、計算結果フィールドを更新します。たとえば、ユーザーが開始日と終了日を変更すると、期間の値が自動的に更新されます。

図 5. フォームのプロパティ
画面イメージ
画面イメージ

フォームを完成させるために、プロパティダイアログでフォーム名として「Appointment | Appt」と入力します。垂直のバーはフォームの別名を示します。次に、フォームを保存して閉じます。(フォーム名と別名の両方を常に設定することは優れた方法です。すべてのコードは、別名を参照するようになります。これによって、既存のコードやビューの式に影響を与えずにフォーム名を変更できる大きな自由度が得られます。)

カレンダー・ビューの作成

この時点で、アプリケーションの大部分が完成しています。残っている作業は、予定イベントを表示するカレンダー・ビューを作成することです。データベースを作成するたびに、「(無題)」というデフォルトのビューが自動的に生成されます。このビューをダブルクリックし、編集モードで開きます。プロパティダイアログを [列] から [ビュー] へ切り替えます。名前を「Calendar」に設定し、別名を「Cal」に設定します。

列の定義

次に、列を定義します。列を追加するには、既存の列見出しをクリックし、[作成] - [列の挿入] メニューを選択します。次の列を追加します。

Column1 は非表示の列で、開始の日付/時刻値を格納し、昇順でソートする必要があります。このプロジェクトでは、[複数値を別のエントリで表示] を選択します。このオプションによって、1 つの文書が複数のカレンダー日付に表示されます (図 1 参照)。プログラムペインで [表示] タイプを [式] に変更し、次の列式を入力します。

REM "Column1 contains the list of start dates as defined in the appointment form";
StartTime := @Time(CalendarDateTime);
DateList := @Explode(@TextToTime(@Text(CalendarDateTime) + "-" + @Text(EndDateTime)));
@TextToTime(@Text(DateList) + " " + @Text(StartTime))

Column1 の見出しをダブルクリックし、[列]プロパティダイアログを表示します。ソートのタイプを設定するために、[列] プロパティダイアログの 2 番目のタブを選択し、[昇順] ラジオボタンをクリックします。また、[複数値を別のエントリで表示] を選択します。列を非表示にするために、[列] プロパティダイアログの最後のタブをクリックし、[列を非表示] を選択します。

図 6. 列のプロパティ
画面イメージ
画面イメージ

Column2 は非表示の列で、カレンダー・ビューを正しく表示するために、イベントの期間を格納する必要があります。2 番目の列に有効な数値データが含まれていない場合は、エラーメッセージが表示されます。次の列式を設定します。

REM "Column2 contains the duration for each appointment form";
Duration;
column1 で説明した手順を用いて、column2 を非表示にします。

Column3 は、カレンダー・イベントのテキスト値を表示します。これが、実際のカレンダー・ビューに表示される値です。次の列式を設定します。

REM "Column3 represents the value displayed on the calendar";
Person;
別の方法として、ユーザー名と件名や、他のデータ要素とテキストの組み合わせなどをこの列に含めることもできます。アプリケーションの使いやすさを高めるために、列の背景色を設定することができます。背景色によってエントリが強調され、ユーザーがビュー内でカレンダー・イベントを見つけやすくなります。背景色を設定するには、[ビュー] プロパティダイアログの 3 番目のタブを選択します。背景の設定は [エントリ] セクションにあります。

メモ:列のタイトルはカレンダー・ビューには表示されません。しかし、列の見出し名によって、作成者だけでなく他の開発者にとっても、ビューの設計と列の内容がわかりやすくなります。

ビューオブジェクトとプロパティの設定

RegionDoubleClick イベントによって、ユーザーがカレンダー日付をダブルクリックすると、新しい予定フォームが自動的に開かれるようになります。フォームの表示後、ユーザーがカレンダーで選択した日付に基づいて、開始日が生成されます。また、このイベントには、選択された日付が現在の日付よりも前であるかどうかをチェックするデータ評価機能が組み込まれています。日付が過去のものであるときは、ユーザーは「Date in past… Do you want to continue?」というプロンプトを受け取ります。ユーザーが [はい] を選択すると、answer 変数が 6 に設定されます (これは、Lotus Notes アプリケーションによって設定されるデフォルト値です)。

日付が将来の場合、またはユーザーが [はい] を選択して過去のレコードを作成する場合は、新しい予定フォームが表示されます。次のルーチンは、ユーザーがカレンダー日付をダブルクリックしたときにのみ実行されます。(後で説明するように、ユーザーは [新規予定] ボタンをクリックするか、[作成] - [予定] メニューを選択することもできます。)

Sub Regiondoubleclick(Source As Notesuiview)
	Dim doc As NotesDocument 
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument 
	Dim view As NotesView
	Dim dateTime As New NotesDateTime( "" )
	Call dateTime.SetNow
	
	'選択された日付が過去の場合は、警告を表示します。
	If Source.CalendarDateTime < Cdat (dateTime.DateOnly) Then
		answer% = Messagebox("Date in past... Do you want to continue?", 292, "Continue?")
	End If
	
	'日付が過去でユーザーが [はい] をクリックした場合、または日付が
	'将来の場合は、新しい予定を作成します。
	If (answer% = 6) Or (Source.CalendarDateTime >= Cdat (dateTime.DateOnly)) Then 
		Set view = Source.View
		Set uidoc = workspace.ComposeDocument ( "", "", "Appt" )
		Set doc = uidoc.Document	
		doc.StartDate = Source.CalendarDateTime
	End If
End Sub

このコードは、カレンダー・ビューを持つ任意のアプリケーションに追加することができます。この場合は、Appt を適切なフォーム名に変更します。これによって、アプリケーションがよりユーザーフレンドリーになるとともに、全体の使いやすさが向上します。

ビュー用のアクションボタンの作成

新しい予定を作るユーザー用のボタンを作成するには、[作成] - [アクション] - [アクション] を選択します。ボタンのタイトルを「New Appointment」にして、プログラムペインに次の式を入力します。

REM "Create new calendar events";
@PostedCommand([Compose];"":"Appt")

現在のカレンダー日付に移動するユーザー用のボタンを作成するには、[作成] - [アクション] - [アクション] を選択します。ボタンのタイトルを「Today」にして、プログラムペインに次の式を入力します。

REM "Jump to today’s calendar date";
@Command([CalendarGoTo];@Date(@Now));

ビューを保存して閉じます。

おめでとうございます。これでカレンダー・アプリケーションが完成しました。

まとめ

この記事では、単一文書によるカレンダーの要素と繰り返しイベントの要素について説明しました。また、簡単なカレンダー・アプリケーションの作成方法も解説しました。この記事が、読者の皆さまのお役に立つことを望んでいます。また、ご意見や、Lotus Notes/Domino に関する記事のご要望などもお気軽にお寄せください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=340650
ArticleTitle=Lotus Notes/Domino カレンダー・アプリケーションの構築
publish-date=09302005