新規投稿
フォローする

カスタマイズしたレコード一覧画面からチェックを入れたレコードだけ一括で更新したい

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

今回、レコードの一括更新を行いたいのですが、エラー番号400が発生してしまい、正常に動作しません。

詳細を記しますので、ご教授いただければ幸いです。

・目的

製造番号「AAA」で購入していた部品を製造番号「BBB」に変更する際に、レコード数が多いため、レコード一覧から変更したいものだけ選んで一括で変更したい

・できていること

レコード一覧にチェックボックスを設置する

一括更新用のボタンを配置し、押したときにチェックを入れたレコードのレコード番号を取得する

入力欄を配置し、変更先の製造番号を入力できるようにする

・発生するエラー

レコード一括更新の命令実行時にエラー400が発生

ディベロッパーツールで見ると、idにでたらめな文字列が入っており、入力内容が正しくありませんと表示されます

・エラーの発生する箇所のソースコード

一覧画面に追加したボタンを押した処理だけを記述します

// ボタンクリック時の処理
      IndexButton.onclick = () => {
          var recordIndexes = document.getElementsByName('checked-records');
          var checked_index;
          var count = 0;         //チェックを入れた数
          var changelist = Array(20);  //チェックを入れたレコードのレコード番号の受け皿
          var NewSeiban;                //新しい製造番号
          
          for(let i=0; i<recordIndexes.length; i++){
            if(recordIndexes[i].checked){
              //どこにチェックされてるか取得
              checked_index = recordIndexes[i].id.split('-')[2];
              // チェックの入った数と、チェックを入れたレコード番号を取得
              count++;
              changelist[i] = records[checked_index]['レコード番号']['value'];
              
            }
          }
          //チェック数が0なら処理しない
          if(count === 0){
            alert('変更するデータが選択されていません');
            return;
          }
        //新しい製造番号が入力されていない、または0なら処理しない
          if(InputText.value === '' | InputText.value === '0'){
          alert('変更する製造番号を先に入力してください');
            return;
          }else{
            //変更先の製造番号を取得
            NewSeiban = InputText.value;
          }
          
        //操作確認
          var result = confirm(count +' 件のデータの製番を変更します。よろしいですか?');
        if(result === true){
            var list = [];
            var check;
            //書き換えデータ作り
            for (let i = 0; i < count; i++) {
              var obj = {};
               obj["id"] = changelist[i];
               obj["製番"] = NewSeiban;
               list.push(obj);
            }
            
            var requestObj = {
                            "app": kintone.app.getId(),
                            "records": list
                          };

            kintone.api(kintone.api.url("/k/v1/records/status", true), "PUT", requestObj, function() {
            alert('製造番号を変更しました')
            });
        }else{
          alert('操作を中断します');
        }
      };

恐らく配列を用いて書き換えデータを作るところに問題があるのでしょうが、どのように修正すればいいか分かりません。

ご教授お願い致します。

0

4件のコメント

Avatar
TO

Sei_EL様

idにでたらめな文字列,とのことなので,
changelist[i] = records[checked_index]['レコード番号']['value'];
や,
obj["id"] = changelist[i];
に想定したものが格納されているか確認すると良いかと思います.

0
Avatar
Sei_EL

TO様

コメントありがとうございます。

ご指摘いただいた

changelist[i] = records[checked_index]['レコード番号']['value'];

obj["id"] = changelist[i];

の項目で確認したところ、想定していた値が格納されていることが確認できました。

 

そうなると、

list.push(obj);

もしくはその後の

var requestObj = {
                            "app": kintone.app.getId(),
                            "records": list
                          };

の部分でおかしなことになっているのだと思います。

あと、追加の質問になってしまうのですが、下の書き方ですとidと製番以外の情報を持ったレコードですと正常に動かないのでしょうか

for (let i = 0; i < count; i++) {
              var obj = {};
               obj["id"] = changelist[i];
               obj["製番"] = NewSeiban;
               list.push(obj);
            }

 

0
Avatar
TO

Sei_EL様

NewSeiban等の構造がわからないので何とも言えませんが,今回のようなケースでは,

              var obj = {};
               obj["id"] = changelist[i];
               obj["製番"] = NewSeiban;
               list.push(obj);

ではなく,

              var obj = {};
             obj["id"] = {value: changelist[i]};
             obj["製番"] = {value: NewSeiban};
               list.push(obj);

となるのかと思います.
レコードの一括更新

他のフィールドについては,記載しなければ更新されません.
ただ,テーブルデータの場合はちょっとクセがあるので,注意ください.
レコード更新におけるテーブル操作のテクニック

0
Avatar
Sei_EL

TO様

コメントありがとうございます。

テーブル操作の部分は今まで知らない項目でしたので、確認して、現在のソフトの問題解決に繋がるか検討しようと思います。

 

申し訳ありませんが、まだ解決まで到達できておりませんので、他にも気づいて点等ありましたらコメントいただけると幸いです。

0
サインインしてコメントを残してください。