納品書の出力、合算の請求書(帳票)発行に関して

はじめまして、kintoneを触り初めたところの初学者です。

以下のような使い方を模索しておりどなたかご教示いただけませんでしょうか?

■やりたいこと:受注登録アプリから、納品書は「日毎」に出し、請求書は「月次で合算」して出力したい。

毎日納品をしているが、請求書は1ヶ月にまとめている、そんなビジネスと考えていただいて問題ございません。

 

例:

納品予定日:9/1 受注登録

-レタス100円

-ブロッコリー200円

-にんじん 300円

 

納品予定日:9/15 受注登録

-レタス200円

-れんこん 200円

↓↓↓

9月の最終「合算」請求書

-レタス 300円

-ブロッコリー200円

-にんじん300円

-れんこん200円

合計:1000円

 


kintoneで以下のアプリを作成しています。

①顧客マスタ

②商品単価マスタ

③受注登録アプリ

➔納品書や請求書を出力したい

 

受注登録アプリでは、テーブルを用いて、上記の様に受注した野菜を記録しています。

プリントクリエイター等で帳票を出力すると、「1レコード単位」での帳票(納品書)は作成できるのですが、「月でまとめて合算した請求書」が出力できません。(◯◯月のレコードをまとめて、1つの請求書にできない、という意)

 

逆に、顧客ごとに1ヶ月分まとめて1レコードにいれてしまうと、個別の日毎の納品書が出力できません。

 

カスタマイズは極力割けたいのですが、よいアイデアはありますでしょうか?

複数のレコードをまとめて1つの帳票にしたり、またはとある条件(顧客名☓納品月)で絞って、帳票が出せるか、等も含めて検討したいです。

 

よろしくお願いいたします。

ずいぶん前の投稿ですが、

プリントクリエイターを使い別アプリの複数レコード内サブテーブルを一度に印刷したい。

https://developer.cybozu.io/hc/ja/community/posts/206200386-プリントクリエイターを使い別アプリの複数レコード内サブテーブルを一度に印刷したい 

これがほぼ内容が合致している質問の様に思います。回答では、なにか裏技的なものみたいですが、一応できるみたいですね。

そのうえで、kintoneの中でできるだけ完結するように、解決方法を考えると、

1)サブテーブルを使わない

受注headerと受注detailにAPPを分けて、今、サブテーブルに持っている1行1行を、受注detailに1レコードとして追加。という形を取っておくと、プリントクリエイターで関連レコード的なことが実現できるっぽいので、それで、何とかなりそうかなと。画面の使い勝手は低下すると思います。

2)請求書APPを別途作って、JSカスタマイズ

多分これが一番シンプルなカスタマイズで済むかなと思いますが、請求書APPを別途作り、1請求書あたり、1レコードとします。

請求書作成時には、仕入先、請求日付範囲を指定し、その条件に基づいて、受注登録APPから、全情報を取得、自レコードのサブテーブルに挿入。

あとは、保存して、プリントクリエイターで印刷するだけですね。

3)少しトリッキーですが、受注登録APPでレコード保存するときに、サブテーブルの内容を、別APPに1レコードずつ挿入。

あとは、そのレコードを請求APPから関連レコード的に活用。

4)番外編は請求書の明細は、サブテーブルはあきらめて、受注登録APPの1レコードごとの合計金額をずらっと並べる。

これなら、ノーカスタマイズで行けますが、現実的には難しいかなと。

以上、長々と書きましたが、ご参考になれば幸いです。

返信遅滞し失礼致しました。

検討をしましたが、やはり以下の実装がベストと私も感じました。検討を進めてまいります。

非常に助かります!

 

>2)請求書APPを別途作って、JSカスタマイズ

多分これが一番シンプルなカスタマイズで済むかなと思いますが、請求書APPを別途作り、1請求書あたり、1レコードとします。

請求書作成時には、仕入先、請求日付範囲を指定し、その条件に基づいて、受注登録APPから、全情報を取得、自レコードのサブテーブルに挿入。

改めて相談させてくださいませ。

現在、javascriptを利用して、以下の対応を取ろうと思っているのですが、あとすこしという所で思った動作になりません。

説明がうまくできず恐縮ではございますが、お知恵をお借りできませんでしょうか?

-現状-

1)請求書アプリを作成

※受注登録アプリから、特定の日付のレコード情報+テーブルごと取得

2)取得してきた受注データを、請求書レコードのサブテーブルに格納する

このときの、データを取得してきて、請求書アプリ上でのテーブル操作を行っているのですが、困っています。

取得してきたレコードを、請求書アプリのサブテーブルに格納する際に、

以下の様に実装しているのですが、なぜか、★の部分を走らせた際に、

サブテーブルの全ての項目の日付が変わってしまいます。

本来であれば、

納品日

2017-10-2

2017-10-3

2017-10-5

2017-10-7

2017-10-11

2017-10-31

というものを期待しているのですが、

納品日

2017-10-2

2017-10-31

2017-10-31

2017-10-31

2017-10-31

2017-10-31

となってしまいます。(何故か、1行目のサブテーブルだけ正しく、後は一番"最後の配列"の値が全サブテーブルに適用される。

コンソールで追いかけていると、★が走ったタイミングで、全てのサブテーブルの納品日が更新される(!?)


for (var h = 0; h < resp.totalCount ; h++) {
var orderrecord = resp.records[h].clientorder.value;

for (var i = 0; i < orderrecord.length; i++) {
★tableRecords[rc].value[‘納品日’].value = resp.records[h][‘納品日’].value;
tableRecords[rc].value[‘数量’].value = orderrecord[i].value[‘数量’].value;
tableRecords[rc].value[‘商品名’].value = orderrecord[i].value[‘商品名’].value;
tableRecords[rc].value[‘単価’].value = orderrecord[i].value[‘単価’].value;
tableRecords[rc].value[‘価格’].value = orderrecord[i].value[‘価格’].value;
tableRecords[rc].value[‘お客様名確認’].value = orderrecord[i].value[‘お客様名確認’].value;

rc = rc + 1 ;


□全コードは以下

(function() {
“use strict”;
var eventx = [“app.record.create.submit”];
kintone.events.on(eventx, function(event) {
var appId = 4;
var record = event.record;
var tableRecords = event.record.billingtable.value;
var rc = 0;
var start = event.record[‘集計開始日’].value;
var end = event.record[‘集計終了日’].value;
var clientname = event.record[‘お客様名’].value;
var queryString = ‘納品日 >= "’ + start + ‘" and 納品日 <= "’ + end + ‘" and お客様名 = "’ + clientname + ‘" order by 納品日 asc’;
var totalcountrecord = 0;
console.log(queryString);
return kintone.api(kintone.api.url(‘/k/v1/records’, true), “GET”, {
‘app’: appId,
‘totalCount’: true,
‘query’: queryString
}).then(function(resp) {
for (var f = 0; f < resp.totalCount; f++) {
totalcountrecord = totalcountrecord + resp.records[f].clientorder.value.length;
}
return resp;
}).then(function(resp) {
var newRow = {
id: null,
value: {
納品日: {
type: ‘DATE’,
value: ‘’
},
数量: {
type: ‘NUMBER’,
value: ‘’
},
商品名: {
type: ‘SINGLE_LINE_TEXT’,
value: ‘’
},
単価: {
type: ‘NUMBER’,
value: ‘’
},
価格: {
type: ‘NUMBER’,
value: ‘’
},
お客様名確認: {
type: ‘SINGLE_LINE_TEXT’,
value: ‘’
}
}
};
for (var g = 0; g < totalcountrecord; g++) {
record.billingtable.value.push(newRow);
}
return resp;
}).then(function(resp) {
for (var h = 0; h < resp.totalCount ; h++) {
var orderrecord = resp.records[h].clientorder.value;

for (var i = 0; i < orderrecord.length; i++) {
tableRecords[rc].value[‘納品日’].value = resp.records[h][‘納品日’].value;
tableRecords[rc].value[‘数量’].value = orderrecord[i].value[‘数量’].value;
tableRecords[rc].value[‘商品名’].value = orderrecord[i].value[‘商品名’].value;
tableRecords[rc].value[‘単価’].value = orderrecord[i].value[‘単価’].value;
tableRecords[rc].value[‘価格’].value = orderrecord[i].value[‘価格’].value;
tableRecords[rc].value[‘お客様名確認’].value = orderrecord[i].value[‘お客様名確認’].value;

rc = rc + 1 ;
}
}
return event;
});

});
})();

井領さん

コードをざっと拝見しました。

1.受注レコードを取得

2.totalcountrecord に取得した受注レコードに含まれるサブテーブルの行数合計を格納

3.請求サブテーブルに tablecountrecord 分の空白行を生成( record.billingtable.value.push(newRow) )

4.取得受注レコードループ(& 各受注レコードのサブテーブルループ)をまわしながら、サブテーブルのValueを更新

という流れだと解釈しました。

バグの原因はぱっと見ただけではわからないのですが、プログラムの構造として、行の挿入と値の更新が分かれていることが、原因追及を難しくしている気がします。

1.受注レコードを取得

2.取得受注レコードループ(& 各受注レコードのサブテーブルループ)をまわしながら、行を生成

record.billingtable.value.push(newRow)

という形にすると、構造も単純になりますし、原因もわかりやすくなるかと思います。

var newRow = {
id: null,
value: {
納品日: {
type: 'DATE',
value: ''
},

newrow 生成時に、value に空白を入れていますが、ここに代入したい値を埋め込んでしまうイメージです。

-------

※ 尚、現行構造のまま問題解決を目指す、私なら、最後のループの所で、

tableRecords[rc].value に代入ではなく、

record.billingtable.value に直接代入して、様子を見てみるかなぁと思います(ただの勘です)。

色々外していたらすみません。ご参考になれば幸いです。

 

松村様

 

早急にご回答頂きましてありがとうございました。

当方が説明不足で、色々とわかりにくいところも察していただきましてありがとうございます。

>行の挿入と値の更新が分かれていることが

頂いたアドバイスを元に、

①受注レコード追加

<↓下ループ>

②テーブルに入力

③行追加

<↑ループ>

こちらの処理で問題なく処理が成功しました!

初めてのkintoneテーブル構造で混乱しましたが、大分感覚がつかめました。誠にありがとうございます。

井領さん

おぉ!それはよかったです!