エクセルとMySQLを使った伝票入力プログラム作成

このQ&Aのポイント
  • エクセルとMySQLを使用して、伝票入力プログラムを作成する方法についてアドバイスや参考情報をご紹介します。
  • 当時のファイルの扱い方と、現在のエクセルとMySQLでのRDBの扱い方について比較し、プログラム作成のポイントを解説します。
  • 具体的なアドバイスとして、SQLを使用する場合の索引の扱い方や一意的な伝票番号の取得方法について説明します。
回答を見る
  • ベストアンサー

エクセルとMySQLを使った伝票入力プログラム作成

1980年代に、当時のオフィスコンピュータのディーラでプログラマーとして働いていて、COBOLで売上システムなどを開発していました。 コンピュータのOSは、マルチジョブ/マルチユーザでしたので、何台もターミナルを接続できました。ジョブコンも完備してましたので、一台のターミナルでバッチ処理を流しながら、オンラインの伝票入力なども同時にできました。 その後、一般企業へ転職しましたので、仕事でエクセルのVBAも多少記述しました。退職後ボランティアで地域活動のお手伝いをしていますが、マルチユーザの売上伝票入力のような作業の必要性が発生したので、プログラムを作りたいと思います。 利用できるのは、エクセルとMySQLだけで、メルコのテラステーションのような、RDB付きのファイルサーバは使えて、とりあえず同一LAN内の複数ユーザです。 当時のCOBOLでは、次のようにファイルを扱いプログラムを作っていましたが、現在のエクセルとMySQLでは、どのようにRDBを扱い、プログラムを作るのでしょうか? アドバイスや、参考情報(WEBサイト・文献)紹介などお願いします。 <当時のファイルの扱い方>  1.参照用の得意先/商品/単価マスタ・ファイルを「索引ファイル」で用意する。  2.伝票入力したデータを記憶するジャーナル・ファイルを「相対ファイル」で用意する。  3.制御用のコントロール・ファイルを「相対ファイル」で用意する。  4.ターミナル画面上で、一枚の伝票が完了しオペレータが[OK]ボタンを押すと、コントロール・ファイルの予め決められたレコードを、排他ロックして読み込み、レコード内の最終伝票番号とジャーナルのEOD(ポインタ)を参照して、一意的伝票番号とジャーナル位置を得て、明細データのジャーナルを書き込み、伝票番号とEODをそれぞれインクルメントして制御レコードを上書きする。(マルチユーザに対応するため) <特にアドバイスいただきたい点> 1.当時の「索引ファイル」は、順読み込み・乱読み込み・キー設定後順読み込みなど色々手法がありましたが、SQLでは、何でもかんでもSELECT文で必要あればWHERE句を使うのでしょうか? 2.一意的な伝票番号を得るには、RDBでも上のようにテーブルのレコードロックを使うのが一般的ですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bardfish
  • ベストアンサー率28% (5029/17765)
回答No.2

MicrosoftのVisual Studioのフリーエディション「VisualStudio Express」というものがあり、データベースもMicrosoft SQLServer Expressがあります。 VisualStudioはVisualStudio DesktopというものならばWindowsタブレットではなくWindowsデスクトップ用のソフトも解決できるしVisualBasicも使えます。 SQLServer Expressもライセンスに制約があるだけで機能としては最低限のものが揃っています。運用管理ツールが使えないだけと思ってください。 で、リレーショナルデータベース(SQLServerやOracle、MySQLなど)ではテーブルを作成するとき(CREATE TABLE)にプライマリーキーとインデックスキーを作るのが一般的ですが、インデックスキーはあとからでも追加でき作らなくてもWHERE(抽出)やORDER BY(ソート)で使うことができます。ただ、抽出やソートのときにインデックスを張っているときと貼っていないときとでは結果を得るまでの時間が全然違います。 Accessの場合ですが、インタデックスのないテーブルをループさせる処理で10分かかっていたものがインデックスを張ったら3分かからなくなったということがあります。 レコードロックに関してですが、RDB(リレーショナルデータベース)ではトランザクション処理と呼びます。 PL/SQLとかT-SQLとRDB製品によって呼び方は違いますが、トランザクションの開始のはBEGIN TRANS、処理が正常終了して更新内容を反映させたいときはCOMMIT、エラーが発生し更新開始前の状態に戻したいときはROLLBACK。という流れになります。 .NET版のVBusial BasicではSystem.Data.sqlclientという.NETライブラリを使用するのですが、SqlConnection、SqlCommand、SqlDataReaderとかDataAdapterなどを駆使してトランザクションを実現します。 残念ながらExcel365のVBAでは.NETは使えない感じです。Excel2019では試したことありません。 あとはDataTable、DataRowという変数と同じ使い方が出来るデータオブジェクトがあるのですが、これがまたすごく便利で配列変数とか構造体を使わなくなりました。 Dim TableData as DtaaTable TableDtaa = New DataTable("構造型の形をとった配列みたいなもの") TableData.Columns.Add("列1") TableData.Columns.Add("列2") TableData.Columns.Add("列"3) ' ここまでがCREATE TABLEみたいなモノ。 Dim RowData as DataRow RowData = TableData.NewRow   ' 新しい行の追加を宣言 RowData("列1") = "データ。Excelのセルの値を代入してもいいしテキストボックスに入力された値でもなんでもいい" ' 以降、列3まで値を代入。 TableData.Rows.Add(RowData)   ' セットした値をテーブルに反映 これを繰り返すことで構造体と同じような配列が使えます。 更新対象では泣いてデータベースのテーブルの内容をメモリに持ち続けることができ、DataTable型で宣言した変数に対してSQLみたいに抽出したりソートを掛けたりすることもできます。多少バグがあるみたいですが… VisualBasicでSQLServerに接続するコードとかテーブルのデータを取り出したりINSERTなど結果を返さないコードの書き方はネットを探せばサンプルがたくさん見つかります。 頑張って使い方を覚えてください。 私はVB4とAccess2.0のときに覚えて、VB6にSQLServer4.0を最後に最近までプログラミングから遠ざかっていましたが、今年に入ってから覚え直しました。

ys11_ok
質問者

お礼

早速のご回答ありがとうございます。参考にさせていただきます。

その他の回答 (1)

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.1

excelを使うなら、面倒な事をしないでも、各端末で別々の入力用ブックを立ち上げさせ、各端末での処理が終わったら、マスターになるブックに上書き処理すればオッケー、別にSQLなんぞ走らせなくても済みます。 端末数が少なければ、同時に書き込むことはほぼないので、Excelそのものの排他処理(要は誰かが書いていれば、他の人の書き込みはエラーになる)で十分、同じレコードの複数書き込みも「後に書いた結果が上書きされる」という、作業側の共通認識ですべてが終わります。 企業ではないのですから、きちんとしたマニュアルが継承されることはまず考えられません。ですから、システムの構成は可能な限り単純に誰でもわかるようにしておくことが肝要ですよ。

ys11_ok
質問者

お礼

早速のご回答ありがとうございます。参考にさせていただきます。 随分昔から市販のパソコン売上パッケージでも在庫機能(在庫確認/在庫引き当て)は標準装備なので、質問に詳しく述べて無くて申し訳なかったのですが、オンライン/リアルタイム処理を前提にしています。

関連するQ&A

  • ループの途中でユーザーからの入力を受け付けるには?

    VBのVer.5.0です。 まったくの初心者なのでどなたか教えて下さい。 CSVファイルをEOFまで1件ずつ読み込んで、ある条件に該当したレコードの場合に、フォーム上で修正するようにしたいと思っています。 ループの途中でいったん手続きを中断し、ユーザーからの入力を受け付けるようにするにはどんな命令があるでしょうか。 SetFocusだけではフォーカスが移動するだけで入力できないまま次のレコードの読み込みへと手続きが流れてしまいます。 いったん全レコードを読み込んで変数の配列に格納してから処理するしかないのでしょうか。 以前はCOBOLのプログラミングをしていましたが、項目の入力を受け付けるのは、Acceptという命令でした。 VBでこれに該当するコマンドが何なのか知りたいと思っています。 検索してもどうしても見つけられませんでしたので、よろしくお願いします。

  • インポートの際データが重複して読み込まれてしまう?

    いつも質問ばかりですみません。 別ファイルからデータをインポートする際にどうやっても 変にインポートされてしまいます。 ※リスト形式で表示した下記ファイルがあります  合計6レコード (フィールド)    (フィールド)   (フィールド) 1.「A日付・7/12」「伝票番号・001」 「名前・Z」 2.「A日付・7/12」「伝票番号・002」 「名前・W」 3.「A日付・7/12」「伝票番号・003」 「名前・Y」 4.「A日付・7/13」「伝票番号・004」 「名前・FA」 5.「A日付・7/13」「伝票番号・005」 「名前・W」 6.「A日付・7/13」「伝票番号・006」 「名前・Y」 これを別ファイルにインポートすると (フィールド)    (フィールド)   (フィールド) 1.「A日付・7/12」「伝票番号・001」 「名前・Z」 2.「A日付・7/12」「伝票番号・002」 「名前・W」 3.「A日付・7/12」「伝票番号・003」 「名前・Y」 4.「A日付・7/13」「伝票番号・004」 「名前・FA」 5.「A日付・7/12」「伝票番号・002」 「名前・W」 6.「A日付・7/12」「伝票番号・003」 「名前・Y」 と「名前・W の 伝票番号・002」と「名前・Y の 伝票番号・003」が 重複してインポートされます。(レコードは6個です) さらに再度インポートすると、また重複してインポートされ 且つ、レコードは重複の2を含め、8個になってしまいます。 設定では現在の対象レコード内で一致するレコード更新 一致しないレコードを追加にチェックをしているのですが? つたない説明ですがどなたか回避する方法をご伝授下さい。 使用環境・Mac OS10.3 FM6です

  • データの一部を読み込んで、エクセルファイルを作成

    MySQLで作成したテーブルA(顧客マスター)があります。 レコードの(顧客名、住所、電話番号、担当者)の情報から、エクセルファイルを作成したいと思います。 固定のフォーマットの指定した箇所にデータを入れて作成することは可能でしょうか。 PHPを使って、特定ユーザーがファイルを作成できるしくみを作りたいと思います。

    • ベストアンサー
    • MySQL
  • フォルダ内のファイルを上から読み込み、別ファイルにレコード化して移すとき

    フォルダA   ファイル1      氏名:太郎      番号:3210   ファイル2      氏名:次郎      番号:3211   ファイル3      氏名:三郎      番号:3212 ファイルS   読込ボタン       氏名:     番号: 1.ファイルSの読込ボタンを押す 2.フォルダA内のファイル1の氏名、番号を読込む 3.読込んだ氏名、番号をファイルSに1行のレコードとして書き込む 4.そのままファイル2の氏名、番号を読込みファイルSの3.で書き込んだレコードの下(2行目)に書き込む 5.ファイル3を読込んで、同様の処理を行う。 6.フォルダ内のレコードを全て読み込み、ファイルSに書き込んだら終了 説明が下手ですいません。 要は、ボタン一つでフォルダ内のすべてのファイルの氏名、番号項目を読み込んで別ファイルにレコード化する処理を行いたいのです。 VBAで上記の処理を行いたいのですが、構文が書けずにに悩んでいます。 VBAの勉強を始めたのが4日前で、それ以前に開発の経験はありません。 参考書などを読んでも、参考になる構文が載っておらず、いま一つわかりません。 どなたか、構文を教えて頂けると助かります。 宜しくお願い致します。

  • cobolの超基礎プログラミングについて

    初めまして。 プログラミング未経験からコボルの勉強をしております。 下記の条件のプログラミングを作成したいのですが、 どのようにプログラミングすれば良いのか判らなくて困っております。 皆様のお力添えをいただければと思います。 ・あるファイルには、社員番号、名前、科目、科目得点が入っている。 ・このファイルから得点が70点以上のレコードのみを抽出したい ・科目は3科目あり、今回は国語、数学、英語とする ・終了条件はファイルのデータがなくなるまで 条件は以上です。 現在は主処理のレコード読み込みの繰り返し部分の作成に頭を悩ませております。 ifを使用してプログラミングすると考えたのですが、条件の書き方やどのデータを使用するのか等、まだプログラミングというものが理解できておらず、詳細に教えて下さると全体像がわかるのではと思い質問させていただきました。 お忙しい中恐縮ですが、宜しくお願い致します。

  • アクセス・ファイルメーカーを使っての枝番処理

    はじめまして。データベースソフトに外部CSVファイルを取り込んで伝票処理を行いたく思っています。 取り込むCSVファイルには 伝票番号 枝番 品名 数量 123456  1  ○○  2 123456  2  △△  5 123456  3  ■■  9 123457  1  ◎◎  3 123457  2  ※※  6 ~~~~~~~~~~~~~~ このような感じのCSVデータをデータベースソフトに取り込みたいのですが、一つのレコードに同一伝票番号のデータを多段にして枝番フィールド順に取り込む事は可能でしょうか? 伝票番号 123456 品名1  数量 単価 金額 品名2  数量 単価 金額 品名3  数量 単価 金額 品名4  数量 単価 金額 ~~~~~~~~~~~~ 品名10 数量 単価 金額 ------------------------- 合計      合計金額 こんな感じで表示されたいです。 お知恵を貸してください。

  • spotlightの不具合

    OS10.4.6のi bookユーザーです。 spotlightで様々なワードを入力して検索をかけてみたのですが、ファイルが1つもヒットすることなく、延々とクルクル回り続けて、検索が終わりません。 apple discussionのサイトを見てみたところ、同じような症状の方もいるようで、解決には以下に挙げる2通りの方法があるようですが…。 1.Terminalを使って、sudo mdutil -E /として索引を作り直させる →Terminalってどこにあるんですか? 2.spotlightのインデックスを作り直す為に、システム環境設定のspotlightの項目にある、プライバシーにHDDをドラッグする →ハードディスクを登録しようとしても、登録できない こんな散々な状況です。 できるだけ丁寧に説明いただけると助かります。よろしくお願いします。

    • 締切済み
    • Mac
  • VBAでインポート元ファイルの読込可否を判別するには?

    AccessVBAであるCSVファイルをインポートして処理を行っています。 インポート元であるCSVファイルは2分毎に更新されており、データ量が多い関係上書込みに十数秒掛かっています。 この間にAccessからCSVファイルのインポートを掛けると 「ほかのユーザーが排他的に開いているか、データを読み取る権限がありません。」 と出てしまいます。 このことから、 1.ファイル読込の可否を判別し、可能ならテーブルのレコードを削除しインポートを行う 2.不可ならテーブルにある既存のデータを用い集計を行う という一文をIf関数を用いた形で追加したいのですが、インポート元のファイルの読込可否を判別する方法はありますでしょうか? 識者の方アドバイスの程よろしくお願い致します。

  • 起動毎にspotlightが索引を・・・

    iBookを起動後、何もしないで再起動しても、spotlightがおよそ10分の索引作りを始めます。 うざいです。なんとかならないでしょうか。 環境は、 iBook G4 1.2Ghz 768MB 80GBHD ディスクユーティリティのHD情報 名前 : *** 種類 : ボリューム ディスク識別子 : disk0s3 マウントポイント : / ファイルシステム : Mac OS 拡張(ジャーナリング) 接続バス : ATA パーティションのタイプ : Apple_HFS 装置ツリー : pci2/ata-6@D/@0:3 書き込み可能 : はい UUID : BCBD2BB3-524B-3178-9A9C-58A9B9E31F13 最大容量 : 74.4 GB(79,892,103,168 バイト) 空き領域 : 28.9 GB(31,023,452,160 バイト) 使用状況 : 45.5 GB(48,868,651,008 バイト) ファイル数 : 276,284 フォルダ数 : 71,884 所有権が有効 : はい 所有権を無視可能 : はい アクセス権修復可能 : はい 検証可能 : はい 修復可能 : はい フォーマット可能 : はい 起動可能 : はい ジャーナル記録利用可能 : はい ジャーナル記録済み : はい S.M.A.R.T. 状況 : 検証済み ディスク番号 : 0 パーティション番号 : 3

    • 締切済み
    • Mac
  • Excelから伝票を入力して帳簿をつける

    Sheet1に伝票の数値を入力して帳簿の形式を取ったSheet2~16に各々データを転記するように関数を使って作っています。 しかし問題が発生してしまいました。 複数の品物が日々で出ない時がありSheet1に入力したものをSheet2~16に一括で出力するように作ってしまったために品物が出ないときの日は、出ていないSheetに空白ができてしまいます。 そこで並び替えをしたいのですが、   A  B  C  D  E 1 ○  ○        ○ 2       ○  ○  ○ 3 ○  ○        ○ 4       ○  ○  ○ 1と2で1日分なうえに並び替えをすると数値が詰まってしまう始末です。 同僚には、伝票の形式のまま入力して伝票に上から順々に出力になるのが理想だと言われたのですが、今の考え方では無理そうです。 そこで質問なのですが、 1.並び替えをするにはどうしたら良いでしょうか? 2.仮にマクロ又はVBEを使って理想だと思われる方法でのデータ作成は可能でしょうか? 長文になってしまい申し訳ありませんが、よろしくお願いします。

専門家に質問してみよう