ページビューの合計

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

2020年2月11日火曜日

フォームの値を引き継ぐ

This time it is not enough to make an article, but I wrote about creating a new document that inherits values from existing documents.

みなさま、こんにちは。

さてまずは告知から・・・。

2月20日(木)、秋葉原でノーツコンソーシアムに関わる複数イベントがございます。

 10-12時 2020年度 第一回ユーザー情報交換会
      第4回 ビジネスパートナー情報交換会

立場の違うふたつの情報交換会が同じ時間で開催されます。

な、なんと!
終了後には合同でランチミーティングも開催されるそうです!!
会員限定のイベントではありますが、定員内であれば、見学も可能かもしれませんので、事務局へお問い合わせください。

 13-13:45 第26回ノーツコンソーシアム通常総会

こちらは指定代表者のみの参加になりますが、私も一理事として参加致します。

最後にメインイベント

 14-17時 ノーツコンソーシアム FESTA 2020

こちらでは各研究会より昨年の成果報告が発表されます。
昨年はV10にスタートし、V11リリースとかなり活発な成果が得られたようですので、必見です!!
またHCL様からの最新情報も発表されるようですので・・・たとえばVoltとか・・・Nomadとか・・・
見逃せないイベントになる事間違いなし!
FESTAについては、会員外の皆様含め、広く参加可能ですので、ぜひ今からでも間に合いますので、お申込みください。

以上、詳しくはノーツコンソーシアムサイトよりご確認ください。


さらにもう1件

まだ正式リリースされていませんが、今年の大阪研究会は今までとはちょっと違います!
従来は初回が4 or 5月開催でしたが、今回はいろんな環境変化も踏まえ、3月に第0回 大阪研究会を開催致します。
ご興味ございましたら、ご一報頂けましたら詳細ご案内可能ですので、記事コメントでも、FBでもメールでも、ご連絡お待ちしています!



また前置きが長くなりましたね・・・(汗
本題ですが、今回もたまたま弊社内で生じた改修案件を記事にしました。

現在使用しているSFAアプリですが、前回記事を元に今回記事を作成するという機能があります。
具体的には、前回記事を引用した場合、新規作成時の顧客フィールドや案件フィールドを再度選択しなおす手間を省くだけのものになります。
あわせて引用した記事の文書リンクを今回記事に添付することで、容易に前回内容を参照できるようにしています。

処理は至って簡単で、以下の式をアクションボタン(弊社では[引用作成])に記述しているだけです。


 @Command([OpenDocument]);

 tmp_CUM := Customer_m;
 tmp_ITM:=Item;

 @Command( [EditMakeDocLink] ) ;
 @Command([Compose];"main");
 @Command([EditGotoField];"LastTime");
 @Command( [EditPaste] );

 @Command([EditGotoField];"Customer_m");
 @Command([EditInsertText]; tmp_CUM);
 @Command([EditGotoField];"Item");
 @Command([EditInsertText]; tmp_ITM)


二つの変数に現在の文書からフィールドの値を与え、
文書リンクを作成して、
フォーム[main]を新規作成。
[LastTime]フィールドに文書リンクを貼り付け、
[Customer_m]および[Item]フィールドに変数の値をセットしているだけになります。

従来は同じアプリケーション内への引継ぎでしたので、以上で完了していました。


今回発生したのは、Dominoサーバーのリプレイスを機会に、年度であたらしい別のアプリケーションに分割することになりました。
つまりこの[引用作成]機能も新規作成先を変更する必要が出てきました。

とは言っても、ほぼ同じ設計での新アプリケーションスタートのため、式を書き換える場所は1か所のみです。

@Command([Compose];"main");

にサーバー名とアプリケーション名を追加するだけです。


 @Command([Compose];"サーバー名":"アプリケーション名.nsf";"main");


いずれも"で囲むことを忘れないようにしてください。
またアプリケーションがDataフォルダのさらに下位フォルダにある場合は(例:Appフォルダ内)

  "App¥¥アプリケーション名.nsf"

と¥にエスケープ文字の¥を付与することを忘れずに・・・。

※本ブログでは半角¥は\と表示されるため、全角にさせていただいております。

以上、取るに足りない内容かとは思いますが、ユーザーには好評な機能でしたので、記事とさせて頂きました。


ちなみに弊社マイグレーションの進捗ですが、新インフラ内でDominoサーバーとTravelerサーバーが動き出しています。
DominoサーバーにはIDVaultとVerseオンプレミスのインストールは完了しているそうですが、まだ触れていません。
Travelerサーバーについては、先週簡易テストを行い、問題なさそうですので、先行して近日入れ替えを実施致します。

クライアントについては、既存VDI(Win7)の間はそのまま利用し、新しいVDI(Win2016Server)切り替え時にV11で公開することになる予定です。

また随時報告させていただきます!!

2020年1月24日金曜日

過去日付を許さないフィールド

It's pretty simple today, but I'm going to talk about setting fields that don't allow past dates.

みなさま、こんにちは!

いよいよ来週ですね、【2020 HCL Masters 日本祝賀パーティー】。
みなさまにお会いできることをたのしみにしております!

さて今回の話題です。

弊社内で勤怠管理のアプリケーションを運用しているのですが、事後報告をできないようにするという案件が生じました。

たとえば「朝寝坊したから、今日は在宅で働こう」なんてことを避けるようなイメージです。
※実際の弊社の目的ではありませんので、悪しからず・・・w

最初は作成日フィールド(@created)で判断すればいいのではと考えたのですが、文書が保存できてしまうことは避けたいということになりました。

となると、「入力の確認」で設定するのが一番簡単という判断になりました。

「入力の確認」でよく利用するのが、必須フィールドに設定する


 @If([Field_name]="";@Failure("「Field_name」は必須です。");@Success)


という見慣れた式があります。

@If([Field_name]="";

・・・あとは簡単ですよね。



 @If(StartDate<=@Today;@Failure("[StartDate]は明日以降の日付を指定してください。");@Success)


記事公開後、とある逃げ道があることが判明!!
以下がさらに適切かと思いますので、書き直させて頂きます。
理由・・・?
先の式ですと、クライアント側の日にちをGETしてしまいますので、ごにょごにょごにょ・・・。


 @If(StartDate<=@Now([SERVERTIME]);@Failure("[StartDate]は明日以降の日付を指定してください。");@Success)


ご指摘、ありがとうございました!

念のために動きを見ておきましょう。

「<=」としていますので、本日の(2020/1/24)以前の日付だとエラーになるはずです。


無事、想定通りの結果が得られました。
もちろん明日の日付ですと、エラーは出ません。
・・・この画面だけではわからないのですが(汗


フィールドがエラーになっている以上、文書も保存することができません。

また一時的に明日以降の日付で保存し、本日以前に日付を変更したとしても、エラーになります。

以上、お恥ずかしながら至って簡単な内容ではありますが、それなりに効果のある設定でしたので、記事にしてみました。


なお弊社インフラですが、すったもんだがありまして、昨日よりV11のサーバー構築がスタートしています。
構築そのものはパートナーSE様に依頼していますので、作業内容等は今後書ける範囲で紹介させて頂きます。

予定としては、来週末にサーバー群が設置、結線。
再来週末にインフラの入れ替えを予定しています。

実際のDominoサーバーの更新は2/末から3/中になりそうです。

今回、VDIのOS入れ替えのため、各個人のWindows環境は新規作成します。
従ってノーツクライアントも新しいOSに新規インストールしたパターンを配布することになるのですが、この配布手順をどうするかが今後の課題になりそうです。

今までと違い、IDVaultが有効化されますので、なんとか作業工数を減らすことができないか検討致しますので、このあたりもテスト内容含めてご報告したいと予定しています。

それではみなさま、まずは来週!!!

2019年6月26日水曜日

#年度 や #期 の取り扱いについて

Treat the fiscal year with Notes.

みなさま、こんにちは!!
いまだ梅雨入りしてない神戸ですが、ようやくそれらしい雰囲気になって参りました。

さて日本企業では売上集計などを年度で取り扱う場合も多いかと思われます。
弊社も例にもれずではありますが、従来はNotesではあまり年度というものを意識することなく利用しておりました。

今回、従来Excelで行っていた、取引先向けの実績収集ファイルをNotes化しようという案件が発生したのですが、その必須項目として以下のように「年度」や「期」、「月」が要求されております。


今まではExcelで行っていたので、蓄積された前行をコピーするなどであまり意識する必要がなかったのですが、Notesでの入力はフォームで行うため、その入力作業を簡素化できればと思ったのが今回の発端です。

目的としては、「納品書発行日付」をカレンダーから選択するだけで、「年度」「期」「月」が計算結果で得られればというものです。

ということで、簡単なフォームを作成してみました。


納品書発行日付[InvoiceDate]は編集可能な日付/時刻としています。
日付/時刻制御にチェックし、年月日のみの表示としてあります。


またフォームのオプションで、「フィールドの自動更新」にもチェックしておきます。


まずは簡単な「月」からです。
こちらは計算結果のテキストとしてあります。
単純に「納品書発行日付」から「月」部分を抜き出すだけです。
※今回はうしろに「月」を付加してあります。


式は以下のようにしました。


 @If(InvoiceDate="";"";@Text(@Month(InvoiceDate))+"月")


If文は、新規作成時にはInvoiceDateがブランクのため、計算結果が得られず、エラーになることを回避させています。
文字列「月」をつなげるため、@Monthで得られた数字を@Textで文字列化しているという、単純なものになります。

次に「期」です。
今回は4~9月の場合に「上」、10~3月の場合に「下」を表示させたいと思います。

こちらも計算結果のテキストとしてあります。


こちらの式は、以下のようにしました。


 @If(Month="";"";(@If(Month="4月":"5月":"6月":"7月":"8月":"9月";"上";"下")))


先のMonthフィールドが「4月」~「9月」であった場合、「上」。それ以外は「下」を表示するというこちらも簡単なIf文になります。
複数条件をまとめるため、各月を「:」(コロン)で接続してあります。

もう少しIf文をネストする必要がありますが、これだと海外のようなQ1~Q4も実現できますね。

それでは最後に年度です。
年と年度の違いは、もちろん12月で終わるか、3月で終わるかです。
問題なのは1~3月が[本来の年]-1される必要があるというものです。
なんて考えていると複雑になってしまうのですが、要は今の日付から3ヶ月引いた時の年(Year)を取得すればいいということになります。

先と同様、こちらも後ろに「年度」の文字を接続させるため、計算結果のテキストとしています。


式は以下としました。


 @If(InvoiceDate="";"";@text(@Year(@Adjust(InvoiceDate;0;-3;0;0;0;0)))+"年度")


こちらも簡単ですね。
InvoiceDateをAdjust関数を用いて、マイナス3ヶ月としたものから年部分を取り出します。
そちらをテキスト化して、「年度」をくっつけているだけになります。

それでは実際のフォームの動きを見てみましょう。

まずは新規作成画面です。


「納品書発行日付」がブランクですので、If文で処理した通り、「年度」「月」「期」のすべてがブランクになっています。
If文がなければ、この新規作成の画面を開くことができません。

それでは本日の日付を選択してみます。


以下は選んですぐの状態です。


フィールドのフォーカスを移動させると、


予定通り、「2019年」「6月」「上」という計算結果が得られました。

それでは今年の10月1日にしてみた場合、どうなるでしょう。


こちらも正しく期は「下」となってくれました。

それでは来年3月31日では・・・


2019年の下期と表示されました。
しつこいようですが、最後に来年の4月1日です。


ちゃんと「2020年度」「上期」になりました。

以上、いまさら取り上げることではないかとも思いましたが、企業として年度ベースでものごとを見ている場合も多いため、記事にしてみました。

2018年8月20日月曜日

#Notes 文書からファイルサーバーの特定ファイルを開く

This time I will get the value of the field in the NotesForm and set up to open the PDF file stored in the file server that matches that value.

みなさま、こんにちは!!
さて最近は別の作業でなかなかブログを書くことができず、申し訳ありません。
当ブログも2016年7月の開設から2年が経過しました。
振り返ると、今回の記事がちょうど100本目になります。
・・・まだまだですね(汗

今回は以前から実現したいと思いつつ、実際の切り替えが年度末である必要があり、のんびりしていたのですが、気付くと今年も半分過ぎようとしており、あわてて手がけた内容になります。

まず最終目的としては、Notesの文書内にあるフィールド(今回は「受注NO」というフィールド)の値を取得して、ファイルサーバーにある"受注NO".pdfを開きたいというものになります。
現在運用しているアプリケーションでは、リッチテキストフィールドに"受注NO".pdfを添付ファイルとして扱っています。
画面としては、下記のようなものになります。


ふたつ添付ファイルがありますが、今回は右側の「受領書」欄のみを対象とします。

もちろんこの状態でも問題ないのですが、Notesのアプリケーションサイズを抑えたいのもひとつなのですが、いちいち添付ファイルを貼り付ける手間を省きたいという点が一番の目的になります。

なお少し余談になりますが、スキャンした伝票の名前を"受注NO".pdfに変更する過程については、伝票のバーコードを複合機でスキャンする際に処理させており、自動で所定のフォルダ内に保存するという処理で完結しております。

まずは受領書欄にボタンを追加し、ファイル名を指定してpdfを開くことができるか、ためしてみます。


ボタンには直接ファイルパスを指定して以下の式を設定しました(テストデータとして、受注NO、"49396550"というものを指定しています)。
※半角¥マークはバックスラッシュに変換されますので、意図的に全角で記載しております。
※弊社ではファイルサーバーをクライアントのXドライブにマッピングしておりますので、このような式になりますが、直接サーバーを指定する場合は、"¥¥¥サーバー名¥¥ファイルパス"で指定してください。
※"¥"は""でエスケープする必要がありますので、ご注意ください。
・・・恥ずかしながら、今回も私はつまづいておりました(大汗



@Command([Execute];"X:¥¥globalscan¥¥test¥¥49396550.pdf")



それではNotesクライアントからPDFが起動できるか、確認してみましょう。


!!

しばらく確認して気付きました。
デザイナーをインストールしている端末を作り直したため、AdobeReaderがインストールされてませんでした(汗

ということで、インストールして無事指定したPDFが開くことを確認しております。

このままではすべての文書から同じPDFを読み込んでしまいますので、フォーム内の"受注NO"を取得して、それぞれ特定のPDFファイルを開くことができるように変更します。

それでは先ほど設定したボタンの式を、以下に書き換えます。


NO:=juno;
@Command([Execute];"X:¥¥globalscan¥¥test¥¥"+NO+".pdf)"


フォームの受注NOフィールドである"juno"を変数"NO"に取得して、呼び出すファイルパスに組み込んだだけのものになります。


それではテストとして、先ほどの文書をコピーして、受注NOを49396550からダミーである"12345678"に変更してみます。


あわせてファイルサーバー側にもダミーのPDFを準備して、ファイル名を"12345678.pdf"にしておきます。


それではボタンを押して、正しく指定したPDFファイルが開くか確認します。


少しわかりにくいかと思いますが、AdobeReaderが起動し、"12345678.pdf"が開いたことが確認できました。


@関数のみで解決する、実に簡単な改善ではありますが、実務担当者の負担は大きく下がることになるようです。

引き続き、ユーザー視点での思いつきや閃きがあれば、記事にさせて頂きます。

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