MySQLの諸掛登録処理をまとめる

勉強として、フロント：Angular⇒API：Node⇒DB：MySQLの構成になっているWMS(庫内管理システム)の、フロントで入力した諸掛がどうやってテーブルに書き込まれるのかを読み下します。

メインはDB：MySQLの為、フロント&APIはさらっと流します

諸掛：商品売買の際にかかる発送運賃や運送費、 関税などの費用のことをいいます。www.get-boki.com/archives/27/28/000036.html

###〇フロント###

「登録」ボタンを押すと、`onSubmit`がアクティブになります。
For文で諸掛のデータを明細単位に分けて以降の処理を行います。
if文は内部を省略していますが、`Validator`をかけて入力漏れ,入力間違いを確認しています。
`.post`が登録の処理です。

<img width="450" alt="UI画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/74961290-63de-abf6-4735-15c3de4b02c8.png">

`.post`は以下Serviceに記述されています。
ServiceはNodeで書かれたAPIのURL後ろが`/expense`を呼び出しています。

<img width="564" alt="UIサービス.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/fd5bc003-52cd-c874-a2f3-3ab527bc5068.png">

###〇API###

APIのpost処理が記述されている箇所です。
`query`に各項目が格納されています。
`Db.expense.`下にある`insert`へ`query`は引き渡されています

<img width="541" alt="API_insert.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/1b216c44-d415-076f-d726-e7fc86ddafa4.png">

`insert`処理が記述されています。
`values`の中に各値が代入されます。

<img width="376" alt="API_models.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/0b0f7de8-6d53-9aa9-e3ff-62d7d607b6a5.png">

<img width="296" alt="API_insert2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/096d2d1b-0395-c15e-3769-454e809f1ca9.png">

###〇DB###

`Drop...`で前のプロシージャを削除します
複数クエリを実行する為、`DELIMETER`で一時的に区切り文字を//に変更します
()の中で引数を設定、並び順はAPIの`values`に則しています
`BEGIN`~`END`の中に複数のプロシージャを書いて、`DELIMETER`で括ればひとまとめの処理にできます

<img width="218" alt="1_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/e92ef5a7-8d53-06bb-4fc1-d8916701caf8.png">

`DECLARE`を使って変数宣言します

<img width="440" alt="2_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/df63cd81-6536-8044-35c4-abad451b0ab7.png">

例外処理、`SQLEXCEPTION`だった場合で`EXIT`で処理を終了させます。
`SQLEXCEPTION`はSQLSTATEの例外コードが02(データなし).01(警告)以外の場合を意味します。
SQLSTATEとはエラーの属性を表すコードでSQL文の実行後にHADBから返されます、5桁のコードで，先頭2桁がクラス，下3桁がサブクラスです。
`GET DIAGNOSTICS CONDITION 1`でMySQLのエラーコードを取得します
`MYSQL_ERRNO`はエラーコードを示す整数、`RETURNED_SQLSTATE`@はエラーに対応する SQLSTATE 値、`MESSAGE_TEXT`はMySQL 操作のエラーメッセージです。
`ROLLBACK`でそれまでの変更処理を無効にしてトランザクションが実行される前の状態に戻します。
`CALL`で`PS_LOG_ERROR`という外部プロシージャを呼び、エラー情報を"LOG_ERROR"テーブルに残します`COMMIT`で処理を反映させます。
RESIGNAL;で上位の処理に渡します(この場合はNodeに渡します)
`CALL`で`PS_LOG_DEBUG`という外部プロシージャを呼び、情報を"LOG_ALL"テーブルに残し、`committ`して処理を確定させます。

<img width="336" alt="3_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/863283d7-fa82-f5ba-3e95-f59216172bcf.png">

登録可能な月か確認します。
`TA_ACCOUNTBOOK`から`WHERE`条件に該当するレコードを探し、`COUNT`で`rowCountNr`に格納します
`rowCountNr`が0を超える場合、登録可能ではない月の為、`PS_ERROR_RAISE`を呼び出してアラートを上げます。
<img width="301" alt="4_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/cbbb81c8-3d5d-1ef3-4394-5d10ab17a999.png">

`iSALESGROUP_ID`を検索キーにしてMA_SALESGROUPとMA_SALESGROUPからデータを抽出します
`rEXPENSE_ID`には外部シーケンス機能を呼び出して採番します

<img width="328" alt="4.1.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/86458b2d-23c0-cb9f-89b5-c9218ecab457.png">

<img width="261" alt="4.2_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/eec3bc81-bd98-0a95-4880-4de48afd6860.png">

`TA_EXPENSE`に値を追加します。

<img width="180" alt="5_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/671f869f-ab52-2b63-14da-9b1fba0a1127.png">

`CALL`で`PS_LOG_DEBUG`という外部プロシージャを呼び、情報を"LOG_ALL"テーブルに残します
`END`で処理を完了させ、`DELIMITER`の設定を;に戻します。
<img width="209" alt="6_DB.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/56e18380-c0d2-351c-7c8e-8395b2f71211.png">