【備忘録】ひとりでできるもん【Accessで伝票管理】

浅、時代は手紙とFAXとAccess

そんなわけ無いんですけどね。

インターネットをつかってメールやデータベースで注文を管理するのがおそらく一般的でしょう。

しかし、我々のような零細農家にはインターネットを使いこなすだけの気力がありません。

(メールで注文を受けるのもやってみようかと思いましたが「メールチェックめんどくさいな」とか「俺の仕事増えるじゃん」とか思った末頓挫しております。)

そんなわけで宅配の受注は手紙とFAXで受け付けております。

伝票の管理はおととしまで25年くらい前に我が家にやってきたドットプリンタとWindowsMEさんがやってくれていました。

…。

昨年、ゆうパックの料金値上がりに直面しクロネコヤマトに宅配業者を乗り換えました。

当然、伝票管理のシステムも変更しなければいけなかったのでTheCardからMicrosoftAccessへデータベースもお引っ越しすることにしました。

ついでに今まで手で計算していた送料と商品の計算をして納品・請求書を作ってくれるようにしました。

作ってみると意外と複雑でデータベースの設計方法もよくわからないし、VBAもよくわからないし、SQLは描きにくいしで結構たいへんでしたが仕事とアルバイトをしながら1ヶ月くらいで完成させることができました。(えらい!)

プログラミングとSQLを使う練習にもしたかったので文字で書けるところは文字で書きました。(フォームとかテーブルの作成、レポートは文字で書くとどんな感じなのか想像もつきません。)大したことしてないと思いますが。

これも基本情報技術者をもっていたおかげかもしれません。

知らないことはもちろん多かったですが「あ、これ基本情報技術者試験でやったやつだ!」な知識も多かったです。

基本情報技術者試験を受験しました【合格】

2019年4月22日

 

学、昨年の課題

一人で素人が作っているので十分なテストも行わず、実際に使ったのでバグだらけでした。しかし、なんとか昨年は乗り切りました。

課題としては

  • 住所の追加変更が面倒。
  • 住所検索のメッセージボックスの文字が小さくて見づらい。
  • 支払い確認するためにリストを印刷したい。
  • 領収済みの人にも請求書が出てきてしまう。
  • 売上の集計が面倒。(と言われた)
  • 昨年と同じ場所同じ商品の人が結構多い。(昨年の履歴から伝票をつくりたい)

こんなところだと思います。

リレーションシップの変更に伴ってテーブルの変更も必要に成ったので昨年のものを修正するのではなくて1から作り直しました。(VBAで作った基本的な機能はコピペしたのでだいぶ楽でした。)

 

非、やったこと

リレーションシップの変更

未だにリレーションシップを理解しきれていない気がしてなりません。

SQLでJOINするために必要なのかと思っていたけどそうでもなさそうだし、参照整合性(外部キー制約)つけなきゃいけないのかと思ったらそうでもない。

調べれば調べるほど難しい話も出てきて正直わけが分からなくなりかけたが数万件のデータを処理するわけでも無いので割り切って適当に理解しました。

具体的にやったことは「AddressMaster(住所録)の分離」

ER図が書ければいいんですが面倒なので割愛(本当に役に立たない記事に成っていると実感します。反省はしていません。)

昨年はClientTable(注文者テーブル)SenderTable(送り主テーブル)ReceiverTable(受け取る人テーブル)がそれぞれOrderTable、SlipTableに外部キー制約をもったリレーションを設定したため変更が面倒でした。(注文者一人から送り主複数送り先複数の注文もあったのでこんな形にしたんだろうと思います。)

ClientTable、SenderTable、ReceiverTableを統合してAddressMasterにしました。

入力フォームでAddressMasterから検索のみを行って、送り主送り先のデータをSlipTableが直接持つようにしました。

 

SlipTableは
ItemID(主に品種名)と
SizeID(5キロ、10キロとか)、
PrefectureID(配送都道府県、PrefectureTable(中間テーブル?)に結合して配送地域に変換?される)
をもっていて
UnitPriceTable(商品単価)[ItemIDとSizeIDの複合主キーのテーブル]、
PostageTable(送料)[SizeIDとDivision(PrefectureIDからの変換)の複合主キー] に結合して各料金を決定します。

テーブルの変更

AddressMasterができたのでOrderTableが注文者、SlipTableは送り主送り先のデータを直接持つようにしました。(OrderTable[1]ー[多]SlipTable な関係です。)

OrderTableにClame(Boolean型)を新設。チェックが入っていたら請求をするようにした。

前年の履歴からSlipTableに追加

前年の履歴を上に描いたようなSlipTableの形式に変換。追加判定用にBoolean型を一個設置

フォームにフィルターかけて表示、ユーザーにチェック入れてもらってチェックが入っているものを追加。(内容の編集は可能だけどAddressMasterとは結合していないので住所録の変更は不可)

請求書を印刷するときにExcelに売上をエクスポート

これが一番ハマりました。Excelのプロセスが動き続けて2回目以降の実行ができない。

結論としてはRowsを直接呼び出していたため気を利かせてExcelがプロセスを新しく生成してくれていただけでした。

外部からExcelをいじるときは面倒でも上位オブジェクトから指定するようにしようね。

そのた

  • 住所の検索結果の表示を標準のメッセージボックスではなくフォームで作成しました。
  • 支払い確認用のリストをレポートで作成するようにしました。
  • 営業用年賀状の宛先リスト作成ボタンを作りました。
  • 値の入っていない商品を作成しました。

 

才、本当に役に立たない。ごめんなさい。

参考やヒントとしてQiitaをたまに使いますが皆さんわかりやすく解説してあってありがたいです。

それに比べてこの記事はなんと独りよがりで読みにくく、役に立たないのかと自分で思っています。

もう少しわかりやすく書きたいと思いましたが何をわかりやすくかけば良いのかもわからないのでタダの備忘録になりました。

本業でSEやってる人からしたら笑ってしまうようなものだとは思いますがこれだけでも繁忙期に一人分の労力が削減されました。

全部合わせてもたった1,000行くらいのプログラムでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です