新規投稿
フォローする

文字列の値が重複しているレコードを除いたレコード数

お世話になります。

JavaScriptを用いて、あるアプリに入っている売上データのうち、
社名も部署名も一致するものは(部署名が空白でも)
同じデータとしてカウントアップしていき、最終的なレコード数を
実質の稼働数として、他のアプリの数値フィールドに格納したいと考え、
以下のようなプログラムを書きました。

//稼働社数のプログラム
(function() {
"use strict";

//レコードの編集画面で適用する
var events = ['app.record.edit.show']
kintone.events.on(events, function(event) {
    var record = event.record;
    var client_rank = record['(フィールド名)']['value'];
    var kadounum = 0;
    var records = new Array();
    if(client_rank == "(フラグ名)"){
        var query ='ドロップダウン_2 in ("(条件)")'+
            ' and ドロップダウン_5 not in ("(条件)")' + ' and 月 in ("10月","11月","12月")';
    }else{
    query ='(フィールド名)="' + client_rank +
            '" and ドロップダウン_5 not in ("(条件)")' + ' and 月 in ("10月","11月","12月")' ;
            }
        // 非同期リクエストを行う
        kintone.api('/k/v1/records','GET',{"app":38,"query":query},function(resp_data){
            for(var i = 0; resp_data.records.length > i; i++){
                records.push(resp_data.records[i]);
            }
    if(records.length == 0){
    kadounum = 0;
    }else{
   for(var j =0; records.length > j; j++){
        var kaburi = false;
        var newsyamei = records[j]['文字列__1行_']['value'];
        var newbusyomei = records[j]['文字列__1行__0']['value'];
        if(j == 0){
           kadounum = kadounum+1;
           }else{
                for(var k =0; k<j;k++){
                var compares = records[k]['文字列__1行_']['value'];
                   if(compares != newsyamei){
                   continue;
                   }else{
                   var compareb = records[k]['文字列__1行__0']['value'];
                   if(compareb){ compareb = compareb;}else{compareb = "空白";}
                   if(newbusyomei){
                     newbusyomei = newbusyomei;
                   }else{newbusyomei = "空白";}
                   if(compareb != newbusyomei){
                   continue;}else{
                      kaburi = true;
                     }
                  } 
               }
               if(kaburi == false){
                kadounum = kadounum+1;
               }else if(kaburi == true){
                kadounum = kadounum;
               }
          }
     }
    }
    record['稼働社数']['value'] = kadounum;
        });
  return event;
   });

})();

このように書いて実装したところ、稼働社数にズレが生じてしまいました。さらに、returnが効かず、値がフィールドに入力されませんでした。
やり方としては、「for文で関連レコードをひとつずつ見ながら、さらにfor文を用いてその上にある関連レコードと値を比較して、社名も部署名も一致する場合、数は数えず、そうでなければ1を足す。」というプログラムになります。
なにか問題点や、よりスマートな方法をご存知であればお教えいただきたいと存じます。
よろしくお願いいたします。

0

3件のコメント

Avatar
斎藤 栄

Ohnishi様
ラジカルブリッジの斎藤です。

計算が合わない点はさておき、kintoneの話題としては
「returnが効かず、値がフィールドに入力されませんでした」
という点をまずはお伝えいたします。

プログラムにある通り、kintone.apiという非同期リクエストを使っていますので、この関数を実行した直後に最後の return event; が実行されてしまいます。
なので、非同期処理で最後に実行される record['稼働社数']['value'] = kadounum; の後は、return event; には処理が行かないので、値がフィールドに反映されないのだと思います。

非同期処理はなかなか扱いが難しい面もあるので、kintone.apiは使わず、XMLHttpRequestを用いた同期処理に変更された方が良いのではないかと思います。

0
Avatar
Yuta Onishi

斎藤様
ご回答ありがとうございます。

やはりそうでしたか・・・。XMLHttpで書くといつも「kintone.apiを使ってください」と言われるのであえて使っていたのですが・・・。
とりあえず同期処理の部分をXMLHttpに修正しました。

リクエスト自体は問題なく動いているので、
引き続き値の重複判定部分に関してアイディアをお待ちしております。

0
Avatar
Yuta Onishi

まさかのフィールドコードが間違っていたという・・・。
無事に動作いたしました。
ダミーアプリで動かしてから本体に実装する時は
ちゃんとチェックしないとダメですね・・・。

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