更新系やることの「@out」を深掘りしてみた

公開日:

注意

本記事は情報提供を目的としており、本記事の内容は無保証、サポートの対象外です。
サポート窓口、問合せ窓口にご質問をいただいても対応いたしかねますのでご了承ください。

システム開発グループ テクニカルマネージャーの浅利です。

前回のブログカスタマイン定期タスクの実装で、「キーの値をもとにレコードを更新または追加する」というやることのマッピングを、

最後の問い合わせ日時= stringmax([ @out.日時 ,  日時 ])

と設定していました。

この @out について、私自身あまり使ってこなかったので、この機会に少し深掘りしてみたいと思います。

対応している「やること」

@out は、フィールドマッピングの式の中で使える特殊な書き方で、更新先のレコードを表します。

「更新先」なので、レコードを更新する系のやることでのみ使用できます。(レコードの追加だけをする場合は「更新先」がないので使えません。)

kintoneカスタマイズ:

Job Runner:

(おまけ) 変わり種:

上記は「レコードの更新」「更新または追加」でしたが、
更新なしの追加 なのに@outが使える特殊なやることがあります。

この説明はドキュメントに任せます。

@out を使った例 (更新のみの場合)

カウントを +1 する

更新先に「カウント」という数値フィールドがあったとして

カウント= @out.カウント + 1

※更新のみの場合(後述)

在庫から注文数を引く

在庫= @out.在庫 - 注文数

※更新のみの場合(後述)。また、在庫がマイナスになった場合の処理は別途必要です。

大きい方・小さい方を採用

前回のブログでやったように、更新先と比較して大きい方・小さい方を採用する。

最大日時= stringmax([ @out.最大日時, 日時_1 ])

日時等は文字列として大小比較するため、↑ stringmax関数 を使います。

小さい方を採用する場合も同様。stringmin関数を使います。

最小日時= stringmin([ @out.最小日時, 日時_1 ])

※更新のみの場合(後述)

上は文字列でしたが、数値の場合は max関数, min関数 を使います。

大きい方を採用する場合、

最大値= max([ @out.最大値, 数値_1 ])

小さい方を採用する場合、

最小値= min([ @out.最小値, 数値_1 ])

値が入ってなければ新しくセットする。値が入っていたら元のままにする

メールアドレス= if(@out.メールアドレス = "", 新しいメールアドレス, @out.メールアドレス )

別のフィールドの値によって、ifの条件にする

別のフィールドも使えます。
あるフィールドに「上書き不可」という値が入っていたら元のまま、そうでなければ新しい値にする場合は、

メールアドレス= if(@out.上書き禁止フラグ != "上書き不可", 新しいメールアドレス,   @out.メールアドレス )

(実験)別のフィールドを使うときに、マッピングでそのフィールドも更新する場合は、更新前の値?それとも上の計算結果が入ってる??

いま、更新先レコードに、数値_1: 1、数値_2: 1、数値_3: 1 と値が入っていたとします。

このレコードを更新するマッピングで、

数値_1= 10
数値_2 = @out.数値_1 + 1
数値_3 = @out.数値_2 + 1

としてみました。
もし @out.数値_1 と @out.数値_2 に上の計算結果が反映されているなら 数値_2 は 10 + 1 → 11、数値_3 は 11 + 1 → 12 になるはずです。

さっそくやってみましょう。果たして結果は…?

10, 2, 2 ということで、
どうやら同じやることのマッピングでの計算結果は反映されず、更新される前の時点での値が使われることになるようです。

「~レコードを更新または追加する」系のやることで使用する場合

「~レコードを更新する」(追加はしない) 系のやることであれば、上記の @out.カウント + 1 等で問題ないのですが、
「~レコードを更新または追加する」で @out を使用する際には、エラーになってしまったり思ったように動かない場合があります。

更新の場合は @out には更新対象のレコードとなりますが、追加の場合は @out は空になるからです。

@out が空だと、@out.フィールド はすべて空です。
(よく誤解されるところかもしれませんが、kintoneのフィールドの初期値が入っていたりは、しません 。初期値の設定があってもなくても、すべて空になります。)

@out.カウント + 1 は「空 + 1」となり、数値としての計算ができずエラーになってしまいます。

そのため、「~レコードを更新または追加する」で使用するためには、
if関数 で空かどうか( = “” ) をチェックをして、空だった場合の値と、空でなかった場合の式を書くようにします。

( 上記の「値が入ってなければ新しくセットする。値が入っていたら元のままにする」に似ていますね )

カウンタとして +1 する。「更新または追加」対応版

カウント= if(@out.カウント = "", 1, @out.カウント + 1 )

↑ if( 空かどうかチェック, 空だった つまり追加だった場合の値 または式, 空でなかった つまり更新だった場合の値 または式 )

更新先と比較して大きい方・小さい方を採用する。「更新または追加」対応版

小さい方の文字列を採用する場合のみ、先ほどの更新のみの式から修正が必要でした。

最小日時= if(@out.最小日時 = "", 日時_1, stringmin([ @out.最小日時, 日時_1 ]) )

大きい方の文字列を採用する場合は、空よりも、何か文字が入っている方が大きいため、if で空判定をする必要はありません。
更新のみの場合と同じです。

最大日時= stringmax([ @out.最大日時, 日時_1 ])

数値の場合、min([…]), max([…]) は数値以外は無視されるようでしたので、if で空判定をする必要はありませんでした。
更新のみの場合と同じです。

最大値= max([ @out.最大値, 数値_1 ])
最小値= min([ @out.最小値, 数値_1 ])

まとめ

いくつか@outを使った例をあげました。
もし使えそうなものがありましたら、ぜひ使ってみてください。

もし@outを知らなかったら、更新対象を「キーを指定してレコードを取得する」でとってきてから、その結果からフィールドの値を取り出して…ということをしていたと思います。

もちろんそれでもできなくはないですが、@outという便利なものが用意されているので、使えるところでは使えた方がイイデスネ!

アールスリーでは業務改善・システム開発を行うサービスを「キミノマホロ for kintone」として提供しています。

今回のような内容を社内のみんなで質問しあったり教えあったりして、システム開発に活かせるよう切磋琢磨していますので、
お困りごとがある場合は「キミノマホロ for kintone」もぜひご検討ください。

必要なものを、必要なだけ。
業務改善の新しいカタチ

kintoneを活用した業務改善・システム開発サービス

kintoneを活用した業務改善・システム開発サービス

投稿者プロフィール

アバター画像
淺利(あさり)
Webとか.NETとかスマホとかマイコンとかシーケンサーとか、いろいろやってるエンジニアです