● 服屋さん時代に自分で作って使っていた、Access2000での、自作のバーコードPOSレジのmdbファイルのダウンロード(サンプルダミー売上データ付き)
★バーコードPOSレジサンプルのAccessファイル
(mdbファイルです。7.5MBほどのZipです。ESETでウィルスチェックしてあります。)
http://euc-access-excel-db.com/mag2charge/pos/access_pos_sample.zip
◎ファイルの設置上の注意
基本的には 古いパソコンか仮想マシンを用意して、OSはWin2000かXP、もしくは98で、Accessはバージョン2000、2002、2003を使ってください。ただ、「XP以降のOS + Access2007以降」でも多分動作すると思います。(もしダメだったらごめんなさい!基本、Sendkeys命令が使ってあるところは動かないかも。)
Accessランタイムはダメです。ランタイムで動くようには作ってありませんので・・・。
もしダメだったらAccess2000を持っている人に試してもらってください。詳しくは同梱の注意書きを読んでください。
※Access2000と他のOffice製品(特に2007以降)の共存は絶対にしないでください。もともとのOffice製品のExcelODBCドライバや周辺機能がおかしくなり、Officeの再インストールをしても治らないです。Access2000を先に入れればもしかしたら大丈夫かもしれませんが、試してないので自己責任でよろしくお願いいたします。
◎VBAプログラムのことで、できればマネしてほしくないこと
これ作ったときはまだ初心者でしたのでほんとになんにも分かってないので基本的に全部、マネしないほうがいいと思うのですが、特にマネしてほしくないのが(今もダメなままなのであまりマネしないほうがいいかもですけど)・・・・
本バーコードPOSレジのVBAコードでは、フォーム上のテキストボックスなど、各コントロールを参照する際に、「!」を使って、例えば「Me!テキスト123」のように書いてしまってしますが、これはできればマネしないほうがいいかもです。
例えば「フォーム01」というフォームの上に配置してある、「氏名」というテキストボックスを参照する場合は、
Forms("フォーム01")("氏名")
とか、
Me("氏名")
とか、
「!」を使わずに、各コントロールやフォームの名前を "" で囲んでさらに( )で囲むような形を取ったほうがいいとは思います。
というのも、このスタイルでコントロールを参照すると、Me("氏名") の "氏名" の場所に文字列型の変数を入れる(使う)、あるいは、「数値型の変数 & 何らかの文字列」を使うことができるからです。
それができると変数を用いてループやオブジェクト変数処理などがやりやすくなります。
ひいては、共用部品や共用関数などが作りやすくなって、フォームや部品がだだくさに増えていくことを抑えられます。
共用部品や共用関数などが増えれば、バグや仕様変更・機能追加等々で修正したい場合も修正箇所も減ることにになり管理がしやすくなります。色々とメリットが多いです。
もちろん、「!」を使うのも自由なのですが、最低限、「どちらのスタイルを常用するか?」くらいは決めておくと、あとで修正がしやすいかもしれません。
常時「!」を使って、共用部品のところだけ( )と"" を使うか、あるいは逆に、常時( )と"" を使ってどうしても「!」じゃないとダメなときや「!」を使って何かの区別をしたいところだけ「!」を使うなど、役割を持たせると良いと思います。
僕は今はどちらかというと後者ですけど、「!」は全く使いません。
その他の参照方法 ~ FormsコレクションによるFormオブジェクトの参照例
構文 使用例
Forms!formname Forms!受注フォーム
Forms![form name] Forms![受注 フォーム]
Forms("formname") Forms("受注フォーム")
Forms(index) Forms(0)
ちょっとは話がズレてしまいますが、上記のように色々な方法がありますが、「Forms("受注フォーム")」のようなスタイルが、"" とか、( )とか、少し文字数は増えてしまうものの基本的には面倒がないので、この書きかたで統一してしまうことを僕個人としてはおすすめします。
テキストボックスや、サブフォームなど、各種コントロールも同じです。
理由は「のちのちの作り足し、作り変えがしやすくなるから」や、「のちのちの管理が少しでもラクになるから」「共用部品を作りやすくなる」「共用部品を多く作れば機能の実装もメンテもラクになるから」「統一することで、エラーや記述ミスを出にくくする」「書き換え時にコントロール名などを見つけやすい。特に置換技が有効でない時」等々・・・ということからです。
また、ExcelVBAでの参照(オブジェクトの取得)でも、同じ書き方をするので、『ExcelとCOMオートメーション機能で連携する』ような場合に、プログラムコード的にExcelとAccessが統一されるのでさらに分かりやすくなります。その理由も大きいです。
**************
★本バーコードPOSレジmdbプログラムの概要
このPOSレジは、2000年前後に僕自身が作って使っていたものです。
服屋さんをやっていたころに使っていました。
一応(当時)、日経BP社さんのとあるIT雑誌さんから、「エンドユーザー・コンピューティング特集」的なもののネタの1つとして取材を受けました。公募してたので応募したら先方からご連絡が来たというかたちです。
でもAccessを勉強し始めたころに作ったものなので、中身はとんでもなくめちゃくちゃです。(今でもめちゃくちゃなことしていますが・・・)
正規化してないところは、クエリを作るのがめんどくさいために非正規化してあったりします。
VBAプログラムコードも超汚いし、コメントだらけだし、本当に汚いプログラムです。
Withすら使ったことないし、Selectも使わない。
ひたすら、ほぼ、IfとExit Sub、Exit For、だけでプログラムを書いています。
ミドルウェアについても、ADOを使っておらずDAOですし、最低なレベルのプログラムだと思います。
そんなめちゃくちゃなPOSレジシステムですが、でも、ド素人でも(従業員様5名以下の規模でしたら)こんな感じまではやれる、ということと、逆にこれ以上、やる必要もない、というところのちょうどいい辺りかな・・・ということを思いましたので、今回、中身を全部お見せする形で公開させていただきます。
もともと僕は服屋さんだったので、当然、大きなプログラムなんて作ったことはなくて、Accessプログラムは商店街用のサンプルを1つと、あと、2、3、何か小さいものを作っていただけで、自分にとっての大きな実用的なプログラムはこれが初めてでした。
数十万を出して市販やカスタムのPOSレジを買うという選択肢もあったのですが、事前にWebでマニュアルとかを見ると、どう見ても、自分のやりたいことができない仕様でした。
なので、作ることにしました。
当時(というか今でもですが)、僕はExcelをまったくといっていいほど使っていなかったので、いきなり、AccessでPOSレジ作成に挑戦するという当時としては無謀なことをしていたのですが、とにかく本を読み漁って作りました。
なので、VBAプログラムもAccessからで、今でもExcelVBAはほとんど分かりません。
でも、AccessVBAから入ったおかげで、ExcelVBAのことも少し入りやすかったですし、今もなんとかなっているという感じです。でもExcelVBAは今でもなんとかかんとか四苦八苦という感じで当然、きれいなコードは書けませんし、汚い効率の悪いコードを書いています。
そんなこんなで、ド素人にもなんとかPOSレジが作れたのは、とにもかくにも、「Access2000時代がAccessに関しては一番良書や良いWeb記事が集中していた・・・」、という環境だったから、と思います。
サンプル売上データは2万件ほどありますが、そのままピボットの練習などにも使えると思います。
顧客データが約2000件、商品データが2万件ほどあります。
なお、顧客IDも商品IDもLong型の整数です。
パスワードもかかっていませんので、VBAコードも全部見れます。
今思うと大して活用できてなかったりもしたかもしれませんが、商品の写真を全部残しておいたので、お客様の購入履歴を全員写真で見れたため、「お客様のお顔を初ご来店時に一発で覚える」、ということに使ったりしていました。
そのほかにも、安易に値下げ販売をしないようにするために使ったり、現在の在庫写真からHTMLを自動生成してアップロード → ネット通販などにも使ったり、銀行さんなど対外的な資料を作ったり、いろいろで使っていました。
商品タグに貼るバーコードラベルを、端数処理をして余りを出さないようにしたりとか、そういうこともしていました。
売上報告書を書かなくても済んだり、でも必要な数字はいつでも出ますし、棚卸がすごくラクになったりで結構重宝していました。
********
動作的には次のような感じです。
※顧客IDも商品IDもLong型の整数です。
・データ専用のmdbを所定の場所に置く
(Win98時代に作ったので、C:\Windows\半角の「デスクトップ」)
・POS画面.mdbを起動
・バーコード印刷した会員カード(パウチっこ)を作成して事前にお客様に配布。
・そのカードをご提示頂き、バーコードを読む。
お忘れの場合はお電話番号などで顧客IDを入力してEnter
・自動的にサブフォームの商品登録リスト内へ飛ぶ
・商品のタグのバーコードを読むか、商品ID(単純な連番)を入力してEnterする
・これで1点分が売上登録される
・複数点お買い上げならその数だけ繰り返す。
・セール時などは必要に応じて、1商品あたりに%値引きや固定金額値引きをする
・終わったらEnterを2回押すとサブフォームから自動脱出して合計計算される
・お預り金を入力してEnter→おつりの金額が計算される。
・同時にレジドロアがガチャコーンと自動キックされてレシートプリンタがすいーっと印刷される
・お客様に1ポイント1円で2ポイント分、ポイントが加算される
※バーコードリーダは、バーコードを読むと「値の入力とEnter押下動作の両方とも」を自動でやってくれます。作ったのがWindows98の時代でしたので、USBのバーコードリーダはまだ高価で、PS2のバーコードリーダを使ってました。CCDレンズタイプです。
商品のバーコードには、しょぼいプリンタでのバーコード印刷でも必ず読める「Code128」を使っていました。
レシートプリンタとレジドロアはエプソンのものを使っていました。
ドロアはレシートプリンタに電話線と同じケーブルでつないで、レシート印刷が開始された時点でドロアのキック信号が出て、ドロアが自動的にガチャコーンと開く仕組みでした。なので、ドロアを開くプログラムコードは必要ありません。
先日、Pentium233くらいだったかのCPUの化石VAIOミニノートにて、Win98で動かしたら、POSレジのmdbもドロアもレシートプリンタも正常に動いたのでびっくりしました・・・。このぶんだともしかしたらNECの98シリーズでも動くかもしれない・・・