1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DataTablesの活用 ‐ 機能的なテーブルの作成

Last updated at Posted at 2022-01-21

これまでにも何度か JavaScript ライブラリーの活用に関する記事を投稿してきましたが、今回は jQuery のプラグインである DataTables を使って、機能的なテーブルを作成しようと思います。

1. 事前準備

1-1. ライブラリーの配置

DataTables を活用するためには、Yellowfin がアクセスできる場所にライブラリーを配置する必要があります。DataTables にアクセスして、[Download] と進みます。Download ページでは「Step 1. Choose a styling framework」と「Step 2. Select packages」でそれぞれ DataTables を選択し、「Step 3. Pick a download method」でライブラリーの入手方法を選択します。インターネットに接続できる環境であれば CDN を参照しても構いません。以下の手順では、ファイルをダウンロードして、サーバー上に保管する手順で説明します。

ダウンロードしたファイルの中から、datatables.min.css と datatables.min.js を Yellowfin サーバーの以下ディレクトリに配置します。これで、Yellowfin がライブラリーを参照できるようになります。
(Yellowfin)/appserver/webapps/ROOT/js/chartingLibraries/datatables/

1-2. JavaScript グラフの有効化

JavaScript グラフを作成するためには、いくつか Yellowfin サーバーで事前設定が必要です。必要な設定内容に関しては、以下Wikiの情報を参考にしてください。
https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2293926

2. データの準備

ライブラリーを配置し、JavaScript グラフを有効化したら、早速グラフの作成段階に進みます。以下の手順では、Yellowfin インストール時に規定でインストールされる Ski Team のデータとビューを利用します。

レポートを新規で作成し、Ski Team ビューを選択します。

[グラフ] ステップで、軸に [Invoiced Date] と [Athlete Region]、集計値に [Invoiced Amount] と [Invoice Estimate] と [Profit Margin] をそれぞれ選択します。ここで選ぶ項目は特に後続の手順に影響するものではないので、どの項目を選んでいただいても大丈夫です。
image.png

3. グラフの作成

[グラフ] ステップに進み、画面右側 [グラフの選択] から [JavaScriptグラフ] を選択します。
image.png

JavaScript タブ

雛形を全て削除し、以下のコードに置き換えます。コードの処理の内容は後ほど説明します。

JS
generateChart = function(options) {
   var $chartDrawDiv = $(options.divSelector);
   var height = options.dataset.chart_information.height;
   var width = options.dataset.chart_information.width;
   var processedData = processData(options.dataset.data);
   doDrawing(processedData, $chartDrawDiv, height, width, options.errorCallback);
},

processData = function(dataset) {
    data=[]
    for (i=0;i<dataset['invoiced_amount'].length;i++){
       data.push([dataset['invoiced_date'][i].formatted_data,
        dataset['athlete_region'][i].formatted_data,
        dataset['invoiced_amount'][i].formatted_data,
        dataset['invoice_estimate'][i].formatted_data,
        dataset['profit_margin'][i].formatted_data])
        
    }
    return data
},

doDrawing = function(data, $chartDiv, height, width, errorFunction) {
   require(['https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js'], function() {
    $chartDiv.append('<table id="skiteam" class="display" width="100%"></table>');
    $("#skiteam").DataTable( {
        data: data,
        columns: [
            { title: "日付" },
            { title: "地域" },
            { title: "実績" },
            { title: "予算" },
            { title: "利益" }
        ],
        order: [[ 0, "asc" ]],
        "bSortClasses": false,
        columnDefs: [
            {
                targets: -1,
                className: 'dt-body-right'
            }
        ],
        language: {
        	"sProcessing":   "処理中...",
        	"sLengthMenu":   "_MENU_ 件表示",
        	"sZeroRecords":  "データはありません。",
        	"sInfo":         " _TOTAL_ 件中 _START_ から _END_ まで表示",
        	"sInfoEmpty":    " 0 件中 0 から 0 まで表示",
        	"sInfoFiltered": "(全 _MAX_ 件より抽出)",
        	"sInfoPostFix":  "",
        	"sSearch":       "検索:",
        	"sUrl":          "",
        	"oPaginate": {
        		"sFirst":    "先頭",
        		"sPrevious": "",
        		"sNext":     "",
        		"sLast":     "最終"
        	}
        }
    });
   });
}
CSSタブ

datatables.min.css の内容を全てコピーして貼り付けます。
なお、css ファイルの中身は改行もインデントも施されていないので、見やすくするためには、コードの整形を行うサイトなどを利用すると便利です。私は下記のサイトを利用しました。
https://lab.syncer.jp/Tool/CSS-PrettyPrint/
image.png

[プレビュー] に移り、どのようなチャートが作成されるか見てみます。検索窓で文字列検索ができたり、表示件数を調整できたりと、それなりに使いやすいテーブルが出来上がりました。
image.png

4. コードの説明

ここでコードの説明に移ります。

generateChart

JavaScript グラフの中で最初に呼び出されるのが generateChart です。この中で、チャートを描画する div を選択し、高さや幅に関する変数を扱います。また、データ処理を行う processedData 関数と 描画を行う doDrawing 関数を呼び出します。

generateChart
generateChart = function(options) {
   var $chartDrawDiv = $(options.divSelector);
   var height = options.dataset.chart_information.height;
   var width = options.dataset.chart_information.width;
   var processedData = processData(options.dataset.data);
   doDrawing(processedData, $chartDrawDiv, height, width, options.errorCallback);
},
processedData

processedData 関数の for 文の中で Yellowfin のデータセットを配列にして data に格納しています。

processedData
processData = function(dataset) {
    data=[]
    for (i=0;i<dataset['invoiced_amount'].length;i++){
       data.push([dataset['invoiced_date'][i].formatted_data,
        dataset['athlete_region'][i].formatted_data,
        dataset['invoiced_amount'][i].formatted_data,
        dataset['invoice_estimate'][i].formatted_data,
        dataset['profit_margin'][i].formatted_data])
        
    }
    return data
},
doDrawing

Require の中で、datatables.min.js ライブラリーの場所を指定します。今回であれば、『1.1 ライブラリーの配置』 手順で plotly-2.8.3.min.js を保管したディレクトリを相対パスで指定します。インターネットにつながる環境であれば、CDN の URL を指定することも可能です。
$chartDiv.append('<table id="skiteam" class="display" width="100%"></table>') でテーブルを描画するための HTML タグを指定し、ここで指定した id を下の行 $("#skiteam").DataTable で呼び出し、テーブルに data の中身を展開します。
columns: の中で、テーブルヘッダーの名称を指定します。
order: [[ 0, "asc" ]], で既定の並びを1列目の昇順としています。ソート列は複数指定も可能です。詳細はこちらでご確認ください。
language: の中で、画面上の表記を日本語化しています。なお、インターネット上の JSON ファイルを直接指定することも可能です。
その他にも、様々なオプションの指定が可能です。詳しくは、DataTables のサイトでご確認ください。

doDrawing
doDrawing = function(data, $chartDiv, height, width, errorFunction) {
   require(['https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js'], function() {
    $chartDiv.append('<table id="skiteam" class="display" width="100%"></table>');
    $("#skiteam").DataTable( {
        data: data,
        columns: [
            { title: "日付" },
            { title: "地域" },
            { title: "実績" },
            { title: "予算" },
            { title: "利益" }
        ],
        order: [[ 0, "asc" ]],
        "bSortClasses": false,
        columnDefs: [
            {
                targets: -1,
                className: 'dt-body-right'
            }
        ],
        language: {
        	"sProcessing":   "処理中...",
        	"sLengthMenu":   "_MENU_ 件表示",
        	"sZeroRecords":  "データはありません。",
        	"sInfo":         " _TOTAL_ 件中 _START_ から _END_ まで表示",
        	"sInfoEmpty":    " 0 件中 0 から 0 まで表示",
        	"sInfoFiltered": "(全 _MAX_ 件より抽出)",
        	"sInfoPostFix":  "",
        	"sSearch":       "検索:",
        	"sUrl":          "",
        	"oPaginate": {
        		"sFirst":    "先頭",
        		"sPrevious": "",
        		"sNext":     "",
        		"sLast":     "最終"
        	}
        }
    });
   });
}
CSS の修正

既定の CSS を直接修正することでもデザインの変更は可能ですが、手っ取り早いのはデザイン行を追加して、既定の設定をオーバーライドすることです。CSS タブの最終行に、以下の行を追加します。

CSS
table th, td {
    border: 1px solid #8fbc8f;
}
#skiteam thead tr{
    background-color:   #8fbc8f;
    color:              #ffffff;
}
#skiteam tbody tr.odd{
    background-color: #eeeeee;
}
#skiteam tbody tr.even{
    background-color: #c3f0dd;
}

td:nth-of-type(3) {text-align:right}
td:nth-of-type(4) {text-align:right}
td:nth-of-type(5) {text-align:right}

ついでに、JavaScript タブの $("#skiteam").DataTable({}) の中に "bSortClasses": false, を1行追加します。

JS
$("#skiteam").DataTable( {
    "bSortClasses": false,

背景色や罫線の色を変更し、数値セルを右寄せすることで、以下のようなデザインに変更しました。
image.png

棒グラフや散布図などを使ってデータを可視化することで、分析はとても効率よくなります。
一方で、テーブルチャートが最も多くのデータをまとめて確認することができるため、現場ではテーブルが多用されることも事実です。
是非、DataTable などのライブラリと Yellowfin を併用し、分析に適したテーブルを作成してみてください。

For your awesome data analytical experience with Yellowfin! Cheers!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?