part2に引き続きWebアプリの作成をしていきたいと思います!!
前回までの作業は下記を参考に。
elsammit-beginnerblg.hatenablog.com
今回は、サーバサイドでのDBへのデータRead/Write部分についてです。
DBですが、"役職データ"と"会議毎の情報"の2つのテーブルを用意しました。
各テーブルですがこのようにしました!!
※各役職毎に人数を登録しておくのはセンスなかったかな。。。
次にサーバサイドでの"役職データ"と"会議毎の情報"テーブルへの登録です。
今回DBはsqlite3を用いたため、こちらを宣言します。
※DB名は"database.sqlite3"としました。
const sqlite = require('sqlite3').verbose(); const db = new sqlite.Database('db/database.sqlite3');
"会議毎の情報"テーブルへの登録は、
function Set_MeetingList(SumSalary,Manager_mem,gl_mem,cheif_mem,employ_mem,Meeting_time,Meeting_Name){ const Set_MeetingMoney = "insert into MeetingList values(current_timestamp,'" + Meeting_Name + "'," + SumSalary + "," + Manager_mem + "," + gl_mem + "," + cheif_mem + "," + employ_mem + ",'" + Meeting_time.toString() + "');" db.get(Set_MeetingMoney, function (err, rows) { console.log("Set OK"); }); }
とし、insert intoで登録されたデータを蓄積するようにしました。
次に"役職データ"ですが、各役職毎に同じ月給を毎回登録するのは処理として無駄であるため、
登録された月給とは異なる月給であった場合にのみテーブルに登録するようにしました。
function Set_Memsalary(intput_salary){ p = Read_Memsalary(); var i =0; p.then(function(Mem_array){ Mem_array.forEach(function(array){ if(array.salary != intput_salary[i]){ SubSet_Memsalary(array.name,intput_salary[i]); } i++; }); }); } function SubSet_Memsalary(input_name,input_salary){ const Set_Memsalary = "update salary set salary ="+ input_salary + " where name = '" + input_name +"';"; db.get(Set_Memsalary,function(err,res){ console.log("set OK"); }); }
最後に、Webアプリ立ち上げ時に各役職毎の月給を初期値として登録するのだが、
テーブルへのRead処理は、
function Set_Memsalary(intput_salary){ p = Read_Memsalary(); var i =0; p.then(function(Mem_array){ Mem_array.forEach(function(array){ if(array.salary != intput_salary[i]){ SubSet_Memsalary(array.name,intput_salary[i]); } i++; }); }); } function Read_Memsalary(){ return new Promise(resolve =>{ const GetMemSalary = "select * from salary;" var Mem_array = [] db.all(GetMemSalary, function (err, rows) { rows.forEach(function(row){ Mem_array.push({name:row.name,salary:row.salary}); }); resolve(Mem_array); }); }); }
です。
nodejsの仕様なのか、expressの仕様なのか関数コール時に並列処理となってしまうため、
"new Promise"、".then"を用いました。
また、テーブルからselect fromで読み出す際には、"db.all"にする必要があります。
db.allから得られたデータ群をforEachにより分離して配列に登録する流れです。
以上、part2~part3でサーバサイド側の処理の報告でした。
ソースコードはこちらに格納しています。
github.com
次はレイアウト整えて見栄えよくしようかな?
せっかくDBに会議データを保存しているから集計結果の可視化をやろうかな?
。。。やりたいことが多いw