兎の真似をする烏

全力で"楽"である為に・人生が"面白く"ある為に

wxPythonでコンボボックスを使うには

やりたいこと

wxPythonでコンボボックスを使用したい。
画面生成にはwxGladeをりようする。

試してみる

さくっと簡単な例を作成してみる。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.9pre on Thu Oct 22 16:07:45 2020
#

import wx

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade


class MainPanel(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainPanel.__init__
        kwds["style"] = kwds.get("style", 0)
        wx.Panel.__init__(self, *args, **kwds)
        
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        
        self.combo_box_1 = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY)
        self.combo_box_1.SetFont(wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_2.Add(self.combo_box_1, 1, wx.ALL, 10)

        self.combo_box_1.Append('First', 1)
        self.combo_box_1.Append('Second', 2)
        self.combo_box_1.Append('Third', 3)

        self.SetSizer(sizer_1)
        
        self.Layout()

        self.Bind(wx.EVT_COMBOBOX, self.combobox_event, self.combo_box_1)
        # end wxGlade

    def combobox_event(self, event):  # wxGlade: MainPanel.<event_handler>
        print('表示データ:{}'.format(self.combo_box_1.GetValue()))
        print('内部データ:{}'.format(
            self.combo_box_1.GetClientData(self.combo_box_1.GetSelection())))

# end of class MainPanel

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainFrame.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.SetTitle("frame")
        
        self.main_panel = MainPanel(self, wx.ID_ANY)
        self.Layout()
        # end wxGlade

# end of class MainFrame

class MyApp(wx.App):
    def OnInit(self):
        self.main_frame = MainFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.main_frame)
        self.main_frame.Show()
        return True

# end of class MyApp

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

要素設置方法

コンボボックスに要素を設置するには Append を利用する。この時、表示データと内部データとを分けて設置することができる。ユーザに見せたい表示データを第1引数に、処理で使いたい内部データを第2引数にそれぞれ設定したら良い。

        self.combo_box_1.Append('First', 1)
        self.combo_box_1.Append('Second', 2)
        self.combo_box_1.Append('Third',3)

要素取得方法

ユーザがコンボボックスで選択した情報を取得する方法について。
表示データを取得するには GetValue() を使用する。
内部データを取得するには GetSelection() で選択位置を取得した後に GetClientData() を使用する。

        print('表示データ:{}'.format(self.combo_box_1.GetValue()))
        print('内部データ:{}'.format(self.combo_box_1.GetClientData(self.combo_box_1.GetSelection())))

読み込み専用の設定方法

wx.ComboBoxwx.Choicewx.TextCtrl の両方の機能を兼ね備えている。つまりはユーザがテキストを変更することができる。ユーザにテキスト変更をさせたくないのであれば、コンボボックスの生成時に wx.CB_READONLY を指定したらOK。

        self.combo_box_1 = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY)

科目選択作成

ざっくりな機能説明

科目情報取込にてDBに登録した勘定科目の一覧を表示する。
ユーザは出力された科目の一覧の中から任意の科目を選択する。選択された科目情報を呼び出し元へ反映出来るようにする。

補助機能

検索

科目数が多いと対象の科目を探し当てるまでに手間がかかる。
これを解消するために『科目名検索』『科目コード検索』が行えるようにする。

また、検索は「曖昧一致」「前方一致」「後方一致」「完全一致」のそれぞれの機能を付与する。

作成してみた

画面イメージとしては以下のような感じ。

f:id:crowrabbit1212:20201022144945p:plain
科目情報選択画面

wxPythonでダイアログ生成をするには

やりたいこと

wxPythonにてダイアログを生成したい。
画面作成にはwxGladeを利用する。

親画面作成

ダイアログを呼び出すボタンと、ダイアログに入力された値を受け取るテキストエリアを設ける。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.9pre on Wed Oct 21 16:37:29 2020
#

import wx

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
import main_dialog
# end wxGlade


class MainPanel(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainPanel.__init__
        kwds["style"] = kwds.get("style", 0)
        wx.Panel.__init__(self, *args, **kwds)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        
        sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(sizer_1, 1, wx.EXPAND, 0)
        
        self.show_dialog_button = wx.Button(self, wx.ID_ANY, u"ダイアログ表示")
        self.show_dialog_button.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_1.Add(self.show_dialog_button, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(sizer_2, 1, wx.EXPAND, 0)
        
        text = wx.StaticText(self, wx.ID_ANY, u"結果", style=wx.ALIGN_CENTER)
        text.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_2.Add(text, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        self.result_text = wx.StaticText(self, wx.ID_ANY, "")
        self.result_text.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_2.Add(self.result_text, 5, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        self.SetSizer(sizer)
        
        self.Layout()

        self.Bind(wx.EVT_BUTTON, self.show_dialog, self.show_dialog_button)
        # end wxGlade

    def show_dialog(self, event):  # wxGlade: MainPanel.<event_handler>
        dialog = main_dialog.MainDialog(self, wx.ID_ANY, u'サンプル')
        result = dialog.ShowModal()
        if result == wx.ID_OK:
            self.result_text.SetLabel('入力内容:{}'.format(dialog.main_text.GetValue()))
        dialog.Destroy()

# end of class MainPanel

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainFrame.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((800, 300))
        self.SetTitle(u"ダイアログテスト")
        
        self.main_panel = MainPanel(self, wx.ID_ANY)
        self.Layout()
        # end wxGlade

# end of class MainFrame

class MyApp(wx.App):
    def OnInit(self):
        self.main_frame = MainFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.main_frame)
        self.main_frame.Show()
        return True

# end of class MyApp

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

ダイアログの表示と後処理を実行しているのは以下の部分。

    def show_dialog(self, event):  # wxGlade: MainPanel.<event_handler>
        dialog = main_dialog.MainDialog(self, wx.ID_ANY, u'サンプル')
        result = dialog.ShowModal()
        if result == wx.ID_OK:
            self.result_text.SetLabel('入力内容:{}'.format(dialog.main_text.GetValue()))
        dialog.Destroy()

dialog.ShowModal()をすることでダイアログを表示している。
また、ダイアログからの戻り値(wx.ID_OKやwx.ID_CANCEL)を受け取り、後処理(テキストエリアに結果を書き込む)を行う。

実際の画面イメージは以下の通り。

f:id:crowrabbit1212:20201021184613p:plain

子画面作成

任意の文字を入力できるようにする。
「OK」ボタンを押下することで、入力した任意の文字を親画面に反映する。
「CANCEL」ボタンを押下すると何も反映しない。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.9pre on Wed Oct 21 16:32:11 2020
#

import wx

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade


class MainDialog(wx.Dialog):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainDialog.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        self.SetTitle(u"サンプル")
        
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        
        self.main_text = wx.TextCtrl(self, wx.ID_ANY, "")
        self.main_text.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_2.Add(self.main_text, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(sizer_3, 1, wx.EXPAND, 0)
        
        self.ok_button = wx.Button(self, wx.ID_OK, "OK")
        self.ok_button.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_3.Add(self.ok_button, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        self.cancel_button = wx.Button(self, wx.ID_CANCEL, "CANCEL")
        self.cancel_button.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_3.Add(self.cancel_button, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        
        self.Layout()
        # end wxGlade

# end of class MainDialog

class MyApp(wx.App):
    def OnInit(self):
        self.dialog = MainDialog(None, wx.ID_ANY, "")
        self.SetTopWindow(self.dialog)
        self.dialog.ShowModal()
        self.dialog.Destroy()
        return True

# end of class MyApp

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

注意点としては、「OK」ボタンのIDをwx.ID_OKにして、「CANCEL」ボタンのIDをwx.ID_CANCELにすること。
このIDをwx.ID_ANYにするとダイアログは閉じない。

上記ソースにて、各ボタンの定義は以下のように記載している。

        self.ok_button = wx.Button(self, wx.ID_OK, "OK")
        self.cancel_button = wx.Button(self, wx.ID_CANCEL, "CANCEL")

実際の画面イメージは以下の通り。

f:id:crowrabbit1212:20201021184737p:plain

注意点

ダイアログが閉じられた際の戻り値は各ボタンで設定したwx.ID_OK(5100)やwx.ID_CANCEL(5101)が格納される。
このとき、ダイアログを「×」ボタンで閉じた場合は戻り値として何が返却されるか?

常識的に考えればwx.ID_CANCELと同様に 5101 が返却されると考えるが、想定通りの動きとなるのか?

「OK」ボタンと「CANCEL」ボタンがそれぞれ存在する場合

上記で示した例で実践してもらえれば確認できる。
この場合では想定通りの戻り値を得ることができることが分かる。

「OK」ボタンだけが存在する場合

ダイアログに「OK」ボタンだけが存在する場合はどのような動作になるかを確認する。
具体的には子画面のソースが以下のような例で考える。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.9pre on Wed Oct 21 18:37:50 2020
#

import wx

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade


class MainDialog(wx.Dialog):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MainDialog.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        self.SetTitle(u"サンプル")
        
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        
        self.main_text = wx.TextCtrl(self, wx.ID_ANY, "")
        self.main_text.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_2.Add(self.main_text, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(sizer_3, 1, wx.EXPAND, 0)
        
        self.ok_button = wx.Button(self, wx.ID_OK, "OK")
        self.ok_button.SetFont(wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_3.Add(self.ok_button, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10)
        
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        
        self.Layout()
        # end wxGlade

# end of class MainDialog

class MyApp(wx.App):
    def OnInit(self):
        self.dialog = MainDialog(None, wx.ID_ANY, "")
        self.SetTopWindow(self.dialog)
        self.dialog.ShowModal()
        self.dialog.Destroy()
        return True

# end of class MyApp

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

実画面のイメージは以下の通り。

f:id:crowrabbit1212:20201021184752p:plain

この状態でダイアログを「×」ボタンで閉じた場合は戻り値としてwx.ID_OKと同じ5100を受け取る。
明確にキャンセルの処理を含めたいのであれば、明示的に「CANCEL」ボタンを作成する必要がある。

科目情報取込作成

ざっくりな機能説明

財務会計R4に登録されている科目一覧を取り込む機能。科目情報は財務会計R4の機能にてCSV形式で出力することができるのでそれを利用する。取り込んだデータはそのままDBへ登録。

主科目情報

財務会計R4にて取得できるCSVファイルの内容はいかのようなもの。

項目名 形式 備考
勘定科目コード 1~4桁?までの数値 ダブルクォートで括られている
勘定科目名 任意の文字列

勘定科目コード,勘定科目名
"100","現金"
"131","売掛金"
"201","買掛金"

※ 注意 ※
財務会計R4で出力される科目情報は使用していない科目までCSVファイルに記載してくる。
財務会計R4では科目選択窓に出力するか否かのフラグを立てることが可能だが、何故かそのフラグ情報を引き出すことが出来ない。
これは仕様なのか、単純に私がその方法を知らないだけなのか...

補助科目情報

財務会計R4にて取得できるCSVファイルの内容は以下のようなもの。

項目名 形式 備考
勘定科目コード 1~4桁?までの数値 主科目コードの情報が載る。ダブルクォートで括られている
補助科目コード 1~4桁?までの数値 ダブルクォートで括られている
補助科目名 任意の文字列

勘定科目コード,補助科目コード,補助科目名
"131","1","A商店"
"131","2","B株式会社"
"201","1","C商事"

操作イメージ

ユーザは「参照」ボタンからファイル選択ダイアログを表示し、そこから主科目と補助科目のそれぞれのCSVファイルを選択してもらう。
CSVファイルを選択後「取込」ボタンを押下することでDBへ情報を書き込むようにする。

補助機能

  • 主科目のCSVファイルが選択されていない状態で「取込」ボタンを押下するとエラー
  • 補助科目のCSVファイルが選択されていない状態で「取込」ボタンを押下するとエラー
  • 選択されたCSVファイルのヘッダ情報を確認し、規定の項目が存在しない場合は想定外のファイルが選択されたものとしてエラー

設定ファイル

予め各CSVファイルのヘッダ情報を設定したファイルを用意しておく。
今回はyamlを採用。

設定内容は以下のような感じ。

account:
  main:
    code: 勘定科目コード
    name: 勘定科目名
  sub:
    code: 勘定科目コード
    sub_code: 補助科目コード
    sub_name: 補助科目名

DB

main_accountsテーブル

主科目の情報を取り込むテーブル。
カラムは以下のように設定。

カラム名 主キー 備考
id Integer autoincrementをTrueに設定
code Integer 主科目コードを格納
name String 主科目名を格納

sub_accountsテーブル

補助科目の情報を取り込むテーブル。
カラムは以下のように設定。

カラム名 主キー 備考
id Integer autoincrementをTrueに設定
code Integer 主科目コードを格納
sub_code Integer 補助科目コードを格納
sub_name String 補助科目名を格納

作成してみた

当記事を記載している現在(2020/10/18)で大まかには作成が完了している。
画面イメージとしては以下のような感じ。

f:id:crowrabbit1212:20201018125844p:plain
主科目・補助科目情報取込画面イメージ

現金出納帳取込作成

ざっくりな機能説明

Excelで作成した現金出納帳を読み込み、財務会計R4に取り込み可能な形式のCSVファイルを作成する。
これを実現させるにあたり、更に機能を細分化し、何が必要なのかを考えてみる。

科目情報取込

財務会計R4に登録されている科目一覧を取り込む。 科目情報については、財務会計R4の機能にてCSV形式で取り出すことが出来るのでそれを利用する。
取り出したCSVの情報をそっくりそのままDBへ取り込むようにする。

crowrabbit.hatenablog.com

科目選択

科目情報取込でDBへ登録した情報の一覧を出力する。
ユーザはその出力された科目の中から指定した情報を選択することができる。
ユーザが選択した情報を呼び出し元へ戻して登録を行う。

要はユーザに変な科目情報を登録させない為の機能。

科目数が多くなるため、コードや科目名での検索機能があればより良いと考える。

crowrabbit.hatenablog.com

現金出納帳-取込設定

現金出納帳を取り込む上で最低限必要な設定を行う。
基本的なものとしては以下のものを考える。

現金科目設定

  • 必須項目
  • 現金科目コードをユーザが任意の数値に変更している可能性を考慮

不明科目設定

  • 必須項目
  • Excelに記載された科目がDB内に無い場合に設定する科目
  • 「仮払金」や「仮受金」あたりが設定される想定

不明科目設定 - 付箋有無

  • 不明科目となる箇所に付箋を付けるかの設定を行う

現金出納帳情報

  • 必須項目
  • Excelに設定された以下の5項目の設定をしてもらう
    1. 日付
    2. 科目
    3. 入金
    4. 出勤
    5. 適用

現金出納帳取込

現金出納帳-取込設定の内容を元に、Excelで作成された現金出納帳を取り込む。
取込前にユーザに指定してもらう情報と、出力結果のCSVの情報については以下の通り。

EXCELファイル - 現金出納帳

現金出納帳の情報が記載されたExcelファイルを指定してもらう。
「参照」ボタンからファイルを選ぶようにする。

対象シート

EXCELファイルで選択されたファイルのどのシートが対象となるかを選択してもらう。

ファイル保存先

CSVファイルの出力先や、ファイル名を指定してもらう。

出力期間

現金出納帳が複数年・複数月に跨り登録されていることを考慮し、CSVファイルへ出力する期間を指定できるようにする。
指定がない場合は全期間を対象としたらいいかなと思う。

出力結果CSVファイル

出力されるCSVファイルは以下のような形式であれば財務会計R4で取込可能となる。

No. 項目名 必須 桁数 備考
01 月種別 1 0:通常 / 1:第1四半期 / 2:第2四半期 / 3:第3四半期 / 4:期末
02 種別 1 0:通常 / S:先行
03 形式 1 1:入金 / 2:出勤 / 3:振替 / 4:単一 / 5:帳簿
04 作成方法 1 0:手入力 / 1:自動作成 / 2:残高合併 / 3:伝票合併
05 付箋 1 1:赤(縦) / 2:青(縦) / 3:緑(縦) / 4:黄(縦) / 5:桃(縦) / A:赤(横) / B:青(横) / C:緑(横) / D:黄(横) / E:桃(横)
06 伝票日付 8
07 伝票番号 6 最大6桁の数字
08 伝票適用 40
09 枝番 3 1~999の数字
10 借方部門 6
11 借方部門名 30
12 借方科目 6
13 借方科目名 24
14 借方補助 6
15 借方補助科目名 24
16 借方金額 12 最大12桁の数字(マイナス可)
17 借方消費税コード 2 「消費税区分コード」の「応援用コード」
18 借方消費税業種 1 「消費税業種」の「業種
19 借方消費税区分 「消費税区分変換」の「Ai」の「コード」
20 借方消費税フラグ 0:その他 / 1:税込 / 2:税抜
21 借方消費税税率 2 「消費税率」の「税率」(「.0」省略可)
22 借方資金区分 2
23 借方任意項目1 10
24 借方工事 10 借方任意項目1へセット
25 借方任意項目2 10
26 借方工種 10 借方任意項目2へセット
27 貸方部門 6
28 貸方部門名 30
29 貸方科目 6
30 貸方科目名 24
31 貸方補助 6
32 貸方補助科目名 24
33 貸方金額 12 最大12桁の数字(マイナス可)
34 貸方消費税コード 2 「消費税区分コード」の「応援用コード」
35 貸方消費税業種 1 「消費税業種」の「業種
36 貸方消費税区分 「消費税区分変換」の「Ai」の「コード」
37 貸方消費税フラグ 0:その他 / 1:税込 / 2:税抜
38 貸方消費税税率 2 「消費税率」の「税率」(「.0」省略可)
39 貸方資金区分 2
40 貸方任意項目1 10
41 貸方工事 10 貸方任意項目1へセット
42 貸方任意項目2 10
43 貸方工種 10 貸方任意項目2へセット
44 行適用 96
45 期日 8 YYYMMDD
46 証番号 10
47 入力マシン 20 表示されます
48 入力ユーザ 40 設定されていない場合は「取込を実行したユーザー」
49 入力アプリ 30 設定されていない場合は「取込条件で設定されている名称」「起動アプリケーション名」
50 入力会社 40 設定されていない場合は「起動会社名」
51 入力日付 8 YYYYMMDD

基本的には必須項目のみを埋める形で出力するようにする。

仕訳入力補助アプリ作成

通常業務において売上や経費等の仕訳入力作業がある。これが非常に面倒くさい。
現在、それぞれの作業は各資料(現金出納帳・買掛金表・売掛金表 etc...)を確認しながら一件ずつ手作業で入力をしている。慣れもあるのだが、やはり時間が掛かる。
これをどうにか効率化したいという思いから、仕訳入力の補助を担う業務アプリの作成を決意した。

とはいえ、自身の知識量では太刀打ち出来ないので、プログラミングの勉強を並行して行いながらの作成。
簡単な機能から順番に作成していければいいなと。

動作環境

大雑把には以下の環境で作成。

職場で採用されている会計ソフト

  • 会計ソフト : 財務会計R4
    • Weplat版ではない
    • 自動仕訳サービス利用については上司の判断待ち

2020/10/17 : 作成目標機能

まずはExcelで作成された現金出納帳を取込、CSVファイルへ出力するだけの機能を目指す。
crowrabbit.hatenablog.com