- ベストアンサー
access2000について
在庫管理から売上(社内)管理のシステムを構築し、使っているのですが、売り単価が変更になった場合、過去の売上データが変わってしまいます。 商品コードは変更しないで単価を変えることは出来ませんか? access暦は長いのですが、独学なので解からないことだらけです。どうぞよろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>売り単価が変更になった場合過去の売上データが変わってしまいます。 原因は2通りあります。 1.リレーションで参照整合性のフィールドの連鎖更新が設定されている。そのため商品のマスタの売り単価が変更されると過去の売上のレコードまで変更されてしまう。 2.過去の売上データに売り単価のフィールドがなく保存されていない。そのため商品のマスタの売り単価を参照するので変更されれば変更後の金額でしか計算できない。 1の場合は売り単価が変更されると自動的に過去の売り単価も変更されてしまいます。連鎖更新が設定されていればチェックをはずし売り単価が変更になっても更新されないようにすれば大丈夫です。 2の場合は他の方が書いてありますが商品のマスタの売り単価のみで売り単価をクエリ等で演算している場合は売り単価が変更になれば変更後の金額でしか過去の売り単価も計算できません。 売上時の売り単価で過去のレコードも計算したいのであれば売上時の売り単価を保存するフィールドをそのテーブルに作り売上時の売り単価を保存するしかありません。 売り単価がいつ変更になったかが分かるテーブルでもあれば売上のレコードの売上日と売り単価変更日を参照してその時点での売り単価で計算することはでいますが。
その他の回答 (3)
私の場合、将来内容が変更になる可能性のあるものは、冗長になってもテーブルにそのデータ(この場合は売上テーブルの単価フィールドとして)を入れてしまいます。 どうしてもルックアップ系で使いたいのなら、 単価マスターの履歴管理をしなければならないでしょう。 単価マスターにサブコードなどを追加し、商品コードとそのサブコードを売上テーブルに保存するしかないでしょう。 でもコードが複雑になるのであまりお勧めしませんが...
お礼
単価マスターにサブコード。方法として大変参考になりました。ありがとうございました。
- DexMachina
- ベストアンサー率73% (1287/1744)
過去の売上データが変わってしまうとのことですが、売上を選択クエリ上で演算結果として表示させている、ということでしょうか? もしそうではなく、テーブル上に売上データを記録するフィールドがあって、アクションクエリ(更新/追加)で記録しているのだとすれば、そのクエリにWhere条件を追加することで対処できる気がするのですが・・・。 (例えば、fuuten_no_nekoさんがいわれているような「出庫日時」など) 私も独学なので、見当違いでしたら済みません。
お礼
すみません。説明が不足していまして。。。 リレーションを組んでいて、売上データには、ID・日付・数量の情報。商品マスタには、ID・品名・単価の情報。でクエリで売上金額を算出してるんです。 #04、O_cyanさんの参照整合性フィールドの連鎖更新・・・が、まずは簡単そうなのでトライしてみます。 ありがとうございました。
データ構造を変更しなければならないでしょう。 例えば現在 商品マスタ 商品コード(PKey)、商品名、単価、. . . . を二つのテーブルに分け 商品マスタ 商品コード(PKey)、商品名、. . . . 単価リスト 単価ID(Pkey)、商品コード、単価、開始日時、終了日時、. . . . みたいにすれば、これでリレーションが取れます。出庫時の日時が記録されていなければ駄目ですが、もしそうならばそこから直さなければ。 とにかく基本的な部分の変更なので、かなりしんどいでしょう。ご健闘を祈ります
お礼
早速ありがとうございました。 こんな方法もあるのか・・・と感心しております。 大変参考になりました。ありがとうございました。
お礼
何か設定があるはず!って思っておりました。 たぶん「連鎖更新」で回避できると思うので、がんばってみます。 貴重なお時間とアドバイスありがとうございました。