EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

CSVのエクスポート処理とSQL

今回は、クスパのオンライン決済のプロジェクトの実装で学んだことについてまとめていきます。 テーマは、CSVのエクスポートと出力内容を取得するSQLの内容を振り返りです。

実現したい処理の流れ

簡単に概要ですが、下記のような仕様を実現します。
オンライン決済を利用した先生の振込情報を抽出→期間、振込日、支払状態によってソート→CSVの出力

CSVの出力情報を追加する関するアクション

public class MonthlyPaymentCsvOutputAction {
    protected void output(T form) throws ServerException {
        String fromDate = ((MonthlyPaymentCsvBean) form).getFromDate();
        String toDate = ((MonthlyPaymentCsvBean) form).getToDate();

        //formで入力された情報(日付、振込日、支払状態)を元に、SQLを発行し対象となる振込情報のデータを取得します。
        List<MonthlyPaymentCsvBean> list = CsvUtil.※getMonthlyPaymentCsv(((MonthlyPaymentCsvBean) form).getTransferDate(), ((MonthlyPaymentCsvBean) form).getRevenueStatusKbn(),fromDate,toDate);
        //StringBuilderをインスタンス化し、出力する内容を文字列で追加していく。
        StringBuilder sb = new StringBuilder();
        //見出しとなる情報を追加。
        sb.append("抽出期間 "+ fromDate.substring(0,4) + "/" + fromDate.substring(4,6) +"~" + toDate.substring(0,4) + "/" + toDate.substring(4,6)  ).append("\n");
        sb.append("運営者ID,先生名,先生売上月,銀行名,先生振込月日,売上金額,クスパ決済利用料,振込対象金額,状態" ).append("\n");
        //listで取得した内容をforループで回し、1件毎のデータsbに追加。
        for (MonthlyPaymentCsvBean bean : list) {
            sb.append(bean.getOrganizerId()).append(",");
            sb.append(bean.getTeacherName()).append(",");
            sb.append(bean.getGinkoName()).append(",");
            sb.append(bean.getTransferDate()).append(",");
            省略
        }
        try {
            //文字コードを引数に指定して、バイト形式に変換する。
            buffer = sb.toString().getBytes("windows-31j");
            //文字コードのエンコードがサポートされていない場合に例外をスロー
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

この後、CSVを出力するクラスで呼び出し、ファイルの書き込みが行われ、CSVファイルが 作成される流れになります。 上記でapendしていく処理については、下記の書き方も可能です。

sb.insert(sb.length(),bean.getRevenueAmount()).append(",");

フィードバックを受けて学んだこと

出力条件の指定で、先生の状態によって出力内容を変えるということができていなかったので、 まとめたいと思います。以下のように日付の他にradioボタンの形式で状態(振込の状態を指す)によって、 出力内容を変えることが可能です。

<tr>
    <th>状態</th>
    <td>
        <input type="radio" name="revenueStatusKbn" value="03" checked="checked">未支払い
        <input type="radio" name="revenueStatusKbn" value="01">支払済
        <input type="radio" name="revenueStatusKbn" value="02">未確定
                //全てのvalue属性を空で扱う
        <input type="radio" name="revenueStatusKbn" value="">全て
    </td>
</tr>

ここで、「全て」を選択した場合にSQLで対象のデータを取得するためには、以下のように書くことで 「全て」の条件に合致するデータを拾うことができます。

出力対象のデータを取得するSQLを一部抜粋(※getMonthlyPaymentCsv()の中で利用)

 SELECT
     CSV出力に必要なカラムをviewから取り出す
    FROM
    view_table v
    WHERE
    (v.revenue_status_kbn = /*revenueStatusKbn*/
        OR CAST(/*revenueStatusKbn*/ AS CHARACTER) IS NULL
        OR CAST(/*revenueStatusKbn*/ AS CHARACTER) = ''
    )
)

フォームで渡されてきた値をNULL又は空文字としてキャストすることで、対応できます。 もしくは、「全て」のinputのvalue属性を"00"としてあげて、WHERE句を以下に変更することで目的のデータが取り出せます。

WHERE
(v.revenue_status_kbn = /*revenueStatusKbn*/
        OR /*revenueStatusKbn*/ = '00'
    )

まとめ

以上となりますが、CSVの出力の一連の流れととその過程で学んだSQLの記法について 振り返ってみました。ファイル出力の処理だけでなく、バリデーション、エラー処理、 インポートの処理についても触れることができので、実装の材料として良かったと感じました。