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

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

2012年5月25日金曜日

LotusScriptソースの整形

こんばんは。すでに0:00を回っています。夜更かしは嫌いなのに・・・
ということで、検証を行う時間がありませんでした。

なので、検証の結果は後日(何の検証かは記事になってのお楽しみということで・・・)

気になるなぁ。と言う方は、こちらのボタンをクリックして、待っていてください。
にほんブログ村 IT技術ブログへ


今日はホントに小ネタです。
筆者も、以前から「どうにかなんないかなぁ・・・」と思っていたのですが、「まぁ、無理だろうなぁ。UIにそんなに力入れてないし」とあきらめていました。

という、とある疑問を職場の人にされましたので、 本当にできないのかどうか調べてみようと調べてみました。

え?何の話かって?
LotusScriptのソースの整形の話です。
エージェントやスクリプトライブラリでLotusScriptを記述する際、8.5になってからはインデントが自動的に修正されなくなりました。

自分でTabを書いたとおりにインデントされてしまいます。

でも、8.0以前の従来のDomino Designerではそんな事はありませんでした。

関数も大文字小文字を適当にばらつかせて書いても、保存するときには綺麗に書き換えてくれました。

そんな優しいLotus Domino Designerはどこに行ったんでしょうね。

で、まとめると、質問は「LotusScriptを書いたけど、インデントがばらばらでとても見づらい。以前のバージョンは自動的に整形してくれたよね。今のバージョン(8.5.x)ではそうならないの?」
というものでした。

筆者も、ソースは後で見返したときに少しでも分かりやすいようにインデントには気をつけています。
それでも、ずれたままになってしまう事がありました。そのたびに手動で修正しており、「面倒だなぁ」と思っていたのです。

それで、もう一度、本当にできないのかどうかを検証してみました。

すると、LotusScriptを記述しているときにだけ、「ソース」というメニューがある事に気がつきました。
そのメニューを開いてみると、「インデントの修正」という項目がありました。
実行してみると、インデントを修正してくれるではないですか!

ということで、ずらずら書いてしまったソースのインデントを修正するには、LotusScriptのコードの全行を選択します(Ctrl + Aで出来ますね)。
次に、「ソース」「インデントの修正」メニューを実行します。
 これだけです。
インデントの修正

ということでした。
ちなみに、関数の大文字小文字を整形したい場合には、関数の後ろにワンスペース入れてみてください。その瞬間に変わってくれますよ。


以上、小ネタでした。
疲れてるんで許してください・・・










【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2012年5月24日木曜日

!@IsMemberと@IsNotMemberの違い

今日(もう昨日か・・・)は、自宅でレンタルDVDを観ていたのでお休みしようかと思いましたが、ちょっと気になった事があったので、調べた結果を書きます。

ということで、XPagesネタではなく、@関数ネタです。
でも、XPagesでも@関数はあるので、きっとお役に立つ・・・はず?


では、本題に入る前に、ボタンをクリックしましょう。おかげさまで順調に順位が上がっています。世の中にLotus Notes/Dominoがどんどん広まっていきますよ(え?もう、十分に広まってる?まぁまぁまぁ)
にほんブログ村 IT技術ブログへ



さて、本題。
非表示式によく使う?のが、@IsMember関数ですね。ロールを持っているかどうか判断するのに使います。
このとき、@IsNotMemberではなく、!@IsMember関数を使う事があります。
ん?これって同じ事なのかな?違う事なのかな?
と悩んだ事はないですか。

筆者は、今日に限ってなぜか、「ん?どっちだっけ?」と悩んでしまったのです。
ということで、調べてみました。

どちらの関数も引数は同じ。
@IsMember("検索文字列";"検索文字列リスト")/@IsNotMember("検索文字列";"検索文字列リスト")
もしくは、
@IsMember ("検索文字列リスト1";"検索文字列リスト2")/@IsNotMember ("検索文字列リスト1";"検索文字列リスト2")
です。

前者の場合は、!@IsMemberも@IsNotMemberも結果は変わりませんでした。
しかし、後者のような、文字列リスト同士の比較検索では、結果が異なりました。

フィールド名(textList1)検索文字列リスト1a;b;c
フィールド名(textList2)検索文字列リスト2a;e;f

上表のような場合、
tmp := !@IsMember(textList1;textList2);
ret := @If(tmp=@True;"含まれません。";"含まれます。");

@Prompt([OK];"!@IsMemberの結果";ret)
としたら、
!@IsMemberの結果
と表示されました。

"a"は含まれているにもかかわらず、全部が含まれていないので、"含まれません。"となりました。


同様に、
tmp := @IsNotMember(textList1;textList2);
ret := @If(tmp=@True;"含まれません。";"含まれます。");
@Prompt([Ok];"@IsNotMemberの結果";ret)
としたら、
@IsNotMemberの結果
と表示されました。
"a"が含まれている事が評価されたのでしょう。


ということで、!@IsMemberと@IsNotMember関数、
同じように見えて違う結果を返すという事が分かってもらえたでしょうか。

検索する文字列がリストではなく、単なる文字列であればどちらでも良いですが、リスト同士の比較検索となった場合は、どのように動いてほしいのかをあらかじめ決めておき、その上でどちらの関数を使うのかを決める必要があります。

これらは、XPagesでも使えますので、きっとどこかでお役に立つと思います。


ということで、今日はこの辺で。




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2012年5月23日水曜日

セッションスコープ変数はどこで使われているのか?

こんばんは。寒いです。5月も後半だってのに。筆者は寒暖の差にとても弱いので、こういう気候は勘弁してほしいです。

今日(2012年5月22日)のアクセス数は約450!びっくりです。ランキングも着々と上がってきています。ということで、この記事を読んだら、ボタンをクリックしてくださいね!
にほんブログ村 IT技術ブログへ

さて、今日もXPagesDayの復習です。どんだけやるんだ?そんなにきちんと話していなかったのか?と疑われそうですが、もう気にしないで、続けます。

ということで、今日はセッションスコープ変数にフォーカスを当ててみます。

と言っても、使い方はXPagesDayのセッションで説明したので、ここでは省略します(知りたい方は、セッション資料をダウンロードしてやってください)。


「用語集 for XPages」では、色々なところでセッションスコープ変数を使っています。

第一弾の自動リンクを作ってみようでは、linkDocIdというセッションスコープ変数の中に、文書UNIDを設定しました。
第二弾のカテゴリ名によるフィルタリングを設定するには? では、viewCategoriesというセッションスコープ変数の中に五十音順ビューの第一列の値を設定していました(カテゴリ名によるフィルタリングで利用するため)。


実はこのアプリケーションでは、11個のセッションスコープ変数を利用しています。
ここまで来ると、どんな名前の変数をどのように使っているのか分からなくなってしまいます(まぁ、そんな事はないんですが・・・)。
そこで、ちょっと趣向を凝らして?、セッションスコープ変数を管理するようにしました。
「ccSessionScope」というカスタムコントロールを作成して、その中にアプリケーションで利用しているセッションスコープ変数の値を常に表示させているのです。
ccSessionScopeカスタムコントロール

上図はccSessionScopeカスタムコントロールの設計画面です。
計算結果フィールドがずらりと並んでいます。
それぞれの値は、
"セッションスコープ変数名: " + sessionScope.hogehoge
としてあります。
例えば、 viewCategoriesというセッションスコープ変数名の場合、
"viewCategories: " + sessionScope.viewCategories
という感じです。

後は、このカスタムコントロールをXPageの中に埋め込んでしまえばよいのです。
ただ、常に表示されていると、見苦しくなってしまうので、特定のユーザーにのみ表示するように制御していあります。
ACLで[Debug] ロールを付与されているユーザーにのみ表示するようにしてあるのです。
こうすれば、一般ユーザには表示させることなく、アプリケーションを利用してもらえます。

ちなみに、表示制御は以下のように行います。
1.XPageにccSessionScopeカスタムコントロールをドラッグ&ドロップします。
2.ccSessionScopeカスタムコントロールの可視式に[Debug]ロールを持つユーザーだけ表示できるように式を設定します(下図)。
ccSessionScopeカスタムコントロールの可視式

2行目のcontext.getUser().getRoles()というのが、現在のユーザが付与されているロールを取得するものです。
7行目の@Contains(r1, r2) == @True()で、[Debug]ロールがユーザに付与されているロールに含まれるかどうかを検索しています。
この関数の結果が@True であれば含まれているという事でtrueを返しています。

うん。これで、XPagesにおけるロールの使い方も覚えましたね。



さて、実際の表示例を見てみましょう。
セッションスコープ変数の表示例

このアプリケーションは画面遷移がないのと画面に表示する内容が少ないので、堂々と表示していますが、セクションコントロールの中に収めると、もっとひっそりと表示させる事も出来ます。


最後に、セッションスコープ変数の使われ方について見てみましょう。
viewTypeは、ビュー名(省略したもの)を格納しています。viewCategoriesと併せて使用する事で、どのビューのどのカテゴリを開いているのかを制御しています。
rowsはビューの1ページあたりの文書数を制御するのに利用しています。
ecとsaveEcは、カテゴリ列があるビューのカテゴリの展開/省略を制御するのに利用しています。
visibleFlagは、用語情報(フォーム)の表示非表示の制御に利用しています。
errorVisibleとerrMsgは、用語情報の登録時に発生したエラーメッセージの表示非表示の制御に利用、及び、表示するエラーメッセージを格納しています。

infoVisible、helpVisibleは、ヘルプとバージョン情報の表示非表示の制御に利用しています。

ほとんどが表示非表示の制御に利用していますが、コントロールのプロパティの値を動的に変更したい!という時に使うのがセオリーではないでしょうか。


是非、セッションスコープ変数の使い方を覚えて、どんどん使ってください。



・・・なんか、思っていたのと違う内容になってしまった気がしないでもないが。気のせいにしましょう(え?ダメ?)




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】

単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2012年5月21日月曜日

カテゴリ名によるフィルタリングを設定するには?

こんばんは。XPagesDay復習の第2弾です。復習は、お勉強した後、一週間以内にやらないとほとんど効果がないらしいです。
ということで、週末まで持ち越すわけにはいきませんから、とっととやってしまいましょう。

昨日の記事では、多くの方がこのボタンをクリックしてくださいました。ありがとうございます。
でも!まだ、まだ少ないんです!もっと筆者に愛の手を!いや!愛のクリックを!
にほんブログ村 IT技術ブログへ



さて、今日はビューコントロールの「カテゴリ名によるフィルタリング」です。
セッションの中では、「従来のノーツアプリケーションで言えば、埋め込みビューの単一カテゴリのようなものですよ」と言ったら、皆さん、「あぁ、なるほどね」と頷いていらっしゃいましたので、説明するほどのものではないかもしれませんが、これから始める方もいるかもしれないので、記録として残しておきます。

まず、「用語集 for XPages」のどこでカテゴリ名によるフィルタリングが利用されているのかを確認しましょう。
用語集 for XPagesの画面

図の中で、赤く囲んだ部分が、この機能を利用しているところです。
「ア行」と書かれているところをクリックすると、ア~オで始まる用語だけを表示します。
同様に「カ行」なら、カ~コで始まる用語を表示します。

では、このビューはどんな設計になっているのかを確認しましょう。
「五十音順」というビューが対応しています。
ビューの選択式

ビューの選択式です。Formが"GlossaryF"という文書だけを表示するようになっています。
このアプリケーションのフォームは"GlossaryF"だけなので、実質、全文書を表示するような形です。

次は、1列目の式です。
画面では表示していませんが、ここは「カテゴリ別」の列として設定しています。
そして、式の値ですが、「ア」~「ワ」で表示されるように集約する式を書いています。
"Capital"というフィールドの1文字目を取得して、ア~オなら"ア"、カ~コなら"カ"という用にしているのです。
1列目の式

これで、1列目は、A、1、ア、カ・・・ワのいずれかが表示されるようになりました。


今度は、ビューコントロールの設定を確認します。「ccbyAlphabeticView」というカスタムコントロールが「五十音順」ビューの内容を表示するコントロールです。
ccbyAlphabeticViewカスタムコントロール

ここで、「カテゴリ名によるフィルタリング」が"計算済み"になっているのが分かるでしょうか?
さて、どんな計算式が設定されているのかを確認しましょう。右側の◇をクリックして、「値の計算...」を選択します。
カテゴリ名によるフィルタリング

出ましたね。セッションスコープ変数。

ということで、セッションスコープ変数の内容に基づき、ビューをフィルタリングするという事が分かりました。



後は、ビューへのリンクをクリックしたときに、このセッションスコープ変数に適切な値を設定してあげればよいという事になります。

では、実際に、どのように設定しているのかを確認します。
「ccOutline」というカスタムコントロールがビューリンクを設定してあるカスタムコントロールです。
ccOutlineカスタムコントロール

リンクを選択したら、イベントビューを開きます。
onClickイベントにイベントが設定してあるので、イベントの内容を確認します。
イベントの式

確かに、セッションスコープ変数の内容が変更されています。

また、このリンクをクリックしたときの、更新対象はビューコントロールの部分としておきます。
これで、このリンクをクリックしたときに、ビューのカテゴリが変更されて、該当するカテゴリの文書だけが表示されるようになります。


どうでしょうか?「カテゴリ名によるフィルタリング」の実装の仕方が分かっていただけたでしょうか?



・・・って、ここまで書いておいて、前回のブログでは「セッションスコープ変数」をどう使っているか書きますってなってますね。
んー・・・、一応、セッションスコープ変数を使っているので、許してください(汗。


このXPagesアプリケーションは、セッションスコープ変数の説明をしたかったので、色々な箇所で使っているのですよ。なので1回では説明しきれないんです。
・・・言い訳になってないな。ごめんなさい。


では、次回!(あ、逃げた!)




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2012年5月20日日曜日

自動リンクを作ってみよう

昨日、今日と、晴れて良い天気ですね。久しぶりに穏やかな週末を過ごしています。

5月18日に行われたXPagesDay&テクてくロータス技術者夜会。
XPages漬けな1日!いかがでしたでしょうか?筆者は、セッションを担当していたため、他の方のセッションを聞く事が出来ませんでした。楽しみにしてたのにぃ~。ちなみに、筆者はあのような場で話をするのは、初めての経験でしたので、かなり緊張しました。
せっかく資料も作ったのに、なんか全部無視していたような・・・
資料は、まだダウンロードできるようですので(5/20 11:00現在)、ご来場できなかった方で興味のある方はダウンロードしてみてください。
URLは、こちら(ダウンロード


本当は、実際のコード部分を見せて、「こうやって組むんですよ」という実例を見せたかったのですが、プレゼン力が低かったので、そこまで出来ませんでした。

ということで、しばらくは、XPagesDayの復習ということで、ブログの記事を構成していきます。


本題に入る前に、恒例のボタンクリックをお願いします。いや、ホント押してください。それだけで筆者のテンションあがって、色んな事書いちゃいますよ。だから、ねっ!
にほんブログ村 IT技術ブログへ



ここまで念押しすればクリックしてくれた事でしょう・・・

では、本題です。
まずは、「用語集 for XPages」の設計要素の構成についてです。
設計要素の一覧


カスタムコントロールはたくさんありますが、XPageは"home"の1つだけです。
ですので、画面遷移は発生しないのです。

カスタムコントロールの中に「ccContents」という設計要素があります。
これはFormの内容をXPagesの画面に表示するための設計要素です。
設計の中身はこんな感じです。
ccContentsの中身

さらに、この中に「関連用語2」「関連用語3」と書かれたセルがあります。
※「関連用語2」の上の行も関連用語の行です。1つしかなかった場合と複数あった場合で ラベルの内容を変更しているので、ラベルの値は式で記述してあります。

これらの右隣のセルに「RelatedTerm1」「RelatedTerm2」「RelatedTerm3」という編集ボックスと「linkRelatedTerm1」「linkRelatedTerm2」「linkRelatedTerm3」というリンクがあります。
これらのコントロールを使って、自動リンクを実現しています。

実際にコードを見てみましょう。
RelatedTerm1、2、3はフォーム上のフィールドにバインド(関連づけ)してあります。
ですので、XPages アプリケーション上で入力した値は、そのまま文書として登録されます。
これらの編集ボックスは「可視」で編集時のみ表示するようにしてあります。

一方、linkRelatedTerm1、2、3は、プロパティの「ラベル」の式に
glossaryDocument.getItemValueString( "RelatedTerm1" )
と記述しています。
linkRelatedTerm1のラベル式

これで表示している文書の関連用語フィールドの内容が表示されるようになります。
こちらは「可視」で読込時のみ表示するようにしてあります。
(※セッション中にも話しましたが、なんで「可視」なんでしょうね?ノーツアプリケーションの場合は「非表示式」なのに・・・とっても分かりにくいんですよね)。

次に、この読込時のみ表示するリンクにイベントを設定して、関連用語が自動的に表示されるようにします。
編集ボックスでもなく、ラベルでもなく、計算結果フィールドでもなく、リンクにしたのは、イベントを設定する事で、ブラウザ上でリンクのように動作してくれるからです。(具体的には、文字に下線が付いたり、青文字になったり、マウスカーソルを合わせると、指の形になったりなどですね)

では、イベントを設定しましょう。
リンクを選択して、イベントビューを開きます。
次に、onClickイベントを選択した状態で、「アクションの追加」をクリックします。
アクションは、「スクリプトの実行」、言語は「JavaScript(サーバーサイド)」を選択します。
関連用語1のonClickイベントのプログラムコード

// 検索用ビューで、関連用語をキーとして検索
var searchView = database.getView( "bySubject" );
var linkKey = glossaryDocument.getItemValueString( "RelatedTerm1" );
var linkDoc:NotesDocument = searchView.getDocumentByKey( linkKey );
if ( linkDoc != null ) {
 sessionScope.linkDocId = linkDoc.getUniversalID();
} else {
 // 存在していない場合は、エラーメッセージを設定してエラーページへと誘導する
 var varSubject = glossaryDocument.getItemValueString( "Subject" );
 sessionScope.errMsg = "見出し語【" + varSubject + "】に、関連用語1【" + linkKey + "】は登録されていません。";
 //context.redirectToPage( "errorPage" );
 sessionScope.errorVisible = 1;
 return ( false );
}
このイベントは、表示されている関連用語をビューで検索して、その文書の文書UNIDを取得して、linkDocIdというセッションスコープ変数に格納するというものです。
なお、8~13行目はエラー処理なので、今回は説明は割愛します。

2行目は、"bySubject"というビューを取得しています。
databaseというのは自DBのことですが、グローバルオブジェクトとして定義されているので、こちらで定義することなく利用できます。

3行目はglossaryDocumentの"RelatedTerm1"アイテムの値を文字列として取得して、linkKeyという変数に代入しています。
glossaryDocumentは、このカスタムコントロール内で、データソースとして定義しているもので、フォームをバインドしてあります。

4行目は、3行目で取得したlinkKeyをキーとして、ビューを検索しています。
getDocumentByKeyはLotusScriptのGetDocumentByKeyメソッドと同じ動作をします。
"bySubject"ビューについては説明していませんが、このメソッドを使用しているという事でご想像いただけたのではないでしょうか。はい。そうですね。Subjectフィールドを昇順で並べてあるビューになっています。

5、6行目で文書が見つかれば、その文書の文書UNIDをlinkDocIdというセッションスコープ変数に格納しています。

これだけで、なぜ選択した文書の内容が表示されるの?ということになりますが、
その秘密は2つあります。
1つ目は、同イベントの中にある「サーバーオプション」の「部分更新」にあります。
ここに更新したいコントロール名を設定するとイベントが実行されたときに、そのコントロールの内容が更新されます。
関連用語クリックイベントのオプション

 2つ目は、 glossaryDocumentデータソースです。
データソースを定義するときに、デフォルトアクションを「文書を開く」に設定すると、開く文書の文書UNIDを設定できるようになります。
ここに式を記述する事によって、開く文書の文書UNIDを動的に変更する事が出来るようになります。
ということで、イベントで取得したsessionScope.linkDocIdを文書UNIDとして設定します。
glossaryDocumentの文書ID

これで文書を開くときは、sessionScope.linkDocIdに格納された文書UNIDの文書ということになります。
この値を変えたら、glossaryDocumentが配置されているコントロールを部分更新で更新すればよいという事です。
部分更新の対象になっている"contentBody"というのは、glossaryDocument全体を覆っているパネルコントロールの名称になります。
(ここでやっと出ましたね、パネル。出てこなかったらどうしようかと思いますね^^;)


断片的ではありますが、これで関連用語を登録する際、何もしなくても自動リンクになる秘密が分かっていただけたのではないでしょうか。
従来のノーツアプリケーションでも、同様の事は出来るのですが、普通に文書リンクを使った方が簡単ですし、その方がノーツっぽいです。

でも、XPagesはWebアプリケーションとしての顔も持ちますので、こちらの方が自然な動きではないかと思います。


次回は、セッションスコープ変数をどう使っていたのかについて解説します。






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