ページビューの合計

ラベル @Eval の投稿を表示しています。 すべての投稿を表示
ラベル @Eval の投稿を表示しています。 すべての投稿を表示

2018年4月16日月曜日

#@Eval 関数を試してみた。

This time, I am going to describe what I tested the @Eval function in doing the renovation of Notes application inside of us.

みなさま、こんにちは!

まずはご案内です。
いよいよ今年も始まります! ノーツコンソーシアム 大阪研究会!!
もちろん会員外の方の見学も大歓迎ですので、遠慮なくお申し込みください。
さらに!!
今回はそのまま休憩を挟み、テクてくLotus技術者夜会 大阪PVに突入します!

ぜひ真新しい IBM様 大阪事業所で皆様とお会いできることを楽しみにしております。

なお入館に際して、予め登録が必要となります。
まだ参加が確定していない方も、まずは登録だけでも先に行っておいてください。


さて今回は弊社内でとあるアプリケーションの改築を行うのに際し、吉田様のブログ「@Eval の小ネタ」を思い出し、テストしてみた内容を記載させて頂きます。

今回改築しているアプリは、いわゆる出納帳のようなものになります。
売上金額と入金金額を入力し、残高を計算するというものです。
従来は残高に[前回残高+売上金額-入金金額]という計算式をちまちまと入れていたのですが、こちらを@Eval関数で代用しようというものになります。

それでは以下のような表を含むフォームを元に進めて参ります。


項目としては、日付(日付のみ)と売上金額(数値)、入金金額(数値)、残高(数値)、メモ(テキスト)があり、すべて[編集可能]フィールドという簡単なものです。
最初の残高を登録できるように[Balance_0]という差引残高フィールドを作成しており、デフォルト値に"0"をセットしてあります。
先にも書きましたが、従来のアプリケーションでは、各[Balance_#]フィールドに計算式が入っておりました。

それではフォームの上部に[Formula]というテキスト/編集可能フィールドを作成し、デフォルト値として、まずは以下を設定します。

※¥は全角文字にて記載しております。正しくは半角文字に変更してください。

"
SA:=@GetField( ¥"SalesAmount_¥" + no );
DA:=@GetField(¥"DepositAmount_¥"+no);

SAD:=@if(SA=¥"¥";0;SA);
DAD:=@If(DA=¥"¥";0;DA);

@SetField( ¥"Balance_¥" + no ; SAD-DAD);
@Command([ViewRefreshFields]);
"


こちらは前残を考慮せず、その行の売上金額と入金金額の差を計算させるだけの式となります。
変数"SA"に[SalesAmount_#]を、変数"DA"に[DepositAmount_#]をそれぞれセットします。但しそれぞれ値がブランクである場合に"0"をセットするため、@if関数を用いてそれぞれ変数"SAD"、"DAD"を定義してあります。

なお吉田様のブログにも記載されていますが、式全体が引用符"で囲まれているため、式中の引用符"は半角¥を用いて、エスケープしています。

次に分かりやすいように右端に列を追加し、1行目にボタンを設置します。
式は以下を設定します。


no:="1";
@Eval(Formula)



それではNotesでプリビューし、正しく計算されるか確認してみましょう。
正しく設定されていれば、以下のように計算が行われます。


ここまででまずは@Eval関数が正しく動くかの確認ができたかと思います。
それでは引き続き、前回差引残高を考慮した結果が得られるように変更します。

各フィールドの行の値はボタンに設定された変数"no"が使用されます。
つまり前回差引残高フィールドは、[Balance_変数no-1]を得る必要があります。

それでは[Formula]フィールドの式を変更します。
※青字部分が追加・変更部分になります。

"
BA:=@GetField(¥"Balance_¥"+(no-1));
SA:=@GetField( ¥"SalesAmount_¥" + no );
DA:=@GetField(¥"DepositAmount_¥"+no);

SAD:=@if(SA=¥"¥";0;SA);
DAD:=@If(DA=¥"¥";0;DA);

@SetField( ¥"Balance_¥" + no ; BA+SAD-DAD);
@Command([ViewRefreshFields]);
"


変数"BA"に[Balance_no-1]の値をセットし、計算式に加えたものになります。
こちらをNotesでプリビューすると、ボタンを押しても計算が行われません!!

やはり簡単には変数からマイナス1することはできませんでした。

ということで、変数"BA"の代入式を以下のように変更してみました。


BA:=@GetField(¥"Balance_¥"+@Text(@TextToNumber(no)-1));


見ての通り、変数"no"を@TextToNumberで数値化してからマイナス1し、その値を@Textでテキスト化してBalance_に結合させています。

Notesでプリビューすると、前回残高も正しく計算されることが確認できます。


後から気付いたのですが、ボタンの変数"no"で制御するのではなく、[Balance_#]フィールドの値側で操作したほうが簡単でした(汗

以上で1行目のボタンは正しく動くことが確認できましたので、残りの行にもボタンを追加します。

追加したボタンは、それぞれ変数"no"を行の値(2行目は"2"・・・)に変更します。
念のためNotesでプリビューし、正しく計算されるか確認してください。

最後に[Formula]フィールドを非表示にして今回は完成とします。
なお入力途中の行に修正を加えるような使い方をすると、当たり前ですが値がずれてしまいますので、ご了承ください。