メールマガジン【アクセスで作るシリーズ】


バックナンバー 【会計ソフト編】 Vol.57
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

    ACCESSで作るシリーズ  【会計ソフト編】

    発 行 : Yoshihisa Fukuda          2001. 6.30 Vol.57

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------

 今回は勘定科目設定の科目IDの欠番対策の解説です。

== ◇ 第5章 拡張機能     ====================

--------------------------------------
 第12回 勘定科目設定の科目IDの欠番対策(解説)
--------------------------------------
--------------------------------------
今回は前回の勘定科目設定の欠番対策の考え方の解説です。

前回のプログラムでは、バイナリサーチという検索方法を使用しました。
プログラム開発に携わる方なら、ご存知の方も多いと思いと思いますが、まず、原理
としては、データ全体を2分割し、検索したい値がどちらにあるかを調べます。
そして、検索したい値が含まれているデータを再び2分割し、またどちらにあるかを
調べて・・・という風に、どんどん2分割しながら検索値を探していくのがバイナリ
サーチです。

例えば下記のようなテーブルがあったとします。

FIELD_1
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10

検索したい値が2だとすると、まず上記テーブルを1~5と6~10に2分割し、
2がどちらにあるか調べます。
この場合、1~5の方にあるので、次に1~5を1~3と4~5に2分割します。
そして、2は1~3の方にあるので、今度は1~2と3に2分割します。
すると2は1~2の方にあるので1と2に2分割し最後に2のあるレコードが見つか
ります。

もうお気付きかも知れませんが、このバイナリサーチには条件があります。
それは、検索したいフィールドの値でデータがソートされている事。
また、検索したいフィールドの値がユニーク(一意)である事。

今回の欠番対策には、このバイナリーサーチを使用した訳ですが、少しおかしいな
と思われた方もいらっしゃるかも知れません。
そうです。今回はこの検索したい値、これが欠番でその値を知りたい訳です。
検索したい値が分かっていれば、欠番が分かっていると言う事ですから。

そこで、今回の欠番を探す原理です。

勘定科目テーブル
科目ID  レコード番号
  1      1      <--  1レコード目
  2      2      <--  2レコード目
  3      3      <--  3レコード目
  5      4      <--  4レコード目
  7      5      <--  5レコード目
  8      6      <--  6レコード目
  9      7      <--  7レコード目
 10      8      <--  8レコード目
 12      9      <--  9レコード目
 13     10      <-- 10レコード目

これを見て頂ければ分かると思いますが、科目IDとレコード番号が異なっていると
そこに欠番があると言う事になります。
上から順番に見ていくと、科目IDが1でレコード番号1。
科目IDが2でレコード番号2。
科目IDが3でレコード番号3。
とここまで科目IDとレコード番号が同じなので欠番はありません。
次に科目IDが5でレコード番号4と、科目IDとレコード番号が異なった所で欠番
が発生しています。
これをバイナリサーチを用いて検索すれば良いのです。

と言葉で言うのは簡単ですが、いざこれをプログラムにしようと思うと考えてしまい
ますね。

では、最初からじっくり見ていきましょう。
まずデータを2分割します。

  1      1      <--  1レコード目
  2      2      <--  2レコード目
  3      3      <--  3レコード目
  5      4      <--  4レコード目
  7      5      <--  5レコード目

ここで分割

  8      6      <--  6レコード目
  9      7      <--  7レコード目
 10      8      <--  8レコード目
 12      9      <--  9レコード目
 13     10      <-- 10レコード目

分割したデータの1つ目(1~5レコード)の最後のデータ(5レコード目)に着目
し、科目IDとレコード番号を比較します。
これが同じだと1つ目(1~5レコード)のデータ内には欠番は無いと言う事です。
逆に、科目IDとレコード番号が異なっていると、このデータの中に欠番が存在する
と言う事です。
この例では科目IDが7、レコード番号が5なので、欠番が存在している事が分かり
ます。
次に1~5レコードを2分割します。

  1      1      <--  1レコード目
  2      2      <--  2レコード目
  3      3      <--  3レコード目

ここで分割

  5      4      <--  4レコード目
  7      5      <--  5レコード目

※ この様に2分割で割り切れない(奇数レコード)の場合、まん中のレコードは
  どちらに入れても結果に変わりありません。
  今回の例では前に含めています。

再び、2分割したデータの1つ目(1~3レコード)の最後のデータ(3レコード目)
に着目しましょう。
科目IDが3で、レコード番号も3で同じですね。
従って、この1つめのデータ内には欠番は存在しない事が分かりました。

では、次に4~5レコードを2分割します。

  5      4      <--  4レコード目

ここで分割

  7      5      <--  5レコード目

また、同じく1つ目(4レコード目)の最終のデータ(4レコード目)に着目しま
しょう。
科目IDが5で、レコード番号が4ですから、この中に欠番が存在する事が分かりま
したね。

では、次に2分割と言う所ですが、もう1レコードなので分割出来ません。
この様に分割出来なくなるまで続けていくと、最初の欠番が見つかる訳です。
この場合、最後に見つかったレコードのレコード番号、即ち4が欠番であると判明
しました。

原理的には、理解して頂けた事と思います。

次回は、今回の理論に基づき、プログラムを解説したいと思います。
______________________________________
◆◇ Q&Aコーナー    ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

 今回はありません。

______________________________________
◆◇ お知らせ       ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

その1.

 約1年半と言う、長期に渡り発行してまいりました、このメールマガジンも、いよ
 いよ、最終回を迎えようとしております。

 予定では、次回が今回の続きで「勘定科目設定の科目IDの欠番対策(解説2)」
 となり、その次が最終回(総まとめ)となる予定でいます。
 そこで、最後に皆様からのQ&Aを受け付けたいと思います。
 今までの所で、よく解らなかった事、何か気になる点などありましたらメールして
 下さい。

 一応、最後のチャンスとなりますので、後悔の無いように些細なことでもご質問
 下さい。(もしQ&Aが多い場合、最終回が延びる可能性もあります)

その2.

 ACCESSで作るシリーズ【会計ソフト編】の続編について、題材がまだ、確定して
 いません。
 何か、題材に取り上げて欲しいソフトがあれば、メールして下さい。

 尚、【会計ソフト編】が終わってから、続編発行までに、少しの間、準備期間を
 設けさせて頂きますので、ご了承下さい。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

◇ ACCESSで作るシリーズ 【会計ソフト編】
◇ 発 行 元  :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
  ご質問等   :fukuda@shun-net.com

◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
  しています。(まぐまぐID:0000030446)
◇ バックナンバー:http://www.shun-net.com/fukuda/
◇ 登録・解除  :http://www.shun-net.com/fukuda/

 Copyright(C) 2000-2001 Yoshihisa Fukuda All rights reserved.

◇転載について
 このメールマガジンの無断転載などは、一切禁止です。
 転載をご希望の方は、事前にメールで連絡をください。
◇免責
 このメールマガジン及びホームページの内容による、いかなる損害、障害などに
 関して発行者は一切の責任を負いません。
 掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□