Cloud SQLとWeb Storageを使用した仕訳データ登録サンプル
ここから第2回のサンプルに入っていきますが、サンプルは2つの処理プログラムから構成されます。
1つはクラウドデータベース(MySQL)にある勘定データをWebクライアントのlocalStorageに書き込む処理で、もう一つは書き込まれたローカルの勘定データを使用して仕訳データを登録する処理です。
1 アカウントデータのlocalStorage書き込み
1.1 localStorageアカウント管理画面
図2はlocalStorageアカウント管理の初期表示画面です。この画面では画面上部の4つのボタンが主に使用されます。
図3は右上の「アカウント全件ローカル登録」ボタンをクリックした時の画面表示です。このボタンクリックでクラウド上にあるMySQLからアカウントデータ(勘定コードと勘定科目名のセット)を全件ダウンロードし、ローカルPCにキー・バリュー型データとして書き込みます(Web Storage)。
他に「クラウドアカウント全件参照」ではクラウドMySQLに書き込まれているアカウントデータを全件表示し、「ローカルアカウント全件参照」ではローカルのWeb Storageに書き込まれているアカウントデータの全件表示を行います。また、「ローカルアカウント表示クリア」では画面表示のアカウントデータをクリアします。
1.2 クライアントコード
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>localStorage</title> <script type="text/javascript" src="../jslib/jquery-1.7.2.min.js"></script> <script type="text/javascript"> $(function(){ //(1)このブラウザでWeb Storageが使用可能か確認 if (localStorage){ $("#stat").text("このブラウザはlocalStorage使用可能です。"); }else{ $("#stat").text("このブラウザはlocalStorage使用できません。"); } //(2)以下画面上部のボタンクリックに対応した処理関数呼び出し。 $("#revallcloud").click(revallcloud); $("#addalllocal").click(addalllocal); $("#revalllocal").click(revalllocal); $("#clralllocal").click(clralllocal); }); function revallcloud(){ //(3)クラウドMySQL登録の勘定データ表示 var query = {}; query["mode"] = "getAllAcct"; $.get("/acctsvlt", query, function(json){ //(4) var dat = $.parseJSON(json); //受信データ(勘定データ)をJSオブジェクトに変換 for(var i = 0; i < dat.acct.length; i++){ //ループ処理で受信勘定データを全件表示 var acct_code = dat.acct[i].acct_code; var acct_name = dat.acct[i].acct_name; items.options[items.options.length] = new Option(acct_code+" : "+acct_name, acct_code); //(5)勘定データの全件表示(selectメニューフィールド) } $("#stat").text("クラウド登録 アカウント 参照完了"); }); } function addalllocal(){ //(6)Web Storageを使用して勘定データlocalStorage書き込み var query = {}; query["mode"] = "getAllAcct"; $.get("/acctsvlt", query, function(json){ //クラウドサーバに勘定全件参照リクエスト送信 var dat = $.parseJSON(json); for(var i = 0; i < dat.acct.length; i++){ var acct_code = dat.acct[i].acct_code; var acct_name = dat.acct[i].acct_name; localStorage.setItem(acct_code, acct_name); //(7)勘定データをlocalStorage書込 var acct_name2 = localStorage.getItem(acct_code); //(8)書き込んだローカルの勘定データ読み取り items.options[items.options.length] = new Option(acct_code+" : "+acct_name2, acct_code); //(9)読み取った勘定データの表示 } $("#stat").text("クラウド アカウント ローカル登録完了"); }); } function revalllocal(){ //(10)localStorageの勘定データ全件表示 $("#items").html(""); //(11)画面クリア for (var i = 0; i < localStorage.length; i++) { var acct_code = localStorage.key(i); //(12) var acct_name = localStorage.getItem(acct_code); //(13) items.options[items.options.length] = new Option(acct_code + ":" + acct_name, acct_code); } $("#stat").text("ローカル登録 アカウント 参照完了"); } function delalllocal(){ //(14)表示勘定データの全件クリア for (var i = 0; i < localStorage.length; i++) { var acct_code = localStorage.key(i); localStorage.removeItem(acct_code); //(15) } $("#stat").text("ローカル登録 アカウント 削除完了"); } function clralllocal(){ $("#items").html(""); //selectメニューのオプションフィールドを全件クリア $("#stat").text("表示クリア完了"); } function add() { localStorage.setItem($("#key").val(), $("#val").val()); rev(); } function rev() { $("#items").html(""); for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); var val = localStorage.getItem(key); items.options[items.options.length] = new Option(key+":"+val, key); } } function del() { var items = $("#items")[0]; if (items.selectedIndex < 0){ return; } var selected = items.options[items.selectedIndex].value; localStorage.removeItem(selected); //選択された項目を削除 rev(); } </script> </head> <body> <h2 style="color:#aa0022">localStorageアカウント管理</h2> <div> <input type="button" id="revallcloud" value="クラウドアカウント全件参照 "/> <input type="button" id="addalllocal" value="アカウント全件ローカル登録 "/> </div> <div> <input type="button" id="revalllocal" value="ローカルアカウント全件参照"/> <input type="button" id="clralllocal" value="ローカルアカウント表示クリア"/> </div> ステータス: <span id="stat"></span> <hr/> <select id="items" size="10" style="width: 250px"></select> <hr/> <input type="button" onclick="add()" value="アカウント登録 "/> コード:<input type="text" size="6" id="key"/> アカウント名:<input type="text" size="16" id="val"/> <br/> <input type="button" onclick="del()" value="アカウント削除"/><br/> </body> </html>
画面ロード完了時
リスト2で画面ロード完了後に実行される処理は2種類で、1つは(1)のif文以下で行われる、使用ブラウザのlocalStorage対応確認と、(2)以下での画面上部4種類のボタンクリック時の関数呼び出し定義です。
revallcloud関数
この関数では、(4)の$.getメソッドでクラウドサーバに勘定全件参照リクエストを送信し、レスポンス受信したJSONフォーマットデータをfor文の繰り返し処理で全件表示しています。Cloud SQLを使用する場合も一般的なサーブレットアクセスと変わるところはありません。
複数レコードの参照表示などでは、テーブル構成で表示する場合も多いですが、ここでは(5)でselectメニューへのオプション項目追加形式で表示しており、この方法では各項目の表示処理を1行コードで済ませることができます。
addalllocal関数
この関数での処理内容はrevallcloudとほとんど同じですが(7)と(8)の2行が追加されています。クラウドサーバから受信した勘定コード(acct_code)と勘定名(acct_name)を(7)でlocalStorageに書き込み、(8)で確認のため、書き込まれた勘定名をlocalStorageで読み込んでいる部分だけが追加されています。なお、(9)ではlocalStorageを参照した勘定名を表示するようにしています。
この関数での処理は、クラウド上のデータベースとローカルのWeb Storageの連携準備ということになりますが、このように簡単に行うことができます。
revalllocal関数
(10)のrevalllocal関数では、localStorageに書き込まれた勘定データを全件表示しています。
for文内、(12)のlocalStorage.key(i) でi番目の書込項目キーを取得し、(13)では取得したキーを使用して勘定科目名を取得しています。
delalllocal関数
delalllocal関数の処理手順は、revalllocalと同じですが(15)のremoveItemメソッドで削除しています。
1.3 サーバ側コード
サーバ側コードは、次の仕訳データ登録と同じサーブレットとビーンズが使用されていますので、仕訳データ登録処理手順の後にまとめて紹介します。