いつもお世話になっております。
sqlで一覧出力したレコードをCSVに出力したいのですが、どのようにしたらいいでしょうか。
イメージとしては下記の「※alasqlで一覧出力するソース」で取得したレコードを下記「※CSV出力コード」で設置したボタンクリックでCSV出力したいと考えています。
「※CSV出力コード」でクエリ等で条件を指定すればいいのだと思いますが、どのように書けばいいのかわかりません。また、レコードも1000件以上あるため、CSV出力時には条件で絞り込まれたレコード全件出力できるようにしたいのです。
どなたかご教示いただけますと幸いです。
※alasqlで一覧出力するソース
////////////////////////////////////////////////////////////////////////////
// kintone JavaScript: Summary of kintone records by alasql.
// 2017.02.14 by rex0220
////////////////////////////////////////////////////////////////////////////
(function() {
"use strict";
// 一覧表示
kintone.events.on("app.record.index.show", function(event) {
if (event.viewId !== ******* ) return event;
var obj = {};
var custApp = 45;
var soshikiApp = 50;
// 経費情報取得
fetchRecords(custApp, '', ['契約No2','経費コード']).then(function(records) {
obj.rs1 = convertToRows(records);
console.log('rs1', JSON.stringify(obj.rs1));
// 契約情報取得
return fetchRecords(event.appId, '', ['ID','契約法人名', '物件名','契約No','リースアップ','契約法人','支払日','リース会社名','リース料_全体','税込リース料_全体','支払備考','締結日','リース開始日','リース満了日','税率','再リース一括']);
}).then(function(records) {
obj.rs2 = convertToRows(records);
console.log('rs2', JSON.stringify(obj.rs2));
// 部署情報取得
return fetchRecords(soshikiApp, '', ['新コード']);
}).then(function(records) {
obj.rs3 = convertToRows(records);
console.log('rs3', JSON.stringify(obj.rs3));
// 経費情報と契約情報をjoin
var result1 =
alasql(
'SELECT orders.[ID], orders.[契約法人名], orders.[物件名], orders.[契約No],orders.[リース料_全体],orders.[税込リース料_全体],orders.[リース会社名],orders.[リースアップ],cust.[契約No2] \
FROM ? AS orders INNER JOIN ? AS cust ON orders.[契約No] = cust.[契約No2] INNER JOIN ? AS soshiki ON cust.[経費コード] = soshiki.[新コード] where length(orders.[リースアップ])=0 AND length(orders.[リース会社名])>0 ORDER BY orders.[契約法人名], orders.[契約No]', [obj.rs2, obj.rs1, obj.rs3]);
console.log('result3', JSON.stringify(result1));
console.log(result1);
// grid 表示
var grid = document.getElementById('リース費用明細');
new Handsontable(grid, {
data: result1,
colWidths: [80, 250, 200,200,120,150,200,100],
colHeaders: ['ID','契約法人名','物件名','契約No','リース料_全体','税込リース料_全体','リース会社名','リースアップ'],
columns: [
{ data: 'ID' },
{ data: '契約法人名' },
{ data: '物件名' },
{ data: '契約No' },
{ data: 'リース料_全体' },
{ data: '税込リース料_全体' },
{ data: 'リース会社名' },
{ data: 'リースアップ' },
],
readOnly: true
});
});
return event;
});
// get records
function fetchRecords(appId, opt_query, opt_fields, opt_offset, opt_limit, opt_records) {
var query = opt_query || '';
var offset = opt_offset || 0;
var limit = opt_limit || 500;
var allRecords = opt_records || [];
var params = {app: appId, query: query + ' limit ' + limit + ' offset ' + offset };
if (opt_fields) params.fields = opt_fields;
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, query, opt_fields, offset + limit, limit, allRecords);
}
return allRecords;
});
}
// records convert to table rows
function convertToRows(records) {
var rows = records.map(function(record){
var keys = Object.keys(record);
var row = {};
keys.map(function(key){
row[key] = record[key].type === 'NUMBER' ? Number(record[key].value) : record[key].value;
});
return row;
});
return rows;
}
})();
※CSV出力コード
(()=>{
'use strict'
//レコード一覧表示
kintone.events.on(['app.record.index.show'], event => {
//メニュー右側を取得
const sp =kintone.app.getHeaderMenuSpaceElement();
//ボタンを作る
const btn = document.createElement('button');
//ボタンに表示したいテキスト
btn.textContent='CSV出力ボタン';
//スペースフィールドにボタンを追加する
sp.appendChild(btn);
//ボタンをクリックしたときの動作
btn.onclick=()=>{
//CSVダウンロード
dlCsv();
}
return event;
});
// CSVファイル生成用
const HEADER =['ID'];//CSVに出力したいフィールドのフィールドコード
// CSVをダウンロード
const dlCsv = async ()=>{
//フィールド名からCSVの文字列データを作る
const setHeaderData = () => {
let headerData = '';
HEADER.forEach(h => {
headerData += h + ',';
});
headerData += '\r';
return headerData;
};
//レコードからCSVの文字列データを作る
const recordToCsvData = records => {
let rowData = '';
records.forEach(r => {
HEADER.forEach(h => {
rowData += r[h].value + ',';
});
rowData += '\r';
});
return rowData;
};
//URLエンコード
const createDataUriFromString = str => {
// 文字列を配列に変換
const array = str.split('').map(s => s.charCodeAt());
// エンコード
const sjis_array = Encoding.convert(array, 'SJIS', 'UNICODE');
const uInt8List = new Uint8Array(sjis_array);
return uInt8List;
};
//2. CSVにしたいレコードを取得する
const param_get = {
app:kintone.app.getId(),
//query:'出力フラグ != 1', // 絞り込みたいときはクエリを書く"出力フラグ = 0" など
};
const obj_get = await kintone.api('/k/v1/records','GET',param_get);
const targetRecords =obj_get.records;
//3. レコード1件以上だったらCSV出力
if (targetRecords.length > 0) {
//4. CSVにするテキストデータを作成
const str = createDataUriFromString( setHeaderData() + recordToCsvData(targetRecords));
//5. CSVファイル作成
const blob = new Blob([str], {type:"text\/csv"});
const url = URL.createObjectURL(blob);
//6. ダウンロード処理
const a = document.createElement("a");
document.body.appendChild(a);
a.download = "test.csv";//ここすきなファイル名に
a.href = url;
a.click();
a.remove();
URL.revokeObjectURL(url);
// // 出力フラグをONにするようなコードはこのへんに
// let param_records = [~,~, ~,~];
// const param_upd = {
// app:kintone.app.getId(),
// records:param_records,
// };
// const obj_put = await kintone.api('/k/v1/records','PUT',param_upd);
}
}
})();