(再)フィールドの値をサブテーブル内にコピーしたい

nekoko 様

こんにちは。

いい感じに追加されていますが、非常に惜しいですね。

今回の原因は、カンマが抜けているのが原因のエラーです。

’app.record.create.change.支払日’ の後ろに『,』が抜けています。(8行目後ろ、カンマが抜けている。)

 

別件ですが、’app.record.create.submit.支払日’ は間違っています。

これをそのまま追加した場合は、特にエラー表示もなく対象のイベントもないため≪何も起こらない≫ということになるかと思います。

正しくは、’app.record.create.submit’ ですが、これは新規追加時に保存をした場合に機能するイベントタイプです。

私が指定している<レコード更新時にフィールドコード支払日に変更があった場合>とは異なります。

もう一度、イベントタイプも見直して頂ければ幸いでございます。

新屋 育男様

 

8行目カンマだったのですね。ありがとうございます。

9行目と表示されていたとしても必ずしも表示されている行とはかぎらないんですね。

勉強になりました。ありがとうございます。

 

質問なのですが、 ’app.record.create.submit’ を追加する際に「支払日」等の文字(?)はいらないと言う事でしょうか。

 

修正したのが下記コードで、エラー等が出なかったのでこちらが正しいコードになるのでしょうか。

 

今一度イベントタイプをサイトを見ながら見直してみます。

// 即時関数
(function() {
'use strict'; // ストリックモード
// イベントタイプの定義
var events = [
'app.record.create.show',
'app.record.edit.show',
'app.record.create.change.支払日',
'app.record.changes.field',
];
// イベントタイプが ture の時にレコードの内容をコンソールに表示する。
kintone.events.on(events, function(event) {
console.log(event.record)
console.log(event)
});
}());

 

nekoko 様

9行目の構文エラーで間違いはないですよ。

9行目が構文がおかしいので認識できません。ということですかね。

逆に言うと8行目までは認識できています。

といことですので、今回の場合はその接続の仕方に問題があったわけです。

 

イベントタイプも非常に惜しいですね。

でも、‘app.record.changes.field’ は間違いですので、nekoko 様の仰る通りイベントタイプの一覧を見てもう少し考えて頂けますと幸いでございます。

新屋 育男様

ご説明ありがとうございます。

今後同じようなエラー表示があった場合はその行だけではなく接続の仕方なども確認するようにします。

 

もう一度、1からゆっくりと考え直してみます。

新屋 育男様

お世話になっております。

コードを修正いたしましたので確認の程を宜しくお願い致します。

 

// 即時関数
(function() {
'use strict'; // ストリックモード
// イベントタイプの定義
var events = [
'app.record.create.show',//レコード追加画面表示後
'app.record.edit.show',//レコード編集画面表示後
'app.record.create.change.支払日',//レコード追加画面、フィールド値変更
'app.record.index.edit.change.支払日',//レコード更新時にフィールドコード支払日に変更があった場合
];
// イベントタイプが ture の時にレコードの内容をコンソールに表示する。
kintone.events.on(events, function(event) {
console.log(event.record);
console.log(event);
});
}());

nekoko 様

おはようございます。

非常に惜しかったですね。

 

app.record.index.edit.change.支払日 ですが、index が多いですね。

このイベントタイプですが、よく見るとわかりますけど

ドット区切りで、意味合いが変わるように作られています。

app(第一) .record(第二) .create(第三) .show(第四) と仮定して見ていくと動きがわかると思います。

 

第一、第二は、ほとんど変わらないので無視して、第三、第四に意味合いがあるのでそれを見ればどのイベントタイプかがわかるようになっています。

第三・・・ index (一覧) , detail (詳細) , create (追加) , edit (変更) , などで、どの画面かが主になってると思います。

第四・・・ show (画面を開いた時) , change (値に変更があった時) , sbumit (確定処理がされた時) , などで、主に動作がトリガーになっています。

※上記はざっくりした覚え方と思って下さい。

 

というところで、なかなか進んで来ているので次に行きましょう。

 

次は、本題の

> 支払日を入力したタイミングで、左下に表示される残高を入力した行の支払時点残高にコピー及び保存したい。

まず 支払日を入力したタイミング ということですが、こちらはイベントタイプを設定しているので動作の確認だけして頂ければと思います。

支払日を入力したときに、コンソールに改めてレコードの情報が表示されるかですが、レコード情報が改めて表示されればOKです。

 

その次へ行き、 左下に表示される残高を入力した行の支払時点残高に値を入力 で良いですかね。

ということですので、この値が取れているか確認しなければいけません。

 

まずコンソールに表示されているレコード情報から、残高のフィールドコードの value に 必要な値が入っているか確認をしてみて下さい。

この値の使い方ですが、console.log を今回2つ作って頂きました。

その中に、event.record と event と2つ作って頂きました。

この違いについてですが、event のログを見て頂いて、今回の場合はコンソールに表示される2つ目のオブジェクトです。

それを開いたら(:arrow_forward:をクリック)appId: , record: , recordId: , type: とその他にも続いて画面にでてきていればOKです。

この event オブジェクトの record を表示したものが event.record です。

ですので、event オブジェクトに表示されている record の内容と event.record の内容はまったく同じものが表示されているということです。

この record の中から対象の値を取得したい場合は、変数に代入をするということをしていきます。

 

例えばレコード番号の場合は

// 変数を作成してレコード番号を取得する
var number = event.record.レコード番号.value;
// 変数にレコード番号が入っているかコンソールで確認する
console.log(number);

というように記述していきます。

 

これは、そのオブジェクトの中(:arrow_forward:を開いて確認)をしていくと、その順番通りにプロパティを指定した値を取得することができます。

今回のレコード番号の場合、プロパティの順番を追っていくと record.レコード番号.value となっていることが確認できれば大丈夫です。

ざっくりですが、今回のプロパティとはオブジェクトの中で【 : (コロン)】の前にあるモノがプロパティなんだぐらいの認識で大丈夫です。

逆にその後ろにあるものが、値だと思って頂ければ大丈夫かと思います。

 

もうひとつ例を出します。appId の値を変数に代入する場合ですが、

var appId = event.appId;
console.log(appId) // 私のコンソール画像の場合は 158 と表示される。

というふうになります。

 

ということで少し長くなりましが、残高の値を変数に代入してコンソールに表示するようにしてみて下さい。

 

上記が終わったら、支払日が変更された時に eventオブジェクトの中に changes というプロパティがあるのでそちら中を確認して下さい。

changes の中に、row というプロパティがありますが、それが変更があったサブテーブルの行を取得しています。

そのサブテーブルの行の中にフィールドコードが入っている部分が valueプロパティです。

今回の内容は、そのvalueプロパティにある【支払時点残高】の書き換えができた時にいちようは終了ということです。

 

あともう少しです、頑張りましょう。

新屋 育男様

こんにちは。

一つ一つ丁寧にご説明して頂きありがとうございます。

動作確認を終え、教えていただいたコードを入力する段階なのですが、下記コードの レコード番号 を残高に書き換えて入力すればよろしいのでしょうか。

// 変数を作成してレコード番号を取得する
var number =event.record.レコード番号.value;
// 変数にレコード番号が入っているかコンソールで確認する
console.log(number);

あと少し頑張りたいと思います。

nekoko 様

仰られる通りで、レコード番号を残高のフィールドコードに書き換えて、残高の数値がコンソールで確認できれば成功です。

 

そちらはすぐ終わると思いますので、それが確認出来たらそれ以降の 上記が終わったら 、以降の内容にとりかかって頂ければと思います。

おそらく疑問が出てくると思います。

その時は質問をしてみて下さい。

新屋 育男様

ありがとうございます。

 

上記が終わったら、以降の内容にとりかかってみようと思います。

疑問が出てきたら一度、自分自身の力で解決を試みて、解決に至らなさそうと判断しましたらご質問させていただきます。

新屋 育男様

こんにちは。

 

疑問点が二つほど出てきましたのでご質問させていただきます。

 

1.IDはnullでよろしいのでしょうか。

以前に調べたことがあるのですが、その際に変数が定義されていない場合に表示されると記載されていました。

row: {id: null, value: {…}}

 

2. valueプロパティとvalueofは同じものなのでしょうか。

valueOf: ƒ valueOf()
length: 0
name: "valueOf"
arguments: (...)
caller: (...)  

 

  1. (書き換え後のコード)

nekoko 様

こんにちは。

> 1.IDはnullでよろしいのでしょうか。

はい、大丈夫です。

サブテーブルのIDは、保存されるまではIDは保持していないため。

新に作成された時には、null になるようになっています。

 

> 2. valueプロパティとvalueofは同じものなのでしょうか。

別物でございます。

概念がプロトタイプに行っているので、そこは基礎知識が抜けてると難しいので割愛します。

Object のプロトタイプ - ウェブ開発を学ぶ | MDN (mozilla.org)

標準組み込みオブジェクト - JavaScript | MDN (mozilla.org)

取り急ぎ、そのあたりの関数や prototype にあるオブジェクトは JavaScript が自動的に作成するオブジェクトぐらいの認識で大丈夫かと思います。

 

気になるのは、どこの length が 0 で何を聞きたいかですかね?

Array.length - JavaScript | MDN (mozilla.org)

String length - JavaScript | MDN (mozilla.org)

 

上記の様に、配列の要素数を数えるものと文字数を数えるものの2通りの使い方があります。

オブジェクトの中で表記されている length については、ほぼ配列の要素数を示しているので、この配列にはなにもありませんよ。

的な感じになってるだけですね。

 

書き換え後のコードは特に問題ないようです。

新屋 育男様

疑問に対するご回答及びご説明有難うございます。

コードは問題ないということですので貼っていただいたリンクを参考に修正の方を行って生きたいと思います。

 

また疑問等がありましたらご質問させて頂きます。

新屋 育男様

サブテーブルの行の中にフィールドコードが入っている部分が valueプロパティです。

今回の内容は、そのvalueプロパティにある【支払時点残高】の書き換えができた時にいちようは終了ということです

 

こちらの件についてなのですが画像のような表示になっていて見た感じ定義されていないように感じるのですが、定義されていない=書き換えがされていないと言う事でしょうか。

それとも見ている箇所が違うのでしょうか。

 

nekoko 様

良い質問だと思います。

結論としては、初期値が(undefind)です。

undefind ですが、特に初期値を設定していない場合は、初期値として undefind が返るようになっているのが JavaScript の仕様ですね。

ですので、支払時点残高にある value が undefinde になっているのは初期値としては特に問題はないということになります。

 

今回は、その value を 残高で上書きするように記述するのが課題です。

新屋 育男様

undefindが必ずしも定義されていないとは限らないんですね。

キントーン開発が落ち着いて時間あるときにさらに勉強します。

 

>value を 残高で上書きするように記述する

課題の提示有難うございます。

サイト等を参考にして、頑張ります。

新屋 育男様

こんにちは。お世話になっております。

 

valueの上書きなのですがこちらを参考にする形でよろしいのでしょうか。

nekoko 様

こんにちは。

上書きの基礎はこんな感じです。

var hoge;  
hoge={
    message:'hello'
}  
alert(hoge.message); // 「hello」と表示される

hoge.message='bye';
alert(hoge.message);// 「bye」と表示される

[Javascript] prototype のプロパティに値を上書きするのと prototype にオブジェクトリテラルを上書きするのでは動作が異なる « Codaholic

今までお伝えしたこととをよく整理するとわかると思います。

オブジェクトリテラルで上書きする方法でやられるようでしたら、nekoko 様のURLを参考にすると良いかと思います。

新屋 育男様

上書きの基礎有難うございます。

しっかりと整理して記載していてただいたコードで行おうと思います。

nekoko 様

こんにちは。

2月から、忙しいのでこちらへ返信が遅くなります。

ですので、 支払日を入力したタイミングで、左下に表示される残高を入力した行の支払時点残高にコピー及び保存したい。

という内容の答えを提示しますね。

(function () {
'use strict';
const events = ['app.record.create.change.支払日', 'app.record.edit.change.支払日'];
kintone.events.on(events, function (event) {
  let currentRow = event.changes.row.value;
   currentRow.支払時点残高.value = event.record.残高.value;
  return event;
});
})();

こんな感じになります。

内容は、nekoko 様の想像と一致しましたでしょうか?

 

イベントタイプを減らしているのは、追加・編集画面に移行した際に changes.row が無いためエラーになる為です。

あっても、エラーになるが動作はします。

こちらのスレッドの依頼通りに機能はしますが、私的には不具合があります。

実際に触ってみて、気になる点があればまた聞いてみて下さい。

 

返信は遅くなりますが、お答えいたします。

新屋 育男様

使えるお時間をぎりぎりまでさいて頂き有難うございます。

また、一つ一つ丁寧に解説して頂き有難うございます。

 

とてもコンパクトに様ったようにみえますね。

 

月曜日にメインで使うものに動作の確認をしてもらいます。

 

またご縁がありましたらその際はよろしくお願いいたします。