家計簿アプリを作成する⑩【家計簿一覧画面(DB処理)】

Python

家計簿一覧画面(DB処理)

家計簿一覧画面のDB処理

HAB_List_Adapterクラス

概要

HAB_List_Adapterクラスは自作Enginクラスを継承している

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...
家計簿一覧取得

初期表示の場合、操作時の年月
家計簿一覧画面(UI)の一覧変更ボタンを選択した場合、選択した年月
を家計簿一覧画面から受け取り
・受け取った年月の家計簿一覧の取得
・ログ出力
を行う

【ログ出力】
・メソッド開始時とメソッド終了時logテーブルに処理内容をINSERTする
ログ出力時に例外エラーが発生した場合、ログ出力時例外エラー用メッセージを家計簿一覧画面に返却する

log_seqlog_kindsfunction_idlog_detailuser_idoperate_at
1421SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 取得 件test012025-09-06 16:12:39
1422EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 取得 0件test012025-09-06 16:12:39
1431SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-08 取得 件test012025-09-06 16:16:06
1432EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-08 取得 3件test012025-09-06 16:16:06
1437SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 取得 件test012025-09-06 16:16:09
1438EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 取得 0件test012025-09-06 16:16:09
1443SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-10 取得 件test012025-09-06 16:16:10
1444EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-10 取得 0件test012025-09-06 16:16:10
1449SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2026-11 取得 件test012025-09-06 16:16:17
1450EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2026-11 取得 0件test012025-09-06 16:16:17
1457SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 取得 件test012025-09-06 16:38:31
1458WI-SEL-HAB_DETAILAttributeError(“type object ‘HAB_Detail’ has no attribute ‘HAB_seqtest'”)test012025-09-06 16:38:31

【例外エラー】
ログ出力以外で例外エラーが発生した場合
例外エラー用メッセージを家計簿一覧画面(UI)に返却する
(例外エラー用メッセージ内容は「家計簿アプリを作成する③【SQLAlchemyのEngineを作成】」のMessageクラスを参照)

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...

【家計簿一覧の取得】
家計簿一覧の取得に成功した場合
取得した家計簿一覧を家計簿一覧画面(UI)に返却する

入出金区分円グラフデータ取得

初期表示の場合、操作時の年月
家計簿一覧画面(UI)の一覧変更ボタンを選択した場合、選択した年月
を家計簿一覧画面から受け取り
受け取った年月の入出金区分円グラフデータの取得
・ログ出力
を行う

入出金区分円グラフデータ
家計簿詳細からマスタに登録されている入出金区分ごとの家計簿一覧の合計値を取得し、家計簿一覧画面(UI)に返却する

【ログ出力】
・メソッド開始時とメソッド終了時logテーブルに処理内容をINSERTする
ログ出力時に例外エラーが発生した場合、ログ出力時例外エラー用メッセージを家計簿一覧画面に返却する

log_seqlog_kindsfunction_idlog_detailuser_idoperate_at
1423SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 入出金円グラフデータ 取得test012025-09-06 16:12:39
1424EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 入出金円グラフデータ 取得test012025-09-06 16:12:39
1433SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-08 入出金円グラフデータ 取得test012025-09-06 16:16:06
1434EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-08 入出金円グラフデータ 取得test012025-09-06 16:16:06
1439SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 入出金円グラフデータ 取得test012025-09-06 16:16:09
1440EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 入出金円グラフデータ 取得test012025-09-06 16:16:09
1445SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-10 入出金円グラフデータ 取得test012025-09-06 16:16:10
1446EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-10 入出金円グラフデータ 取得test012025-09-06 16:16:10
1451SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2026-11 入出金円グラフデータ 取得test012025-09-06 16:16:17
1452EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2026-11 入出金円グラフデータ 取得test012025-09-06 16:16:17
1463SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 入出金円グラフデータ 取得test012025-09-07 14:36:13
1464WI-SEL-HAB_DETAILAttributeError(“type object ‘Master’ has no attribute ‘m_idtest'”)test012025-09-07 14:36:13
1647SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 入出金円グラフデータ 取得admin2025-09-07 16:36:29
1648EI-SEL-HAB_DETAIL家計簿一覧 master:HAB_kbn 入出金円グラフデータ 取得失敗admin2025-09-07 16:36:29

【例外エラー】
ログ出力以外で例外エラーが発生した場合
例外エラー用メッセージを家計簿一覧画面(UI)に返却する
(例外エラー用メッセージ内容は「家計簿アプリを作成する③【SQLAlchemyのEngineを作成】」のMessageクラスを参照)

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...
詳細種類円グラフデータ取得

初期表示の場合、操作時の年月
家計簿一覧画面(UI)の一覧変更ボタンを選択した場合、選択した年月
を家計簿一覧画面から受け取り
受け取った年月の詳細種類円グラフデータの取得
・ログ出力
を行う

詳細種類円グラフデータ
家計簿詳細からマスタに登録されている詳細種類ごとの家計簿一覧の合計値を取得し、家計簿一覧画面(UI)に返却する

【ログ出力】
・メソッド開始時とメソッド終了時logテーブルに処理内容をINSERTする
ログ出力時に例外エラーが発生した場合、ログ出力時例外エラー用メッセージを家計簿一覧画面に返却する

log_seqlog_kindsfunction_idlog_detailuser_idoperate_at
1471SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 詳細種類円グラフデータ 取得test012025-09-07 15:23:57
1472EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 詳細種類円グラフデータ 取得test012025-09-07 15:23:57
1481SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-08 詳細種類円グラフデータ 取得test012025-09-07 15:24:00
1482EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-08 詳細種類円グラフデータ 取得test012025-09-07 15:24:00
1487SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 詳細種類円グラフデータ 取得test012025-09-07 15:24:01
1488EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 詳細種類円グラフデータ 取得test012025-09-07 15:24:01
1493SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-10 詳細種類円グラフデータ 取得test012025-09-07 15:24:02
1494EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-10 詳細種類円グラフデータ 取得test012025-09-07 15:24:02
1499SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2026-10 詳細種類円グラフデータ 取得test012025-09-07 15:24:12
1500EI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2026-10 詳細種類円グラフデータ 取得test012025-09-07 15:24:12
1509SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 詳細種類円グラフデータ 取得test012025-09-07 15:29:50
1510WI-SEL-HAB_DETAILAttributeError(“type object ‘Master’ has no attribute ‘m_idtest'”)test012025-09-07 15:29:50
1655SI-SEL-HAB_DETAIL家計簿一覧 HAB_detail:2025-09 詳細種類円グラフデータ 取得test012025-09-07 17:20:10
1656EI-SEL-HAB_DETAIL家計簿一覧 master:HABkinds 詳細種類円グラフデータ 取得失敗test012025-09-07 17:20:10

【例外エラー】
ログ出力以外で例外エラーが発生した場合
例外エラー用メッセージを家計簿一覧画面(UI)に返却する
(例外エラー用メッセージ内容は「家計簿アプリを作成する③【SQLAlchemyのEngineを作成】」のMessageクラスを参照)

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...
家計簿登録

家計簿詳細を家計簿一覧画面(UI)から受け取り
受け取った家計簿詳細の新規登録
・ログ出力
を行う

家計簿詳細の新規登録
家計簿一覧画面(UI)から受け取った新規登録の行データを家計簿詳細に登録する

HAB_seqHAB_kbnHAB_atamountHABkindsHABdetaildel_flgentry_user_identry_atupdate_user_idupdate_atupdate_version
20in2025-09-10 0:00:001000048月分給与0test012025-09-10 21:31:51NULLNULL0
21out2025-09-09 1:02:0010001昼食0test012025-09-10 21:32:29NULLNULL0

【ログ出力】
・メソッド開始時とメソッド終了時logテーブルに処理内容をINSERTする
ログ出力時に例外エラーが発生した場合、ログ出力時例外エラー用メッセージを家計簿一覧画面に返却する

log_seqlog_kindsfunction_idlog_detailuser_idoperate_at
1661SI-INS-HAB_DETAIL家計簿一覧 HAB_detail:2025-09-10 00:00 追加test012025-09-10 21:31:51
1662EI-INS-HAB_DETAIL家計簿一覧 HAB_detail:2025-09-10 00:00 追加test012025-09-10 21:31:51

【例外エラー】
ログ出力以外で例外エラーが発生した場合
例外エラー用メッセージを家計簿一覧画面(UI)に返却する
(例外エラー用メッセージ内容は「家計簿アプリを作成する③【SQLAlchemyのEngineを作成】」のMessageクラスを参照)

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...
ソースコード
from sqlalchemy import select, and_, func, case
from sqlalchemy.orm import aliased
from db.models import HAB_Detail, Master
from db.common.engine import Engine, Return_Info


# 家計簿詳細テーブル接続
class HAB_List_Adapter(Engine):
    def __init__(self):
        super().__init__()
        # 画面名を設定
        self.display_name = self.const.Display.HAB_LIST  # 家計簿一覧

    # 家計簿一覧取得
    def fill_HAB_list(self, arg_where_year_month, arg_user_id):
        """
        家計簿一覧を取得する
        引数
            arg_where_year_month:検索条件
            arg_user_id:操作ユーザー
        """
        # 返却用クラスをインスタンス化
        return_HAB_list = Return_Info()
        # ログ出力のfunction_idを作成
        str_log_function_id = self.message.Log_Function_Id.id.format(
            self.const.Log_Kinds.INFO,
            self.const.Log_Process.SELECT,
            self.const.Log_Function.HAB_DETAIL,
        )
        # STARTログ出力
        error_message = self.create_log(
            self.const.Log_Kinds.START,
            str_log_function_id,
            self.message.Log_Message.FILL.format(
                self.display_name,
                self.const.Table_Name.HAB_DETAIL,
                arg_where_year_month,
                self.const.Const_Text.TEXT_BLANK,
            ),
            arg_user_id,
        )
        # STARTログ出力失敗の場合
        if error_message != None:
            # 返却用のメッセージボックスに例外エラーメッセージを代入する
            return_HAB_list.return_message_box = error_message
            return return_HAB_list
        else:
            try:
                # 家計簿一覧を取得するSELECT文を作成する
                # マスタテーブルを別名で定義する
                Master1 = aliased(Master)
                Master2 = aliased(Master)
                stmt = (
                    select(
                        HAB_Detail.HAB_seq,
                        HAB_Detail.HAB_at,
                        Master1.m_text.label("HAB_kbn"),
                        HAB_Detail.amount,
                        Master2.m_text.label("HABkinds"),
                        HAB_Detail.HABdetail,
                    ).select_from(HAB_Detail)
                    # マスタテーブルと結合する
                    .join(
                        Master1,
                        onclause=and_(
                            HAB_Detail.HAB_kbn == Master1.m_code,
                            Master1.m_id == "HAB_kbn",
                            Master1.del_flg == "0",
                        ),
                    )
                    # マスタテーブルと結合する
                    .join(
                        Master2,
                        onclause=and_(
                            HAB_Detail.HABkinds == Master2.m_code,
                            Master2.m_id == "HABkinds",
                            Master2.del_flg == "0",
                        ),
                    )
                    # Where句に引数の検索条件を設定する
                    .where(
                        HAB_Detail.HAB_at.like(f"{arg_where_year_month}%"),
                        HAB_Detail.del_flg == self.const.Del_flg.NON_DELETE,
                    )
                    # 並び順を設定する
                    .order_by(
                        HAB_Detail.HAB_at,
                        HAB_Detail.HAB_kbn,
                        HAB_Detail.amount,
                        HAB_Detail.HABkinds,
                    )
                )
                # SELECT文を全件取得で実行する
                select_row = self.session.execute(stmt).all()
                # 返却用の返却行に取得した家計簿一覧を代入する
                return_HAB_list.return_row = select_row
                # ENDログ出力
                error_message = self.create_log(
                    self.const.Log_Kinds.END,
                    str_log_function_id,
                    self.message.Log_Message.FILL.format(
                        self.display_name,
                        self.const.Table_Name.HAB_DETAIL,
                        arg_where_year_month,
                        len(select_row),
                    ),
                    arg_user_id,
                )
                # ENDログ出力失敗の場合
                if error_message != None:
                    # 返却用のメッセージボックスに例外エラーメッセージを代入する
                    return_HAB_list.return_message_box = error_message
                    return return_HAB_list
                else:
                    return return_HAB_list
            except Exception as e:
                # 例外エラー用メッセージ作成
                return_HAB_list.return_message_box = self.exception_log(
                    str_log_function_id, e, arg_user_id
                )
                return return_HAB_list
            finally:
                # セッションを閉じる
                self.session.close()

    # 入出金円グラフデータ取得
    def fill_HAB_kbn_PieChart_data(self, arg_where_year_month, arg_user_id):
        """
        入出金円グラフデータを取得する
        引数
            arg_where_year_month:検索条件
            arg_user_id:操作ユーザー
        """
        # 返却用クラスをインスタンス化
        return_HAB_kbn_PieChart_data = Return_Info()
        # ログ出力のfunction_idを作成
        str_log_function_id = self.message.Log_Function_Id.id.format(
            self.const.Log_Kinds.INFO,
            self.const.Log_Process.SELECT,
            self.const.Log_Function.HAB_DETAIL,
        )
        # STARTログ出力
        error_message = self.create_log(
            self.const.Log_Kinds.START,
            str_log_function_id,
            self.message.Log_Message.FILL_HAB_kbn_PIECHART.format(
                self.display_name,
                self.const.Table_Name.HAB_DETAIL,
                arg_where_year_month,
            ),
            arg_user_id,
        )
        # STARTログ出力失敗の場合
        if error_message != None:
            # 返却用のメッセージボックスに例外エラーメッセージを代入する
            return_HAB_kbn_PieChart_data.return_message_box = error_message
            return return_HAB_kbn_PieChart_data
        else:
            try:
                # 入出金区分を取得するSELECT文を作成
                HAB_kbn_stmt = select(Master).where(
                    Master.m_id == self.const.Master_ID.HAB_kbn,
                )
                # SELECT文を全件取得で実行する
                select_HAB_kbn_row = self.session.scalars(HAB_kbn_stmt).all()
                if len(select_HAB_kbn_row) == 0:
                    # 返却用のメッセージボックスにIDとメッセージ内容を代入する
                    return_HAB_kbn_PieChart_data.return_message_box.message_id = (
                        "HAB003W"
                    )
                    return_HAB_kbn_PieChart_data.return_message_box.message_text = (
                        self.message.Message_Box.HAB003W
                    )
                    # ENDログ出力
                    error_message = self.create_log(
                        self.const.Log_Kinds.END,
                        str_log_function_id,
                        self.message.Log_Message.FILL_HAB_kbn_PIECHART_ERROR.format(
                            self.display_name,
                            self.const.Table_Name.MASTER,
                            self.const.Master_ID.HAB_kbn,
                        ),
                        arg_user_id,
                    )
                    # ENDログ出力失敗の場合
                    if error_message != None:
                        # 返却用のメッセージボックスに例外エラーメッセージを代入する
                        return_HAB_kbn_PieChart_data.return_message_box = error_message
                        return return_HAB_kbn_PieChart_data
                    else:
                        return return_HAB_kbn_PieChart_data
                else:
                    # 入出金円グラフデータを取得するSELECT文を作成する
                    # 副問い合わせ
                    sub_stmt = (
                        select(
                            Master.m_code.label("m_code"), Master.m_text.label("m_text")
                        )
                        .select_from(Master)
                        .where(
                            Master.m_id == self.const.Master_ID.HAB_kbn,
                        )
                        .subquery("master")
                    )
                    case_list = []
                    for HAB_kbn_row in select_HAB_kbn_row:
                        case_list.append(
                            (
                                sub_stmt.c.m_code == HAB_kbn_row.m_code
                                and HAB_Detail.HAB_kbn == HAB_kbn_row.m_code,
                                HAB_Detail.amount,
                            )
                        )
                    # 主問い合わせ
                    stmt = (
                        select(
                            sub_stmt.c.m_code,
                            sub_stmt.c.m_text,
                            func.coalesce(
                                func.sum(
                                    case(*case_list),
                                ),
                                0,
                            ).label("amount"),
                        )
                        .select_from(sub_stmt)
                        # マスタテーブルと結合する
                        .outerjoin(
                            HAB_Detail,
                            onclause=and_(
                                sub_stmt.c.m_code == HAB_Detail.HAB_kbn,
                                HAB_Detail.HAB_at.like(
                                    f"{arg_where_year_month}%",
                                ),
                                HAB_Detail.del_flg == self.const.Del_flg.NON_DELETE,
                            ),
                        )
                        .group_by(sub_stmt.c.m_text)
                    )
                    # SELECT文を全件取得で実行する
                    select_row = self.session.execute(stmt).all()
                    # 返却用の返却行に取得した家計簿一覧を代入する
                    return_HAB_kbn_PieChart_data.return_row = select_row
                    # ENDログ出力
                    error_message = self.create_log(
                        self.const.Log_Kinds.END,
                        str_log_function_id,
                        self.message.Log_Message.FILL_HAB_kbn_PIECHART.format(
                            self.display_name,
                            self.const.Table_Name.HAB_DETAIL,
                            arg_where_year_month,
                        ),
                        arg_user_id,
                    )
                    # ENDログ出力失敗の場合
                    if error_message != None:
                        # 返却用のメッセージボックスに例外エラーメッセージを代入する
                        return_HAB_kbn_PieChart_data.return_message_box = error_message
                        return return_HAB_kbn_PieChart_data
                    else:
                        return return_HAB_kbn_PieChart_data
            except Exception as e:
                # 例外エラー用メッセージ作成
                return_HAB_kbn_PieChart_data.return_message_box = self.exception_log(
                    str_log_function_id, e, arg_user_id
                )
                return return_HAB_kbn_PieChart_data
            finally:
                # セッションを閉じる
                self.session.close()

    # 詳細種類円グラフデータ取得
    def fill_HABkinds_PieChart_data(self, arg_where_year_month, arg_user_id):
        """
        詳細種類グラフデータを取得する
        引数
            arg_where_year_month:検索条件
            arg_user_id:操作ユーザー
        """
        # 返却用クラスをインスタンス化
        return_HABkinds_PieChart_data = Return_Info()
        # ログ出力のfunction_idを作成
        str_log_function_id = self.message.Log_Function_Id.id.format(
            self.const.Log_Kinds.INFO,
            self.const.Log_Process.SELECT,
            self.const.Log_Function.HAB_DETAIL,
        )
        # STARTログ出力
        error_message = self.create_log(
            self.const.Log_Kinds.START,
            str_log_function_id,
            self.message.Log_Message.FILL_HABkinds_PIECHART.format(
                self.display_name,
                self.const.Table_Name.HAB_DETAIL,
                arg_where_year_month,
            ),
            arg_user_id,
        )
        # STARTログ出力失敗の場合
        if error_message != None:
            # 返却用のメッセージボックスに例外エラーメッセージを代入する
            return_HABkinds_PieChart_data.return_message_box = error_message
            return return_HABkinds_PieChart_data
        else:
            try:
                # 詳細種類を取得するSELECT文を作成
                HABkinds_stmt = select(Master).where(
                    Master.m_id == self.const.Master_ID.HABkinds
                )
                # SELECT文を全件取得で実行する
                select_HABkinds_row = self.session.scalars(HABkinds_stmt).all()
                if len(select_HABkinds_row) == 0:
                    # 返却用のメッセージボックスにIDとメッセージ内容を代入する
                    return_HABkinds_PieChart_data.return_message_box.message_id = (
                        "HAB003W"
                    )
                    return_HABkinds_PieChart_data.return_message_box.message_text = (
                        self.message.Message_Box.HAB003W
                    )
                    # ENDログ出力
                    error_message = self.create_log(
                        self.const.Log_Kinds.END,
                        str_log_function_id,
                        self.message.Log_Message.FILL_HABkinds_PIECHART_ERROR.format(
                            self.display_name,
                            self.const.Table_Name.MASTER,
                            self.const.Master_ID.HABkinds,
                        ),
                        arg_user_id,
                    )
                    # ENDログ出力失敗の場合
                    if error_message != None:
                        # 返却用のメッセージボックスに例外エラーメッセージを代入する
                        return_HABkinds_PieChart_data.return_message_box = error_message
                        return return_HABkinds_PieChart_data
                    else:
                        return return_HABkinds_PieChart_data
                else:
                    # 入出金円グラフデータを取得するSELECT文を作成する
                    # 副問い合わせ
                    sub_stmt = (
                        select(
                            Master.m_code.label("m_code"), Master.m_text.label("m_text")
                        )
                        .select_from(Master)
                        .where(
                            Master.m_id == self.const.Master_ID.HABkinds,
                        )
                        .subquery("master")
                    )
                    case_list = []
                    for HABkinds_row in select_HABkinds_row:
                        case_list.append(
                            (
                                sub_stmt.c.m_code == HABkinds_row.m_code
                                and HAB_Detail.HAB_kbn == HABkinds_row.m_code,
                                HAB_Detail.amount,
                            )
                        )
                    # 主問い合わせ
                    stmt = (
                        select(
                            sub_stmt.c.m_code,
                            sub_stmt.c.m_text,
                            func.coalesce(
                                func.sum(
                                    case(*case_list),
                                ),
                                0,
                            ).label("amount"),
                        )
                        .select_from(sub_stmt)
                        # マスタテーブルと結合する
                        .outerjoin(
                            HAB_Detail,
                            onclause=and_(
                                sub_stmt.c.m_code == HAB_Detail.HABkinds,
                                HAB_Detail.HAB_at.like(f"{arg_where_year_month}%"),
                                HAB_Detail.HAB_kbn == self.const.HAB_kbn_code.kbn_out,
                                HAB_Detail.del_flg == self.const.Del_flg.NON_DELETE,
                            ),
                        )
                        .group_by(sub_stmt.c.m_text)
                    )
                    # SELECT文を全件取得で実行する
                    select_row = self.session.execute(stmt).all()
                    # 返却用の返却行に取得した家計簿一覧を代入する
                    return_HABkinds_PieChart_data.return_row = select_row
                    # ENDログ出力
                    error_message = self.create_log(
                        self.const.Log_Kinds.END,
                        str_log_function_id,
                        self.message.Log_Message.FILL_HABkinds_PIECHART.format(
                            self.display_name,
                            self.const.Table_Name.HAB_DETAIL,
                            arg_where_year_month,
                        ),
                        arg_user_id,
                    )
                    # ENDログ出力失敗の場合
                    if error_message != None:
                        # 返却用のメッセージボックスに例外エラーメッセージを代入する
                        return_HABkinds_PieChart_data.return_message_box = error_message
                        return return_HABkinds_PieChart_data
                    else:
                        return return_HABkinds_PieChart_data
            except Exception as e:
                # 例外エラー用メッセージ作成
                return_HABkinds_PieChart_data.return_message_box = self.exception_log(
                    str_log_function_id, e, arg_user_id
                )
                return return_HABkinds_PieChart_data
            finally:
                # セッションを閉じる
                self.session.close()

    # 家計簿登録
    def create_HAB_list(self, arg_HAB_ditail_row: HAB_Detail, arg_user_id):
        """
        家計簿を登録する
        引数
            arg_HAB_ditail_row:家計簿
            arg_user_id:操作ユーザー
        """
        # 返却用クラスをインスタンス化
        return_HAB_list = Return_Info()
        # ログ出力のfunction_idを作成
        str_log_function_id = self.message.Log_Function_Id.id.format(
            self.const.Log_Kinds.INFO,
            self.const.Log_Process.INSERT,
            self.const.Log_Function.HAB_DETAIL,
        )
        # 新規登録する家計簿の年月日時刻を作成する
        log_ditail = arg_HAB_ditail_row.HAB_at.strftime("%Y-%m-%d %H:%M")
        # STARTログ出力
        error_message = self.create_log(
            self.const.Log_Kinds.START,
            str_log_function_id,
            self.message.Log_Message.INSERT.format(
                self.display_name,
                self.const.Table_Name.HAB_DETAIL,
                log_ditail,
            ),
            arg_user_id,
        )
        # STARTログ出力失敗の場合
        if error_message != None:
            # 返却用のメッセージボックスに例外エラーメッセージを代入する
            return_HAB_list.return_message_box = error_message
            return return_HAB_list
        else:
            try:
                # 家計簿を登録する
                self.session.add(arg_HAB_ditail_row)
                self.session.commit()
                # 返却する登録完了メッセージを作成する
                return_HAB_list.return_message_box.message_id = "HAB001I"
                return_HAB_list.return_message_box.message_text = (
                    self.message.Message_Box.HAB001I
                )
                # ENDログ出力
                error_message = self.create_log(
                    self.const.Log_Kinds.END,
                    str_log_function_id,
                    self.message.Log_Message.INSERT.format(
                        self.display_name,
                        self.const.Table_Name.HAB_DETAIL,
                        log_ditail,
                    ),
                    arg_user_id,
                )
                # ENDログ出力失敗の場合
                if error_message != None:
                    # 返却用のメッセージボックスに例外エラーメッセージを代入する
                    return_HAB_list.return_message_box = error_message
                    return return_HAB_list
                else:
                    return return_HAB_list
            except Exception as e:
                # 例外エラー用メッセージ作成
                return_HAB_list.return_message_box = self.exception_log(
                    str_log_function_id, e, arg_user_id
                )
                return return_HAB_list
            finally:
                # セッションを閉じる
                self.session.close()

全体コード(GitHub)

household_account_book/db/login_adapter.py at main · SakumaTakayuki/household_account_book
Contribute to SakumaTakayuki/household_account_book development by creating an account on GitHub.