|
 |
ソフトウェア > Lotus > Lotus Developer Domain > 製品別技術情報 > Lotus Notes/Domino >
LDD Today
LotusScript:Notes/Domino 6のビューに関するプログラミング
 |
 |
 |
by Sally Blanning DeJean、David DeJean
レベル:中級者
対象: Notes/Domino
原文の掲載:2003年8月4日
本記事は、Notes/Domino 6におけるLotusScriptプログラミング言語の新規クラスおよび拡張に関する詳しい解説シリーズの5回目の記事です。これまでの記事では、リッチ・テキスト要素を操作する新規LotusScriptクラス(「LotusScript: Rich text objects in Notes/Domino 6」)、LotusScriptのXMLサポート(「LotusScript: XML classes in Notes/Domino 6」と「LotusScript: More XML classes in Notes/Domino 6」)、およびプログラミング管理機能の拡張(「LotusScript: The NotesAdministrationProcess Class in Notes/Domino 6」)について説明しました。
この5回目の記事では、NotesViewクラス、NotesViewColumnクラス、およびNotesUIViewクラスの機能拡張について解説します。これまでの記事と同様、ここでは、読者がLotusScriptプログラミング言語を十分理解している、熟練したDominoアプリケーション開発者であることを前提としています。
Notes/Domino 6のLotusScriptクラス(NotesViewクラス、NotesViewColumnクラス、NotesUIViewクラス)の新規ビュー/ビュー列のメソッドおよびプロパティーの多くは、アプリケーションのビュー変更に対するユーザーからの要求に絶えず応えなければならないことに苦悩している開発者の一助となるために追加されたようです。開発者は、これらの新規および拡張メソッド/プロパティーによって、開発者以外のユーザーが実行して開発者の介入なしにビューを変更できるスクリプトを作成できます。
- NotesViewクラスには、新しく7つのメソッドと5つのプロパティーが追加され、以前は読み取り専用であったプロパティーのいくつかは、読み取り/書き込みプロパティーに拡張されています。新機能としては、ビューの設計の上書きを防ぐ要素の設計のロック機能や、設計の更新禁止機能などがあります。Notes/Domino
6ではビュー内の文書数をより簡単にカウントできるようになりました。また、ユーザーによるビュー選択式の変更や列の作成、コピー、削除を可能にするスクリプトを作成できるようになりました。
- NotesViewColumnクラスには、17の新規プロパティーおよび読み取り専用から読み取り/書き込みに拡張された30の既存プロパティーがあります。これらのプロパティーによって、ヘッダー・スタイル(フォント、ポイント・サイズ、カラー)の変更、列のテキストと列のフォーマット、ソートおよび表示/非表示の変更、さらに列式を変更するスクリプトを記述できます。
- NotesUIViewクラスには、新しく3つのプロパティーと2つのメソッドが追加されました。しかし、最も重要なのはこのクラスの3つの新規イベント、特にInViewEditイベントです。
これらのLotusScriptの新機能によって、アクション、エージェント、またはビューのイベント単位でスクリプトからビューを変更できます。ビューの選択基準の変更、列の追加や削除、列の外観の変更、または列式の変更などを頻繁にユーザーが要求するような組織で勤務している場合、これらのNotes/Domino
6の新機能を詳しく検討してみるとよいでしょう。おそらく仕事がかなり軽減されるはずです。
この他に、ユーザーとビューとの対話方法を大きく拡張する2つの新機能があります。1つ目は、設計者以外のユーザーがカスタマイズされた共有ビューを作成できるようにする機能です。ユーザーはスクリプトを実行して、希望する列とフォーマット・オプションを備えた望みのカスタム・ビューを作成できます。2つ目は新しいInViewEditイベントを使用して、ユーザーがビュー上で直接文書を作成および編集できるようにする機能です。
この記事では、これらのLotusScriptの新機能を使用した5つのサンプル・アプリケーションについて調べていきます。
- ビュー選択式のプログラミング
- アクション・バーから実行されたエージェントは、選択式を再書き込みしてビューを再表示できます。これは、ユーザーが開発者の頻繁な介入なしでビューをカスタマイズするのに役立つ強力なツールです。
- ビューのルック・アンド・フィールのプログラミング
- ビュー選択式のプログラミングと同様に、ビュー画面の他の属性(例として、列式および表示フォーマット)をプログラミングできます。
- 新規ビューの作成
- InViewEditイベントの使用
- 開発支援
LotusScriptのいくつかの新機能によって、開発者はより効率的に作業できるようになります。たとえば設計要素のロックは、複数のユーザーが同時に設計要素を操作できないようにします。アプリケーションの全ビュー(ヘッダーのフォント、サイズ、カラー、および列のテキストの設定)を標準化するエージェントの実行によって、アプリケーションをテスト・リリースする前に企業の設計基準を徹底できます。
これらのサンプル・アプリケーションの作業コードが含まれているLSViews.nsfというNotesデータベースは、Sandboxからダウンロードできます。このデータベースは、ローカルまたはサーバー上で実行できます。ただし、エージェントに適切なIDを再割り当てし、組織の基準を満たすセキュリティを設定するために、すべてのエージェントを開いてから再保存しなければなりません。
これらのLotusScriptの新機能を使用するアプリケーションは、データベースを事実上再設計します。したがって、ユーザーは十分な権限を有する署名者の代理でエージェントを実行するために、設計者の権限または許可のいずれかが必要になります。最も簡単な方法は、すべてのユーザーを含むグループを設定し、グループに代理権限を与えることです。詳細については、LDD
Todayの記事「Decoding the new Notes/Domino 6 Agent Features」を参照してください。
ビュー選択式の変更は、ユーザーに制御を提供して情報に集中しやすくする特に有効な例です。LSViewsデータベースでは、Allという名前のビューがHRアプリケーションを表示します。文書には、企業を退職する従業員名とその所属部署名および最終就業日が記載されています。ビューのアクション・バーには、いくつかの共有アクションが表示されています。これらのアクションはすべて、アプリケーションに格納されているエージェントを実行します(アクションではなくエージェントとする理由は、アクションは代理実行できないからです)。これらのエージェントの1つであるDate
Rangeを使用すると、データベース・ユーザーは開始日および終了日を入力してビューの選択式をリセットし、その期間内の文書のみを表示できるようになります。Date
Rangeエージェントの利点は、一般的な全文検索と比べて、ビューの構成が変わらないことです。ビュー画面には、検索によって失われてしまうカテゴリー見出しとビューの文書順序が維持されます。
Date Rangeアクションは@Command式を使って、Datesというエージェントを実行します。つまり、@Command([RunToolsMacro];"(Dates)")
となります。(エージェント名が括弧でくくられているのは、エージェント・メニューに表示されないからです。)Datesエージェントはユーザーに開始日および終了日の入力を促し、ユーザーの入力値から選択式を作成します。
Sub Initialize
'Prompts user for beginning and ending dates
'Changes selection formula to display docs between dates
Dim uiw As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim view As NotesView
Dim formula As String
Dim one As String
Dim two As String
Dim ct As Integer
one = uiw.Prompt(Prompt_OKCANCELEDIT,"Enter the starting date","Start
Date (use format MM/DD/YY)","")
two = uiw.Prompt(Prompt_OKCANCELEDIT,"Enter the ending date","End
Date (use format MM/DD/YY)","")
formula = |SELECT Date > [| & one & |] & Date < [| &
two & |]|
Set uiview = uiw.CurrentView
Set view = uiview.View
view.SelectionFormula = formula
Call uiw.ViewRebuild
ct = view.EntryCount
Messagebox "The number of docs in this view = " & ct,,"Count
of docs in view"
End Sub |
|
新しい選択式がformulaという名前のストリングとして作成され、以下の行の今までの選択式と置き換わります。
| view.SelectionFormula = formula |
|
この行では、NotesViewの新規プロパティーのSelectionFormulaを使ってビューの選択式を設定します。次に、NotesUIWorkspaceのもう1つの新規メソッドViewRebuildが、ビューを(作成された場所である)バックエンドから再構築し、即座に表示します。
(エージェントは最後の行で、ビューの文書数を表示するのにビューの新規プロパティーEntryCountを使用していることに注目してください。この簡単なビューの文書数カウント方法と、ビュー全体をループしてカウントするNotes/Domino
6以前の方法とを比べてみてください。はるかに簡単であり、より少ないコーディング量ですみます。)
このスクリプト・ビュー・アクションは、設計者またはビュー・アクションの再実行によって変更されるまでビューの選択式を永続的に設定します。設計テンプレートをサーバー上で実行している場合、これを忘れないようにすることが大事です。なぜなら、設計テンプレートは更新時にビューを上書きしてしまうからです。しかし、新規NotesViewプロパティーIsProhibitDesignRefreshを使用することによって、設計の更新を禁止できます。IsProhibitDesignRefreshは、ブール関数です。次のとおり[Prohibit
design refresh or replace to modify]オプションが選択されている場合、設計は変更できません。

ただしあらかじめ注意しておきますが、LotusScriptを使用すると設計を変更できます。このプロパティーがチェックされると、By
Dept.エージェントはユーザーに警告を発して禁止を解除するかどうかを尋ねます。禁止の解除が選択されると、以下の行、
| view.IsProhibitDesignRefresh = False |
|
によって、ユーザーはビューを、新しく選択したビューで上書きできます。もちろん、ユーザーはACLに設計者としてリストアップされているか、設計変更の権限者の代理としてBy
Dept.エージェントを実行している必要があります。By Dept.エージェントのコードは、次のとおりです。
Sub Click(Source As Button)
'Changes selection formula to professions user chooses.
Dim uiw As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim view As NotesView
Dim formula As String
Set uiview = uiw.CurrentView
Set view = uiview.View
If view.IsProhibitDesignRefresh Then
Messagebox "Design Refresh not allowed",,"The view does
not allow changes."
askchange = uiw.Prompt(PROMPT_YESNO,"Change design refresh settings?",
_
"Do you want to change the prohibition to change this view design?")
If askchange = 1 Then
view.IsProhibitDesignRefresh = False
Else
Exit Sub
End If
End If
one = uiw.Prompt(PROMPT_OKCANCELEDIT,"Choose a department","Enter
department to display. (Leave blank to display all.)","")
formula = |SELECT @Begins(Profession;"|& one & |")|
view.SelectionFormula = formula
Call uiw.ViewRebuild
End Sub |
|
By Dept.エージェントはProfessionフィールドの内容を使って、表示する文書を選択します。次に、ユーザーに部署名または役職の初めの何文字かを入力するよう促します。

このエージェントは、選択式でこのストリングを@関数の一部として使用します。上の画面の例の場合は、SELECT
@Begins(Profession; "Const") となります。
同様に、他の2つのアクションがビュー選択式を再書き込みします。Marketing
Onlyエージェントは以下の選択式を記述して、Marketingで始まるProfessionフィールドを持つ従業員だけにビューを制限します。
| formula = |SELECT @Begins(Profession;"Marketing")| |
|
Show Allエージェントはビューをリセットし、以下の選択式を使ってデータベース内の全文書を表示します。
ビューの選択式をプログラミングできるのと同様に、LotusScriptの新機能によってビューの他の属性もプログラム制御することができます。Allという名前のビューでは、ビューの選択式の変更、および第1列のフォーマットの変更を行う4つのアクションにおいてこれらの新機能を使用しています。
Small DisplayおよびLarge Displayという2つのエージェントが、従業員名の書体表示を変更します。Large
Displayエージェントは、view.Columns(0) で指定された列の4属性を記述することによって、ビューの第1列で使用されているタイプフォントの4属性(書体、サイズ、スタイル、カラー)をすべてリセットします。
Sub Initialize
'Sets view to a standard color and font
Dim uiw As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim view As NotesView
Dim vc As NotesViewColumn
Set uiview = uiw.CurrentView
Set view = uiview.View
'Set first column to bold and 12 pt
Set vc = view.Columns(0)
vc.FontFace = "Default Sans Serif"
vc.FontPointSize = 12
vc.FontStyle = VC_FONT_BOLD
vc.FontColor = COLOR_BLACK
Call uiw.ViewRebuild
End Sub |
|
FontStyleおよびFontColorで使用可能な値の完全なリストについては、『Domino Designer 6 Help(英語)』を参照してください。FontFace値には、Properties列のフォント・リスト内のあらゆる名前を付けることができます。ただし、アプリケーションを実行するコンピューターにインストールされているフォントを指定するように気をつけてください。カラーは、指定されている16のカラー定数に限定されていません。新しいNotesColorObjectを使用してフォント・カラーを設定できます。詳細については、本シリーズの以前の記事「LotusScript: Rich text objects in Notes/Domino 6(英語)」の「16色以上のカラー設定」の章を参照してください。
Small Displayエージェントは、書体属性の値以外はLarge Displayエージェントと実質的に同じです。
vc.FontFace = "Default Sans Serif"
vc.FontPointSize = 10
vc.FontStyle = VC_FONT_PLAIN
vc.FontColor = COLOR_BLACK |
|
変更されていない属性があるにもかかわらず、テキスト・スタイルの4属性すべてがリセットされていることに注目してください。これは、明示的に変更されていない設定が現行値にデフォルト設定されるため、すべての設定を指定しない場合、予想外の値を取得する可能性があるからです。
Last/FirstエージェントおよびFirst/Lastエージェントも同様に、列式を再書き込みして名前の表示順序を変更します。Last/Firstエージェントは、コンマとスペースで区切られた従業員の姓名を含むフィールドの内容を連結するビューの第1列の式を記述します。
Sub Initialize
Dim uiw As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim view As NotesView
Dim vc As NotesViewColumn
Set uiview = uiw.CurrentView
Set view = uiview.View
'Sets first column to display Lastname, Firstname
Set vc = view.Columns(0)
vc. Formula = |Last + ", " + First|
Call uiw.ViewRebuild
End Sub |
|
First/Lastエージェントは、式順を次のように反転します。
| vc. Formula = |First + " " + Last| |
|
Allビューのアクション・ボタンを押すと、さまざまなルック・アンド・フィール・アクションが互いに上書きしないことに気付くでしょう。たとえば、販売部門の従業員名のみを大きな文字で姓名の順で表示するように、ビューを設定できます。同様に、さらにグローバルな手法を使用して、ビューの属性を設定するほうが役立つ場合があるかもしれません。詳細については、この記事で後述する「設計基準の徹底」を参照してください。
Notes/Domino 6でLotusScriptを使用して、既存ビューへの列の追加や新規ビューの作成を実行できます。この例では、「1.
Create View and Add Columns」というエージェントがビューを何もないところからビルドして、ユーザーが希望する順序で列を指定できるようにします。このスクリプトでは、設計者はエージェントが使用可能なすべての列を含むマスター・ビューを作成しなければなりません。このケースでは、ビューはMainと呼ばれ、Terminationフォームの各フィールドの列を含んでいます。ビューの列は、特定の順序である必要はありません。また、アプリケーション・ユーザーが使用可能なビュー・リストに表示されないように、ビューを非表示にすることもできます。
以下のInitializeサブルーチンでは、スクリプトはユーザーが作成中のビューに新しい名前を入力するための入力ボックスを表示します。サブルーチンは次の行から始まります。
| Redim Preserve checkviewname(Ubound(db.Views)) |
|
それから、既存ビューの名前をチェックして、新しい名前がすでに使用されていないことを確認します。すでに使用されている場合、スクリプトはCHOOSENAMEラベルに戻り、新しいビュー名の入力を再度促します。
| Set UsersView = s.CurrentDatabase.CreateView(newviewname) |
|
この行は、NotesDatabaseクラスの新しいCreateViewメソッドを使用しています。すべてのビューには文書番号を持つデフォルト列が1列作成されているため、以下の行
| Call UsersView.RemoveColumn(UsersView.ColumnCount) |
|
が、そのデフォルト列をNotesViewクラスの新しいRemoveColumnメソッドで削除します。次にスクリプトはMainビューの列すべてを検索して、ヘッダー・タイトルと共にallcolsという配列を作成します。最後のDo
Loop Whileループは、allcols配列をユーザーが選択する列リストとして表示するプロンプトを作成します。このループは、ユーザーが新規ビューに列を追加したいという意向を示し続けるかぎり、継続されます。
ユーザーが新規ビューから列を選択すると、スクリプトはFor-Nextループを使用してMainビュー内の列タイトルをチェックし、正しい列を見つけ出します。スクリプトは正しい列を見つけ出すと、その列を新規ビューにコピーします。
| Set col2 = UsersView.CopyColumn(col1, K) |
|
この行は、新しいCopyColumnメソッドを使用してコピーを実行します。Col1はMainビューの列を、Kは新規ビューにおける列の位置を指します。Kはユーザーが新規ビューに列を追加するたびに増えるため、新しい列は前の列の後にそれぞれ配置されます。そうしなければ、すべての列はビューの第1列の位置に追加され、既存の列は右に移動させられてしまいます。
次にスクリプトは、ユーザーにさらに列を追加するよう促し、再度For-Nextループを使用してMainビュー内の列位置を見つけ出し、その列を新規ビューにコピーします。これは、ユーザーがプロンプトに対して、これ以上新規ビューに列を追加したくないことを示すまで継続されます。
以下で始まるif文、
| If col2.Position = 1 Then |
|
は、新規ビューにおける列の位置をチェックします。列が第1列の場合、ユーザーはその列をソートするかどうかを決めるよう促されます。if文の実行後、以下の行
| col2.HeaderFontColor = COLOR_BLUE |
|
によって、すべての列ヘッダーが青色に設定されます。サンプル・コードについては、「LotusScript: Programming views in Notes/Domino 6 sidebar」を参照してください。
新しいInViewEditイベントを使用すると、ユーザーは文書を開くことなくビュー上で直接文書を編集または作成できます。これは、とても便利です。ビュー上での編集は、複数のチェックボックスやラジオ・ボタンが必要なフィールドの記入には不十分かもしれませんし、リストの制限もあります。しかし、迅速なデータ入力や値の変更が必要なフィールドを素早く編集するには有効です。
たとえば、新規フィールドをフォームに追加し、そのフィールドを更新する既存文書すべてをチェックする必要がある場合、各文書を開いて編集してから保存するよりも、特別に作成されたビュー上で編集する方が早くて簡単です。または、2、3の単純なフィールドのみを含む一連の文書を新規作成する場合、ビューを使用して文書を作成する方が望ましいでしょう。
InViewEditイベントは、ユーザーが編集可能な列を一度クリックするか(ダブルクリックすると文書が開きます)、Ctrlキーを押しながらクリックして新規文書を作成した場合に発生します。ビューの設計において、多少のセットアップが必要になります。
ビューには、フィールド値が代入された列が少なくとも1つ含まれている必要があります。[Column
Properties]ボックスの[Basics]タブから、[Editable coulumn]オプションを選択します。

[View Properties]ボックスの[Options]タブから、[Create new documents
at view level]オプションを選択します。(ユーザーがビュー上で既存文書の編集しかできないようにしたい場合は、このオプションを選択しないでください。)

このオプションが選択されたビューを開くと、ビューの一番下に[Ctrl-Click
here to add a new document]という行が表示されます。

Ctrlキーを押しながらマウスをクリックすると、編集可能列に編集ボックスが表示され、データ入力が可能になります。たとえユーザーが列の編集ボックスにテキストを入力できたとしても、設計者がビューのInViewEditイベントのスクリプトを記述していないかぎり何も起こりません。InViewEditイベントを使用するには、後に続くパラメーターを使用し、理解する必要があります。基本構文は、次のとおりです。
| InViewEdit(Source As NotesUIView, RequestType As Integer, ColProgName As
Variant, ColumnValue As Variant, Continue As Variant) |
|
この基本構文を構成要素に分割すると、InViewEditイベントの動作について理解できるはずです。
- Source As NotesUIView
現在開いているビューを指し、NotesUIViewクラスのすべてのプロパティーおよびメソッドが格納されています。
- RequestType As Integer
この整数はビューで作成中の要求のタイプを示し、要求番号は1から4まであります。1は照会要求に予約されているため、使用できません。要求タイプ1は、ユーザーが行の列をクリックして編集するか、Ctrlキーを押しながらクリックして新規文書を作成すると、自動的に生成されます。2は列のフィールドの検証、3は文書の保存、4は新規文書の作成を要求するタイプです。
- ColProgName As Variant
編集可能列(単数または複数)プログラム名を指します。要求がタイプ1またはタイプ2(照会または検証)の場合、ColProgNameはビュー内の現在編集可能な列です。要求タイプ1または2の場合、ColProgNameには1つの要素しか含まれないため、配列位置は常に0になります。要求タイプ3または4の場合、ColProgNameは現在稼働中の列のプログラム名で、配列位置は0から始まります。IBMは、([Column
Properties]ボックスの[Advanced]タブに表示される)列のプログラム名と、列の実際のフィールド名を同じにすることをお勧めします。名前が異なる場合、値を設定する前に個別に各プログラム名をチェックしなければなりません(Notesでは、列を作成する際に、入力したフィールド名と同じ名前がプログラムに付けられるため、たいていの場合は変更する必要はありません)。注意しなければならないもう1つの問題は、プログラム名とフィールド名が異なる場合、開いた文書でも値が表示されない場合があることです。たとえばDateという列のフィールド式を@Date(Date)
に変更すると、そのプログラム名も$2などに変更されます。その場合、スクリプトから$2という列のプログラム名を見つけ出さなければなりません。なぜなら、その列に入力した値はDateフィールドではなく、$2という名前のフィールドとして格納されるからです。
- ColumnValue As Variant
編集可能列またはColProgNameから参照される列の値の配列。配列はデフォルトでストリング値になり、配列要素はColProgNameと1対1で対応します。
- Continue As Variant
デフォルトでtrueをとるブール関数。検証が失敗するとfalseに設定される場合があります。
編集可能ビューの作成
とても単純なInViewEditイベントについて調べてみましょう。このイベントは、LSViewsデータベースでInViewEdit/Edit
View 1という名前のビューを開くことによって実行できます。このビューのスクリプトを、以下に示します。このスクリプトは、1つの要求タイプ(タイプ4)のみを実行して新規文書を作成、保存し、編集可能列は1つしかないと想定します。最初の2行ではNotesDocumentが宣言され、データベース・オブジェクトdbがインスタンス化されます。ユーザーがCtrlキーを押しながらクリックするか、または既存の編集可能列をクリックすると、InViewEditスクリプトがトリガーされます。(注:この例では、編集可能列により既存文書の編集ボックスが開かれますが、既存文書は保存されません。保存するには、別の要求タイプが必要です。)
このスクリプトは、最初に新規文書を作成してからformフィールドに名前を付けます。Notesは自動的に編集可能列Colprogname(0)
を見つけ出し、その値を取得します。この場合、Colprogname(0) は第1列のプログラム名Name.と等しくなります。ColumnValue(0)
は、ユーザーが最初の編集可能列に入力した値と等しくなります。
次に
| Call doc.ReplaceItemValue(Colprogname(0), ColumnValue(0)) |
|
は、NotesDocumentクラスのReplaceItemValueメソッドを使用して、列のプログラム名とマッチングする空のフィールドをユーザーの入力値に置き換えます。
| Call doc.Save(True, False, True) |
|
は、文書を保存します。
Sub Inviewedit(Source As Notesuiview, Requesttype As Integer,
Colprogname As Variant, Columnvalue As Variant, Continue As Variant)
Dim doc As NotesDocument
Set db = Source.View.Parent
'Check for request to save a new document
If Requesttype = 4 Then
'Create a new document
Set note = db.CreateDocument()
'Give the doc form name
note.Form = "TERMINATE"
'Add the value to the document in the designated column
Call doc.ReplaceItemValue(Colprogname(0), ColumnValue(0))
'Save the document
Call doc.Save(True, False, False)
End If
End Sub |
|
ビューが複数の編集可能列を持つ場合、
| Call note.ReplaceItemValue(Colprogname(0), ColumnValue(0)) |
|
をForループと置換して、スクリプトがすべての編集可能列をループして値を入力するようにします。以下のInViewEdit/Edit
View 2のサンプル・コードを参照してください。
For i = 0 To Ubound(Colprogname)
'Add the value to document in the designated column
Call note.ReplaceItemValue(Colprogname(i),ColumnValue(i))
Next |
|
要求タイプ4はこのコードが処理する唯一の要求であるため、このサンプル・ビューにおいてユーザーが実行可能な編集アクションは、新規文書の作成と保存のみです。これは、ユーザーに多少の混乱を招くかもしれません。なぜならユーザーは編集可能ビューのあらゆる文書を編集できるため、既存文書への変更も保存できると考える可能性があるからです。ユーザーが既存文書を編集できないようにしたい場合、UIによる最良の解決策は、この制限を示すメッセージ・ボックスを表示して要求タイプ3を処理するif文を追加することです。これは、以下のコードを上記サンプル・コードのIf
Requesttype = 4文の直後に挿入することによって実行できます。
Else
If Requesttype = 3 Then
Messagebox "You cannot edit existing documents in this view",
, "Error"
End If |
|
フィールドの編集と検証
Notesに付属されているDomino Designerヘルプには、Select Case文を使って検証、編集、および新規文書を作成し、ビューに保存するInViewEditスクリプトの例がいくつか格納されています。このコーディング手法では、要求タイプを簡単に読めて管理できるコードのブロックに分割します。
次のスクリプトは、使用可能な全要求タイプの基本処理を示したものです。このサンプル・コードは、InViewEdit/Edit
View 3にあります。
Sub Inviewedit(Source As Notesuiview, Requesttype As Integer,
Colprogname As Variant, Columnvalue As Variant, Continue As Variant)
'Define constants for request types
Const QUERY_REQUEST = 1
Const VALIDATE_REQUEST = 2
Const SAVE_REQUEST = 3
Const NEWENTRY_REQUEST = 4
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim caret As String
Set db = Source.View.Parent
caret = Source.CaretNoteID
If caret = "0" Then Exit Sub
Set doc = db.GetDocumentById(caret)
Select Case RequestType
Case VALIDATE_REQUEST
'Validate for empty column value
If Fulltrim(ColumnValue(0)) = "" Then
Messagebox "Field has no value",, "You must enter a value
in the column."
Continue = False
End If
Case SAVE_REQUEST
For i = 0 To Ubound(Colprogname)
'Add the value to document in the designated column
Call doc.ReplaceItemValue(Colprogname(i),ColumnValue(i))
Next
'Save the document
Call doc.Save(True, False, True)
Case NEWENTRY_REQUEST
Set doc = db.CreateDocument()
'Give the doc form name
doc.Form = "TERMINATE"
For i = 0 To Ubound(Colprogname)
'Add the value to document in the designated column
Call doc.ReplaceItemValue(Colprogname(i),ColumnValue(i))
Next
Call doc.Save(True, False, True)
End Select
End Sub |
|
スクリプト冒頭部分の4つの定数は、InViewEditイベントで処理される4つの要求タイプの記述です。QUERY_REQUEST行は必ずしも含める必要はありません。現在設計者はこの行を使用できないからです。
caretを参照している行は、文書への参照です。CaretNoteIDは、NotesUIViewのプロパティーです。これは、現在開かれているビュー内で強調表示されている文書または編集中の文書です。CaretNoteIDは、文書を特定する英数字列です。caretがゼロ以外の値を返した場合、文書は存在し、編集可能列は検証され、保存されます。caretがゼロを返した場合は、文書は存在しません。
これは、ユーザーが新規文書を作成中であることを意味します。イベント・スクリプトの実行は、以下の行によって停止されます。
| If caret = "0" Then Exit Sub |
|
ビューは選択された列で編集ボックスを開き、ユーザーが値を入力するのを待ちます。ユーザーが、次の列にタブで移動するかEnterキーを押して文書処理の終了を示すと、再度スクリプトが実行されます。
VALIDATE_REQUESTケースは、列の編集ボックスに値が入力されていることを確認するだけです。値が入力されていない場合、ユーザーに値の入力を促すメッセージが表示されます。「Continue」は、イベントを停止して制御をユーザーに返すためにFalseに設定されています。
SAVE_REQUESTは、実際にはNEWENTRY_REQUESTのサブセットです。ただし、新規文書は作成しません。
フィールドの検証
ビュー上で編集時にフィールドを検証すると、コードはさらに複雑になります。ビュー上で編集された値は、常にテキスト値として返されます。たとえば編集可能列に日付フィールドがある場合、その列に何が入力されてもNotesはテキストとして扱います。しかし、後で文書を開いたときやバックグラウンド・エージェントを実行してフィールドを更新したときにエラーが発生しないように、入力した値が正しいことを確認するほうがよいでしょう。
無効なテキストを入力しようとした場合、Notesでは次のような検証エラーを示すメッセージ・ボックスが必ず表示されます。

InViewEdit/Edit View 4に格納されている以下のサンプル・コードでは、VALIDATE_REQUESTのSelect
Case文にSelectCase Colprogname(0) という別のSelect Case文が含まれています。Colprogname(0)
は、検証時にユーザーが編集している列に該当します。次のケースでは、ユーザーがNameという第1列にデータを入力した場合、スクリプトはCase
Nameに移動して空の列をチェックします。ユーザーがDateという第2列にデータを入力した場合、スクリプトはCase
Dateを使用して検証します。
検証では、Colprognameのインデックスはゼロです。ゼロはユーザーが現在編集中の列です。検証目的で1度に編集できる列は1列のみなので、現在編集されている列は常にゼロになります。したがって、select文はSelect
Case Colprogname(0) になります。
Select Case RequestType
Case VALIDATE_REQUEST
Select Case Colprogname(0)
Case "Name"
'Validate for empty column value
If Fulltrim(ColumnValue(0)) = "" Then
Messagebox "Field has no value",, "You must enter a value
in the column."
Continue = False
End If
Case "Date"
If Isdate(ColumnValue(0)) Then
Continue = True
Else
Messagebox "The value you entered is not a date",
,"Date format 'MM/DD/YY' required"
Continue = False
End If
End Select |
|
最初のNameケースは、次のコードで始まるif文の空の列をチェックします。
| If Fulltrim(ColumnValue(0)) = "" Then |
|
値が入力されていない場合、メッセージ・ボックスを表示してユーザーに制御を返します。ユーザーが値を入力してTabキーまたはEnterキーを押すと、スクリプトが再開します。
2番目のDateケースは、入力が受け入れ可能な日付フォーマットであるかどうかをチェックします。受け入れ不能な場合は、ユーザーに再度入力を促します。(サンプル・コードのメッセージ・ボックスにはMM/DD/YYフォーマットが指定されていますが、lsdate関数はMM/DD、M/D、およびM.Dも受け付けます。)
ここで忘れてはならない重要なことは、たとえ日付フォーマットで日付が入力された場合でも、データはテキスト列として保存されるということです。数字についても同様です。Domino
DesignerヘルプにはIsNumericを使って数字を調べるサンプル・コードが含まれていますが、ビューから入力された数字の場合は、同様にテキスト列として保存されます。ほとんどのアプリケーションはおそらくテキストで大丈夫ですので心配いりませんが、入力を他のデータ・タイプに変換しなければならない場合は、スクリプトがさらに複雑になります。
日付とケースの変換
一連の事前に選択された値からただ1つの値しかとらないlistフィールドまたはradioフィールドがある場合はどうなるでしょうか? 以下のサンプル・コードでは、Processedという名前のradioフィールドに対して、ユーザーに許容値の1つを入力するよう要求します。残念ながら、InViewEditにピック・リストは表示できませんが、値の検証は可能ですので、このサンプル・コードと同じように正しいケースに変換できます。
このサンプル・コードは、InViewEdit/Edit View 5ビューのInViewEditイベントで確認できます。このサンプル・コードでは、ユーザーが編集できるのは既存文書のみです。2番目と3番目の列は共に編集可能です。
InViewEdit/Edit View 4のサンプル・コードでは、日付が許可された日付フォーマットであるかどうかチェックされますが、文書にはテキスト値として記述されます。このサンプル・コードでは、スクリプトは2番目の列に入力された日付を正しい時間/日付フィールドに変換します。3番目の列には、ユーザーが5つの値から1つの値を入力します。誤った値を入力した場合、再度入力を促されます。また、値は正しいケースに変換されます。
ビューを準備するには、次の行をビューの「Global」オプションに追加します。
| %INCLUDE "c:\Lotus\Notes\lsconst.lss" |
|
LotusScriptの定数ファイルには、スクリプトが使用するPublic定数SC_ProperCaseが含まれています。
ビューの宣言では、Dim Pval As StringとDim Dval As Variantを追加します。PvalはProcessedフィールドのストリング値で、Dvalは時間/日付フィールドのバリアントです。
Date列の検証は、View 4のサンプル・コードで行った検証とほぼ同じです。主な違いは、Dval
= Cdat(columnvalue(0)) 行が追加されていることです。この行は、ユーザーが日付フィールドに入力した値を変換し、それをバリアント型のDval変数に代入します。
Case "Date"
If Isdate(ColumnValue(0)) Then
Dval = Cdat(columnvalue(0))
Continue = True
Else
Messagebox "The value you entered is not a date",,"Date
format 'MM/DD/YY' required"
Continue = False
End If |
|
Processフィールドの処理は異なります。まず、フィールドが保持可能な5つの値からなる(elementsという名前の)ストリング配列が作成されます。次にForallループで、スクリプトはユーザーの入力値をelements配列の値と照合します。elementsと列の値は、比較のために小文字に変換されます。列の値がelementsの値のいずれとも一致しない場合、ユーザーが入力可能な値リストのメッセージ・ボックスが表示され、ビューの編集ボックスに戻ります。
たとえ列の値が正しい場合でも、万一ユーザーが正しく入力しなかった場合に備えて、適切なケースに変換されなければなりません。最終行は、値をテキスト・ストリングに変換してからそのストリングを適切なケースに変換し、変数Pvalに代入します。
Case "Processed"
'list of values user can enter in Processed editable column
Dim elements(4) As String
elements(0) = "Completed"
elements(1) = "In Progress"
elements(2) = "On Hold"
elements(3) = "Not Started"
elements(4) = "Discarded"
'Check for a value not in "Processed" list
Dim flag As Boolean
flag = False
Forall element In elements
If Lcase(element) = Lcase(Columnvalue(0)) Then
flag = True
Exit Forall
End If
End Forall
If Not flag Then
'Create a list of values the user can enter in editable
column and display to user
Dim msg As String
Forall element In elements
msg = msg & element & Chr(10)
End Forall
Messagebox msg,, "Value must be one of the following"
continue = False
End If
'Get value user entered as a string
cval$ = ColumnValue(0)
'Convert the string to propercase
Pval = Strconv(cval$,SC_ProperCase) |
|
変数Pvalおよび変数Dvalが要求タイプ2の変換を行った場合、文書に保存されるまで値が存続する必要があるため、宣言内で作成されなければなりません。要求タイプ3または4中に変換された場合は、グローバルである必要はありません。文書の保存時には、列の現行値(i)は変数Pvalと比較されます。一致した場合、列の値はPval値に変更され、文書に追加されます。
日付列は、実際にマッチングする方法がないため、このような比較を行いません。なぜなら、Pvalはバリアントであり、ユーザーが入力した日付列の値はストリングだからです。ここでスクリプトは、Colprognameをチェックして、Dateであれば、Dval変数を取得して、列の値をDval変数の値と置き換えます。
Case SAVE_REQUEST
For i = 0 To Ubound(Colprogname)
'Add the value to document in the designated column
'If the column value matches value in Pval variable, it is used instead
of the actual column value
If Lcase(ColumnValue(i)) = Lcase(Pval) Then
ColumnValue(i) = Pval
Call doc.ReplaceItemValue(Colprogname(i),ColumnValue(i))
Else
If Colprogname(i) = "Date" Then
ColumnValue(i) = Dval
Call doc.ReplaceItemValue(Colprogname(i),ColumnValue(i))
Call doc.ReplaceItemValue(Colprogname(i),ColumnValue(i))
End If
End If
Next
Call doc.Save(True, False, True) |
|
これらのサンプル・コードでは、ビュー上で編集するための基本的な構成要素が示されています。さらに複雑なコードを開発する場合、スクリプトは、クリックされた列から行のすべての編集可能フィールドを1つずつ評価し始め、ユーザーがTabキーを押すと右に移動することに留意してください。ビューに12の列があり、すべての列が編集可能な場合、InViewEditイベントは12列すべてを処理します。ユーザーがビュー上で1つのフィールドのみを編集できるようにしたい場合、行内の他のフィールドを編集可能にしないでください。
いくつかのLotusScriptの新機能によって、アプリケーション設計時により効率的に作業できるようになります。ここでは、複数のユーザーが同時に設計要素を操作しないようにする設計要素のロックと、設計基準への準拠を自動化する手段としての列プロパティーへの新規アクセス、の2つの例を紹介します。
設計要素のロック
Notes/Domino 6では、設計者は3種類の設計要素(エージェント、フォーム、ビュー)をロックできます。ロックすると、ロックホルダーとしてリストアップされていないユーザーは設計要素が変更できなくなります。たとえば、唯一のロックホルダーであるPeter
Purpleがビューの設計をロックした場合、Peter Purpleの名前でロックが有効であるかぎり、設計を変更して保存できるのはPeter
Purpleのみです。ロックホルダーには、複数のユーザーまたはグループをリストアップできます。Peter
PurpleとBrian Blueの2人がロックホルダーとしてリストアップされている場合、2人のうちのどちらも設計をアンロックできます。他のユーザーが設計を編集し、保存できるようにするためには、ロックホルダーが設計をアンロックする必要があります。ロックすると、現在のロックホルダー名が設計要素の$Writersフィールドに、ロックした日付が$WritersDateフィールドに書き込まれます。
ロックを機能させるには、データベースをACLの管理サーバーに置く必要があります。この管理サーバーはMaster
Lock Serverとも呼ばれます。すべてのデータベース設計者がオフラインではなくネットワーク・サーバーから作業する場合に設計要素をロックすることができます。設計者がオフラインで作業する場合、設計要素に一時的なロックを行います。データベースの複製をサーバーに作成する際、他のユーザーが変更を加えようとしなかった場合は、暫定的なロックホルダーが行った変更が有効になります。
(Domino Designerのビュー、エージェント、またはフォームは、DesignメニューのLock
Design ElementまたはUnlock Design Elementを使用してロック/アンロックすることもできます。ロックされた設計要素の横には、パッドロック・アイコンが表示されます。Domino
Designerをすでに実行中の場合は、エージェントを実行するよりもDesignメニューを使用する方がおそらく簡単でしょう。しかし、データベースの管理者でないかぎり、Designメニューを使用してロック/アンロックできるのは、ロックホルダーとして自身の名前が保持されている要素のみです。スクリプトを実行しないかぎり、他のユーザー名、グループ名、またはネーム・リストが保持されている設計要素をロックすることはできません。)
Lock-Unlock Design Elementという次のエージェント・スクリプトは、ロック/アンロックを実行するエージェントの一例です。このエージェントは、設計要素がロック可能である(つまり、設計の更新または置換が禁止されていない)ことを確認します。次に、エージェントは設計要素がロックされているかどうかを判別します。ロックされている場合、ロックホルダーの名前を記述したメッセージ・ボックスが表示されます。ロックホルダーが現行ユーザーであり、設計要素がロックされていると、エージェントはユーザーに設計要素をアンロックするかどうか尋ねます。設計要素がロックされていない場合は、ユーザーにロックするかどうかを尋ねます。
以下の行では、Notes/Domino 6の新しいIsDesignLockingEnabledプロパティーが使用されています。
| db.IsDesignLockingEnabled = True |
|
このプロパティーは、ブール関数です。falseに設定すると、設計要素はロックできなくなります。NotesViewクラスには、設計要素のロック/アンロックの権限を有するグループ名またはユーザー名が含まれた配列であるLockHoldersという新規プロパティーがあります。
この行は、LockHoldersフィールドをチェックします。値が含まれていない場合は、設計要素はロックされていません。スクリプトは、少なくともACLの設計者であるユーザーに、設計要素の編集またはアンロックの権限を有するユーザー名を入力してデータベースをロックするように促します。ユーザーが、次のプロンプトにより1人以上の名前を入力すると、
qu2 = uiw.Prompt(PROMPT_OKCANCELEDIT, "Lock Holders?",
"Who should the lock holders be? If you leave the box
blank your name will be added as the lockholder.") |
|
Call view.Lock(qu2,True) 行は、設計要素をロックホルダー名でロックし、他のユーザーはその設計要素を編集できなくなります。
その設計要素が現行ユーザーによってロックされており、現行ユーザー自身がアンロックしたい場合、Call
view.UnLock行で設計要素をアンロックします。設計要素が現行ユーザー以外によってロックされている場合は、現在のロックホルダーを記述したメッセージ・ボックスのみが表示されます。
Sub Initialize
Dim session As New NotesSession
Dim uiw As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim db As NotesDatabase
Set db = session.CurrentDatabase
Dim view As NotesView
Dim cun as String
Dim qu as String
Dim qu2 as String
Dim LH as String
Dim ans as String
db.IsDesignLockingEnabled = True
cun = session.CommonUserName
On Error Goto errh
'Get view
Set uiview = uiw.CurrentView
Set view = uiview.View
'Check if view design is locked
Lholders = view.LockHolders
If Lholders(0) = "" Then
Messagebox "There are no locks on the design of
this view",,"Status of locking"
qu = uiw.Prompt(PROMPT_YESNO,"Change status?"
,"Do you want to lock this view design?")
If qu = 1 Then
qu2 = uiw.Prompt(PROMPT_OKCANCELEDIT, "Lock Holders?", _
"Who should the lock holders be?
If you leave the box blank your name will be added as the lockholder.")
Call view.Lock(qu2,True)
Messagebox "The view name " &view.Name &" is locked",,"Lock
status"
Else
Exit Sub
End If
End If
'Recheck view holders
Lholders = view.LockHolders
Forall L In Lholders
LH = LH & L & Chr(13)
End Forall
Messagebox "The lockholders on the design of this view are
" & Chr(13) & LH,,"Status of locking"
Forall L In Lholders
If Trim(L) = cun Then
ans = uiw.Prompt(PROMPT_YESNO,"Change status?",
"Do you want to unlock this view design?")
If ans = 1 Then
Call view.UnLock
Else
Exit Sub
End If
End If
End Forall
errh:
If Err() = lsERR_NOTES_LOCKED Then
Print "View NOT locked - " & view.Name
Else
Messagebox "Error " & Err() & ": " & Error(),,
"Error"
End If
Exit Sub
End Sub |
|
設計基準の徹底
他の設計者と一緒に作業している場合、または1人で作業している場合でも、ビューの外観をアプリケーション内で一定にするための作業や企業の基準に準拠するための作業は手がかかって大変だとお考えかもしれません。LotusScriptの新しいメソッドおよびプロパティーを使用すると、アプリケーションをテスト・リリースする前に、バックグラウンド・カラー、ヘッダーのフォント、サイズ、カラー、列のテキスト、および列幅の設定等、アプリケーションのビューすべてを標準化するエージェントを記述できます。これらの特性は読み取り専用であったため、Notes/Dominoの以前のリリースではこのようなビューの標準化は不可能でしたが、現在は、読み取り/書き込みに拡張されています。
どのように動作するのかを確認するために、2つのエージェント(4. Set View
Type 1と5. Set View Type 2)を実行してみてください。これらのエージェントは、現行ビューでのみ動作します。これらのコードは、ビューのバックグラウンド・カラーを設定する行と列ヘッダーのタイプフォントを変更する行が追加されている点を除いて、Large
DisplayエージェントおよびSmall Displayエージェントのスクリプトととてもよく似ています。(前述の章「例2:ビューのルック・アンド・フィールのプログラミング」を参照してください。)
不足しているのは、データベース内のすべてのビューでエージェントを実行する方法です。これは、下記に示す6.
Standardize All Viewsエージェントによって提供されています。このエージェントは、まず現行データベースのビュー数である変数Iを設定し、次にForループを実行して各ビューを順番に選択し、ビューのバックグラウンド・カラーおよび列の表示属性の値を再書き込みします。
Sub Initialize
'Loops through all views and sets column and header attributes to standards
Dim uiw As New NotesUIWorkspace
Dim view As NotesView
Dim vc As NotesViewColumn
Dim db As NotesUIDatabase
Set db = uiw.CurrentDatabase
'Get number of views in database
Dim J As Integer
Dim i As Integer
For J = 0 To Ubound(db.Database.Views)
'Begins changing each view
Set view = db.Database.Views(J)
'Set view background color
view.BackgroundColor = COLOR_WHITE
'Set first column to bold and 12 pt.
Set vc = view.Columns(0)
vc.FontFace = "Default Sans Serif"
vc.FontPointSize = 12
vc.FontStyle = VC_FONT_BOLD
vc.FontColor = COLOR_BLACK
'Set all other columns to plain and 10 pt.
For i = 1 To Ubound(view.Columns)
Set vc = view.Columns(i)
vc.FontFace = "Default Sans Serif"
vc.FontPointSize = 10
vc.FontStyle = VC_FONT_PLAIN
vc.FontColor = COLOR_BLACK
Next
'Set all headers to same font color, face, and point size.
For i = 0 To Ubound(view.Columns)
Set vc = view.Columns(i)
vc.HeaderFontFace = "Default Sans Serif"
vc.HeaderFontPointSize = 10
vc.HeaderFontStyle = VC_FONT_BOLD
vc.HeaderFontColor = COLOR_DARK_BLUE
Next
Next
Call uiw.ViewRebuild
End Sub |
|
ここでも、予想外のことが起きないように、4つのフォント属性すべてを列のテキストおよびヘッダー・テキストの両方に設定していることに注目してください。すべてのビューが処理されると、現行ビューは再構築され、変更点が表示されます。データベースに標準化したくないビューが含まれている場合、それらのビューにProhibit
design refreshオプションを設定するか、ビューの属性をリセットする前に許可を求めるエージェントを記述することができます。
この記事で紹介した例は、Notes/Domino 6におけるLotusScriptの変更点のほんの一部に過ぎません。NotesViewクラスおよびNotesViewColumnクラスのプロパティーが読み取り専用から読み取り/書き込みに変更されたため、さらに多くのビューおよび列の属性をプログラムすることが可能になりました。また、NotesUIViewクラスのInViewEditイベントによって、新しく高速編集機能が追加されました。これらの変更点は、Notes/Domino
6を使用すると、ビュー上のデータだけでなく、ビューのUIも操作できることを意味しています。また、今回初めて、設計者以外のユーザーもビューを変更できるようになりました。これは、アプリケーション保守の骨折り作業を大幅に軽減する可能性を秘めているため、Domino開発者にとって望ましいことです。

著者について
Sally Blanning DeJeanとDavid DeJeanは、Lotus NotesとDomino製品の誕生以来それを仕事の対象としており、それら製品についての執筆活動を行ってきました。彼らはまた、Notesに関する正に最初の本『Lotus
Notes at Work』の共著者でもあります。CLPプリンシパルであるSallyは、この他にもNotesに関する本を執筆しており、Notes/Domino専任の開発者です。CLPであるDavidは、いくつものコンピューター関連の出版物の編集者兼ライターであり、Notes、インターネット・アプリケーション、テクニカル/マーケティング通信技術の開発会社DeJean
& Clemensの共同経営者でもあります。
|
 |
|
|
|