2

国コードを含むすべての国のコードリストがあるとしましょう。国コードはCountriesテーブルの主キーであり、データベースの多くの場所で外部キーとして使用されます。私のアプリケーションでは、国は通常、複数のフォームのドロップダウンとして表示されます。

過去に存在していた国のいくつかは、もはや存在しません。たとえば、SCGの国コードを持っていたセルビアとモンテネグロ。

私には2つの目的があります。

  • ユーザーがこれらの古い値を使用することを許可しないでください(したがって、データを挿入するときにこれらの値がドロップダウンに表示されないようにする必要があります)
  • ユーザーは引き続き古いものを(読み取り専用で)開くことができるはずです。この場合、非推奨の値がドロップダウンに表示されます。

2つのオプションがあります。

  • 非推奨の値の名前を、たとえば「CountryName」から「!!!!!CountryName」に変更します。このアプローチは実装が最も簡単ですが、明らかな欠点があります。
  • IsActive列をCountriesテーブルに追加し、非推奨のすべての値についてはfalseに設定し、その他のすべての値についてはtrueに設定します。ユーザーがデータを挿入できるすべてのフォームで、アクティブな値のみを表示します。読み取り専用フォームでは、すべての値(非推奨の値を含む)を表示できるため、ユーザーは古いデータを表示できます。ただし、一部のフォームでは、ユーザーはデータも編集できる必要があります。つまり、非推奨の値はユーザーから非表示にする必要があります。つまり、各ドロップボックスには次のような初期化ロジックが必要です。表示されるデータが読み取り専用の場合は、非推奨の値をドロップボックスに含め、データも編集用の場合は除外します。しかし、これは多くの作業とエラーが発生しやすいものです。

そして他のアイデア?

4

4 に答える 4

6

あなたが説明したように、私はこのシナリオをよく扱い、「アクティブ」フラグを使用して問題を解決します。ドロップダウン リストに値を入力すると、「アクティブな」データのみが読み込まれ、非推奨の値が 1 つまで含まれますが、それが使用されている場合に限ります。(つまり、私が個人レコードを見ていて、その人が非推奨の国を持っている場合、その国はアクティブな国とともにドロップダウンリストに含まれます。私はこれを読み取り専用および編集モードで行います。私の場合、たとえば、個人レコードに非推奨の国がリストされている場合、引き続き使用できますが、非推奨でない国に変更して保存すると、元に戻すことはできません(ユースケース異なる場合があります)。

したがって、重要な違いは、読み取り専用モードであっても、非推奨の国をすべて DDL に追加するわけではなく、私が見ているレコードに適用される非推奨の国だけを追加することです。すでに使用されています。

ドロップダウン リストをロードするときに使用するロジックの例を次に示します。

    protected void LoadSourceDropdownList(bool AddingNewRecord, int ExistingCode)
    {
        using (Entities db = new Entities())
        {
            if (AddingNewRecord) // when we are adding a new record, only show 'active' items in the drop-downlist.
                ddlSource.DataSource = (from q in db.zLeadSources where (q.Active == true) select q);

            else // for existing records, show all active items AND the current value.
                ddlSource.DataSource = (from q in db.zLeadSources where ((q.Active == true) || (q.Code == ExistingCode)) select q);

            ddlSource.DataValueField = "Code";
            ddlSource.DataTextField = "Description";
            ddlSource.DataBind();

            ddlSource.Items.Insert(0, "--Select--");
            ddlSource.Items[0].Value = "0";
        }
    }
于 2012-08-21T14:01:00.067 に答える
1

レコードを読み取り専用で表示しているのに、わざわざデータをロードする必要はありません。

これが私がすることです:

いずれにせよ、レコードには国コードが含まれます。また、国の説明を返すことも提案します (これにより効率が低下することは確かです)。ただし、ユーザーが「古いもの」をロードすると、ビジネス サービスはこのレコードが読み取り専用であることを認識します。また、国のリストをロードする必要もありません (これにより効率が向上します)。

私のプレゼンテーション サービスでは、通常、国のリストが null かどうかを確認します。そうでない場合 (r/w) データをリスト ボックスに読み込みます。そうでない場合 (r/o) レコード内のデータからリスト ボックスを読み込みます。リスト内の 1 つのエントリは読み取り専用に相当します。

于 2012-08-21T14:51:49.863 に答える
0

CollectionViewSource でフィルタリングするか、LINQ を使用して完全なリストをフィルタリングする Public Enumerable を作成することができます。

CollectionViewSource クラス

LINQ FieldDef.DispSearch はアクティブな条件です。IEnumerable は、List よりもパフォーマンスが少し優れています。

public IEnumerable<FieldDefApplied> FieldDefsAppliedSearch
{
    get
    {
        return fieldDefsApplied.Where(df => df.FieldDef.DispSearch).OrderBy(df => df.FieldDef.DispName);
    }
}
于 2012-08-21T13:57:01.373 に答える
0

なぜ (たとえば) 顧客の住所を古い国コードで表示したいのでしょうか?
私の理解が正しければ、現在もまだ「セルビアとモンテネグロ」を指している「住所」レコードがあります。その問題を解決すれば、現在の質問は存在しないと思います。

ISO 3166 のすべての「国」が実際に独立しているわけではありません。むしろ、それらの多くは地理的に離れた地域であり、法的には他の国の一部または従属国です。

また、「撤回された国コード」は 5 年間予約されていることに注意してください。つまり、5 年後に再利用される可能性があります。そのため、国コード自体を主キーとして使用しないようにすることは、特に歴史的な理由で以前の国コードを遡る必要がある場合は、私にとって理にかなっています。

それでは、新しい国 ID を指す「撤回された」フィールド/テーブルを作成してみませんか。このフィールドが空であるか、必要に応じて真/偽のチェックを取得する必要があるかどうかを引き続き確認できます (たとえば、SQL では、既にテーブルを使用しているため)。

私の見方:「国」コードは変更される可能性があり、国は合併する可能性があり、国は分割される可能性があります。

国が変更または合併された場合、簡単なクエリで住所レコードを更新できます。

国が分かれている場合は、どの住所がどの国の一部であるかを判断する方法が必要です。自動化されたシステムを使用してこれを行うことができます(そして、それについて長い本を書くことができます)。
または
(フォーラムのようなサイトの場合)、アカウントに複数の選択肢を示す撤回された国をまだ持っているユーザーに、ログイン時に国エントリを更新するように依頼することができます。この国では、新しい国のリストからのみ選択できます。撤回されたフィールドに指定されているもの。

この簡略化された国テーブルのセットアップを考えてみてください。

id  cc  cn                     withdrawn
1   DE  Germany
2   CS  Serbia and Montenegro  6,7
3   RH  Southern Rhodesia      5
4   NL  The Netherlands        
5   ZW  Zimbabwe
6   RS  Serbia
7   ME  Montenegro

この例では、country-id 3 のアドレス レコードは、country-id 5 へのクエリで更新され、ユーザーの操作 (またはその他のソリューション) は必要ありません。
ただし、country-id 2 を指定するアドレス レコードは、country-id 6 または 7 を選択するよう求められます (もちろん、ユーザーに表示されるテキストでは、country-name を使用します)、またはカスタムの自動更新ルーチンを実行するために選択されます。

また、「撤回」は繰り返しグループであるため、別のテーブルにすることができます/する必要があります。

このアイデアを (ダウンタイムなしで) シナリオに実装する:

  • sql ステートメントを使用して、数値 ID を主キーとして新しい国テーブルを作成します。
  • sql ステートメントを使用して、新しいフィールド 'country-id' で住所レコードを更新し、このフィールドに、そのレコードの住所フィールドで指定された国コードに対応する新しい国テーブルからの国 ID を入力します。
  • (sql statement to) 撤回されたテーブルを作成し、そこに正しいデータを入力します。
  • 次に、フォームにデータを提供するSQLステートメントを書き直します
  • チェックを追加し、「国を更新するようユーザーに依頼する」ルーチン
  • 新しいフォームを公開しましょう
  • 意図しないバグを待つ
  • 「住所」テーブルから古い国テーブルと(現在は使用されていない)国コード列を削除します

他の専門家がこのアイデアについてどう思うか非常に興味があります!!

于 2012-08-21T13:57:21.357 に答える