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

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

2014年3月25日火曜日

XPagesの@Adjust関数で誤った結果が出力される

おはようございます。
今日(執筆時点)は2014年3月25日です。6年前の今日、ブログを始めました。

初の記事は、上級だぁですね。まだNotes 8.0が発売開始されたばかりの頃でNotes 7.0の資格試験を受験したという話ですね。
私はこの後、紆余曲折を経てIBM Certified Advanced Application Developer - Lotus Notes and Domino 8.5の資格をなんとか取得することができましたが、すでにNotes 9.0の資格試験が始まっているのですね。
どうしよう、受験しなくちゃ・・・

さて、ということで本日が本当の丸六年の日となります。
そんな日なので記事を更新しないわけにはいかないでしょう。

では、本題に入る前に6年目最後のボタンをクリックしましょう(でも、明日以降にこの記事を見ることもあるんだよね・・・ま、いっか)
にほんブログ村 IT技術ブログへ



今日はXPagesで利用できる@関数についてです。
@Adjust()関数という関数があります。指定した日付のy年m月z日h時間m分s秒前/後を算出するというものですね。
例えば、2014年4月1日の1か月後の日付は@Adjust( @TextToTime("2014/04/01"), 0, 1, 0, 0, 0, 0 )で算出できます。
結果は、2014/05/01が返ってきます。

実はこの関数、不具合があるようなのです。
指定した日付の前月が30日以下の場合(つまり、3月、5月、7月、10月、12月)、1か月後の値が正しく計算されないのです。

以下のような簡単なコードを作成して実行してみました。
var tmpDate;
var dspDate;
for ( var i=1;i<=12;i++ ) {
    dspDate = "2014/" + i + "/01";
    tmpDate = @TextToTime( dspDate );
    print( dspDate + "の翌月は" + @Adjust( tmpDate, 0, 1, 0, 0, 0, 0 ).toLocaleString() + "です。" );
}
実行結果は次の通り。
1~12月の翌月1日を出力した結果

赤文字になっているところを見てください。なぜか、31日になっていたり、29日になっていたりします。
確かに、前月が30日以下の月だけが誤った結果になっていることがわかります。


別の方法はいくつかありますが、例えばこんな方法があります。
var tmpDate;
var dspDate;
for ( i=1;i<=12;i++ ) {
    dspDate = "2014/" + i + "/01";
    tmpDate = session.createDateTime( dspDate );
    tmpDate.adjustMonth(1);
    print( dspDate + "の翌月は" + tmpDate.getLocalTime() + "です。" );
}
こちらの実行結果は次の通り。
1~12月の翌月1日を出力した結果(2)
今度はすべて正しい結果になっていますね。

今のところ、Domino 8.5.2、9.0.1で確認していますが、他のバージョンでも発生する可能性がありますので、XPagesで@Adjust()関数を使う場合は気を付けましょう。
きっとそのうち修正されると思います・・・


2014/03/25 17:05追記-----
@Adjust( tmpDate, 0, 1, 0, 0, 0, 0 )

@Adjust( tmpDate, 0, 1, 0, 0, 0, 0, "[InLocalTime]" )
と"[InLocalTime]"キーワードを追加することによっても、正しい結果を得ることができました。
2014/03/25 17:05追記-----

では、今日はこの辺で。





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

2014年3月17日月曜日

Ctrlキーを使ってソース検索を便利に行おう!

皆さん、こんにちは。

3月も半ばになり、ようやく暖かくなってきました。と思っていたのですが、今週末は寒の戻りにより寒くなるとのこと。
季節の変わり目は体調を崩しがちなので気を付けましょう。

また、早いところでは、桜が咲き始めているようで、そろそろお花見を・・・という方もいらっしゃるのでしょうね。
ちなみに葛飾区の水元公園の桜はまだまだでした(場所や桜の種類によっては咲いてるところもあるようです)。


ではこのボタンをクリックしたら、本題に入りましょう。
にほんブログ村 IT技術ブログへ


今日はDomino Designerの話です。
LotusScript を記述中に自作関数の仕様を確認したい、修正したいということがあるかと思います。
その関数が別のスクリプトライブラリになっている場合、いちいちそのライブラリを開いて、目的の関数を探す・・・ということをしていないでしょうか。

でも、ライブラリや関数の数が多くなってくると面倒ですよね。
そんな時はハイパーリンクの機能を使用します。

Domino Designerではデフォルトでこの機能がONになっているのですが、どこで設定されているかを確認しておきましょう。
Domino Designerを起動したら、[ファイル][プリファレンス]メニューを実行します。

プリファレンス画面が開くので、[一般][エディター][テキスト・エディター][ハイパーリンク]を選択します。
下図の画面になるので[オンデマンド・ハイパーリンク・スタイル・ナビゲーションを使用可能にする] のチェックを入れて[OK]をクリックします。
ハイパーリンクを使えるようにする

これで、Domino Designer上でハイパーリンクが使えるようになりました。
この機能のON/OFFは即時反映されるので、Domino Designerの再起動の必要はありません。


次にリンクの対象となるものを見ていきましょう。
まずは、スクリプトライブラリ。
下図はエージェントのコード画面です。 Use "LIBSample"としてLIBSampleのスクリプトライブラリを利用できるようにしています。
ここでCtrlキーを押して、マウスカーソルをあてると、下図のように青文字になり、下線が追加されます。
リンクの対象1 スクリプトライブラリ

ここでマウスをクリックすると、下図のようにLIBSampleが開きます。
LIBSampleスクリプトライブラリが開いた

エージェントに戻って、今度はLIBSampleにある自作関数の名前に、Ctrlキーを押しながら、カーソルをあてます。
先ほどと同様に青文字になり、下線がついていますね。
リンクの対象2 スクリプトライブラリの関数

そこで、マウスをクリックすると、LIBSampleが開きます。さらに関数名をクリックしたので、その関数がフォーカスされた形になっています。
LIBSampleスクリプトライブラリが開いて関数がフォーカスされている

今度は、このLIBSampleスクリプトライブラリ上で見ていきましょう。
この関数はLIBClassという別のスクリプトライブラリを使用可能にしています。
そして、このLIBClassにはClassSampleというクラスが記述してあります。
このクラス内の関数(及びプロパティ等)もリンクの対象になるのです。
リンクの対象3 クラスの自作関数

上図のリンクをクリックしてみると、LIBClassというスクリプトライブラリが開いて、さらにクリックした関数にフォーカスが当たっていることが確認できます。
クラスごとにスクリプトライブラリを作るということをしている場合、どこのライブラリだっけな?という検索の煩わしさを解消してくれますね。
自作クラスの関数がフォーカスされている

さらに、このハイパーリンク機能はlssファイルも検索の対象にしてくれるのです。
MessageBox関数の引数としてよく使う(であろう)MB_OKやMB_ICONSTOP等の定数ですが、これらの値がいくつなのかプログラムを書いているときはわかっても、後で調べるときに
「あれ?いくつだっけな?」という事もあるでしょう。

そんな時は、下図のように定数名をCtrlキーを押しながらマウスカーソルをあてます。
すると今までと同じように下線付きの青文字になるのでクリックします。
リンクの対象4 lssファイルの内容

すると、lsconst.lss(クリックしたMB_ICONINFORMATIONはこのファイル内に定義されている)が開きます。
なお、lsconst.lssはLIBClassで利用可能にしている(Use "lsconst.lss")しているので、LIBClassも自動で開きます。
lsconst.lssがDomino Designerで開いている

さぁ、いかがでしたか?
私が確認したのはLotusScriptのみでしたが、プリファレンスの内容を確認する限りでは他の言語(JavaScript等)でもできそうですね。
ということはXPagesのソース(関数限定だけど・・・)もこのように検索できることができるかも?

かなりの効率アップが見込めますので、是非、試してください。


では、今日はこの辺で。





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

2014年3月11日火曜日

累計アクセス40万超えました!そして・・・

皆さん、こんばんは。

当ブログを開始したのが、2008年3月25日。
もうすぐ丸6年が経過します。

そして、ついに累計アクセスが40万を突破いたしました!
最初の1~2年は1万アクセスを超えた!とかで喜んでいたというのに・・・

今や、それどころではなくなっています。

Notesが生まれて25年!そのうち、私が携わってなんとまぁ、20年が経過します(今度の4月で21年目です)。
そのうち、たった6年しかブログを書いていないと言ったらそれまでなんですが、
それでもこれだけ書くことがあるというのはなかなかのものではないでしょうか。

ホントに使い勝手のある素晴らしい製品ですね。
まだまだ書きたいこと(皆さんに伝えたいこと)がたくさんあります。


今後もNotes/Dominoの話題を提供できるように頑張っていきますので、応援をよろしくお願いします。


では、今日はこの辺で。

2014年3月4日火曜日

文字列の検索(StrRightBack)

皆さん、こんにちは。
3月になりました。ということは、今年はすでに6分の1を消化してしまったという事です。早いですね(笑)。
時間は万人平等に過ぎていくものなので、大切に過ごしましょう。


ということで?、本日の話題に入りますが・・・その前に
にほんブログ村 IT技術ブログへ
をクリックしてください。



さて、今日は久しぶりの文字列操作です。しかもLotusScriptです。XPagesを推進しなければいけないのに・・・

と言いつつ、先に進みます。
文字列操作の関数のうち、StrRightBackやStrLeftBack関数があります。
これらは、文字列を右側から検査していき、検査対象の文字(列)を発見したら、その文字の右側もしくは左側を取得するものです。

例えば、
c:\tmp\TestFolder\testdata.txt
という文字列があった場合、
StrRightBack( "c:\tmp\TestFolder\testdata.txt", "\" )
という関数を実行すると、その戻り値は
"testdata.txt"
 となります。

これは、フルパスを元にして、ファイル名だけを取得したい場合に利用できます。

ここで、ファイル名とそのファイルが格納されている直接のフォルダ名の両方を同時に取得したい!となった場合はどうすれば良いのでしょうか?

考えてみましょう・・・
左側から取得するのであれば、Instr関数で検査対象の文字を何回か調べていけば、x文字目からy文字目までを取得して、その後Mid関数で・・・という方法もあるのですが、
右側から取得するとなると、そうはいきません。

難しそうですね・・・
とここであきらめてはいけません。
実はStrRightBackやStrLeftBack関数等には、検査対象の文字が何回出てきたら、そこを基準とするというオプションがあるのです。

関数のヘルプをよく読むと、
occurrences 
Long。部分文字列を返す前に検索パターンが一致する数です。既定は 1 で、検索パターンが最初に一致した時点で部分文字列を返します。

という記述があります。

つまり、ここの数値を2や3にすれば、検査をその回数分、行ってくれるのです。
では、サンプルです。
Sub Click(Source As Button)
 Dim sData As String
 Dim ret   As String
 
 sData = "c:\tmp\TestFolder\testdata.txt"
 ret   = Strrightback( sData, "\",, 2 )
 
 Msgbox _
 "変換前:" & sData & Chr$(10) & _
 "変換後:" & ret, _
 0 + 64, "検索一致数の数を増やしてみる"
End Sub
StrRightBack関数の引数の4つ目が「occurrences」になります。
3つ目は検査対象の文字(列)の大文字小文字全角半角を区別する/しないの引数で、今回は
関係ないので、省略しています。


このサンプルの実行結果はこちら。

これなら簡単ですね。
文字列の検索を行うときはぜひ試してみてください。

応用とかもチャレンジしてみてください。


では、今日はこの辺で。






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