8 返信 最新の回答 日時: Apr 8, 2014 1:05 AM ユーザー:Shin

    複雑な設定値の定義と取得の仕方

    Nu-nrg

      タイトル

      複雑な設定値の定義と取得の仕方

      フォーラムに投稿

           減価償却の計算するデータベースを作っているのですが、
           添付の図のように、適用年ごと、耐用数年ごとに、各償却率などの規定値があります。

           これを、レコードのあるフィールド値のときに、
           例)
           取得日がH19/5/1、耐用年数が15年、償却方法が定額法、とフィールルドに値を入れたら、
           償却率は0.067を返す

           のように、条件に見合った値を取ってくるようにしたいのですが、
           レコード系に格納するべきか、関数内に全部条件分岐で設定しておくか、どのような方法が良いでしょうか。
           やはり複数レコードとして保存しておいて、ExecuteSQLでしょうか。

           PS:消費税率なんかも適用開始日、適用終了日、税率としてExecuteSQLのサンプルはみました。

           アドバイス等ありましたらお願いいたします。

           環境:ad12

      %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-04-08_12.29.29.png

        • 1. Re: 複雑な設定値の定義と取得の仕方
          Shin

               その表をテーブルにしておいて、取得日付と耐用年数からルックアップしておくのが、一番簡単でしょうね。

          • 2. Re: 複雑な設定値の定義と取得の仕方
            Nu-nrg

                 だいたいこういう設定値はみなさんルックアップ(リレーション条件設定)されているのでしょうか?

            • 3. Re: 複雑な設定値の定義と取得の仕方
              Shin

                   この表も、時によって変更されますね。(償却率は少ないですが)

                   変更された場合に、テーブルの内容を追加するだけで対応できますので、マスターテーブルの形で管理するのが楽でしょう。

                   もうひとつのメリットとして、その変更の日マタギで、元伝票が変更された場合です。それも、日付の変更だけで処理が完了するでしょう。

                   参照する数字は、ルックアップする方法と、関連レコードとして持ってくる方法があります。(実は私は後者が好きです)

                   出した計算結果に対して、色々と処理が加わる際には、前者のほうが計算が早くなると思われます。

              • 4. Re: 複雑な設定値の定義と取得の仕方
                sago350@未来Switch

                     テーブルで保存しておいて、、、

                     持ってくる場所が少ない場合→リレーションかルックアップか、その当たり(リレーション条件設定)
                     持ってくる場所が多い場合 →ExecuteSQLか、サブスクリプト化して引数と戻り値で処理(組み合わせても)

                     理由は、メンテナンス性を考えて。
                     法律が変わりそうだと、サブスクリプト化の方にするかも。(どんな条件に変わっても、なんとかなりそうですし)

                • 5. Re: 複雑な設定値の定義と取得の仕方
                  Nu-nrg

                       マスターテーブルの設計なんですが、
                       列(フィールド)と行(レコード)をどのように設計したほうが良いでしょうか。

                       耐用年数は2〜50年はいつも変わらないとして、償却率等が時代により変更された場合は列(フィールド)を増やす、
                       それとも別添のとおり、行(レコード)に増やす。

                       ルックアップと関連レコード案を教えていただきましたが、
                  ExecuteSQLでも考えておりまして、というのは関数化したいです。

                  検索というかリレーション条件の流れは、
                  1)取得日を、適用期間に当てはまる条件を満たし、
                  2)耐用年数が一致する場合の、
                       3)償却方法が定額法なら、定率法なら、
                       4)返す値は定額法償却率、定率法償却率、改訂償却率(定率法)、保証率(定率法)

                       全部で取得する値は4種類のような関数を作りたいです。

                       アドバイスをお願いいたします。

                  • 6. Re: 複雑な設定値の定義と取得の仕方
                    Nu-nrg

                         ちなみに法律が変わっても、旧法律適用時に取得した場合の試算もさかのぼって出来るようにしておきたいです。

                    • 7. Re: 複雑な設定値の定義と取得の仕方
                      sago350@未来Switch

                           "私なら"の話ですが、カスタム関数使ってガリガリ書くより、スクリプトで書くと思います。
                           それなら、どんな複雑に法律が変わったとしてもスクリプトなんで、解りやすいかなと。

                           具体的な中身は、複数の引数貰って検索実行して、1件なら戻り値(スクリプトの結果)で返して、複数ならエラーダイアログ出す〜〜

                           といった感じで。

                      • 8. Re: 複雑な設定値の定義と取得の仕方
                        Shin

                             その設計でいいのでは。

                             フィールドの定義をできるだけ変えないのがいいと思います。

                             その構造でしたら、日付の比較と耐用年数のリレーションで、目的のレコードが特定できます。