階層的なデータ ソースから繰り返しカスケード リストを作成する - Greg Collins
in

InfoPath Dev

This Blog

Syndication

Archives

Greg Collins

階層的なデータ ソースから繰り返しカスケード リストを作成する

1 つのボックスの選択肢が別のボックスの値に依存する 2 つ以上のリスト ボックスが必要になることはよくあります。これは、カスケードリストと呼ばれます。カスケードを実行できるのは、最小 2 レベルからで、最大レベル数の制限はありません。以下はカスケードリストを必要とする一般的なシナリオの例です。

  • 場所: 州/市
  • 車両: メーカー/車種/装備
  • 学校: 年度/学期/授業科目/講師

カスケードのレベル数が増えると、それにかかわる処理と作業もより複雑になります。また、カスケードリストが繰り返しテーブルまたは繰り返しセクション内に表示される場合は、別の問題、「データのクロスオーバー」に対処する必要があります。データのクロスオーバーとは、特定の行のカスケードに表示されるオプションが、他の行で先に選択された値の影響を受けることを意味し、これによって真のカスケード効果が失われます。

このタスクでは、リストの設定に使用されるさまざまな値を含むフラットなセカンダリ データ ソースを作成します。次にドロップダウン リストボックスを使用して、レベルが 3 つある繰り返しカスケード リストを作成します。カスケード レベルを 3 つ作成するのは、レベルが 3 つ以上になると複雑さが増すことを示すためです。データのクロスオーバーの問題は、current 関数を使用して解決します。最後に、カスケード内で先に選択されていた項目が変更されたときに選択済みのリストの値をクリアする方法で、選択項目の組み合わせが常に有効になるようにします。
 
階層的なセカンダリ データ ソース

階層的なデータソースは、一般に XML で使用するために作成され、通常、フラットなデータソースよりも構造的で組織的です。階層を整理する方法は多数ありますが、ここでは、タスクに適した構造を選択しています。階層構造では、通常、一意の値だけが各リストに表示されますが、それでもやはり一意の値を表示するためのフィルタが必要な場合は、「リストに一意のオプションだけを表示する」を参照してください。まず、階層的なセカンダリ データ ソースを作成します。

階層的なセカンダリ データ ソースを作成する

次のコードをテキスト エディタにコピーし、Vehicles - Hierarchical Data Source.xml という名前でファイルを保存します。このファイルをこれから作成するフォームでセカンダリ データ ソースとして使用します。

<?xml version="1.0" encoding="UTF-8"?>
<Vehicles>
    <Year value="1963">
        <Make value="Chevrolet">
            <Model value="Corvette"/>
            <Model value="Nova"/>
        </Make>
        <Make value="Porsche">
            <Model value="356"/>
            <Model value="Carrera"/>
        </Make>
    </Year>
    <Year value="1973">
        <Make value="Ford">
            <Model value="Bronco"/>
            <Model value="Mustang"/>
            <Model value="Pinto"/>
        </Make>
        <Make value="Toyota">
            <Model value="Celica"/>
            <Model value="Land Cruiser"/>
        </Make>
    </Year>
    <Year value="1979">
        <Make value="Jaguar">
            <Model value="XJ6"/>
        </Make>
        <Make value="Pontiac">
            <Model value="Trans Am"/>
        </Make>
        <Make value="Volvo">
            <Model value="240"/>
            <Model value="244DL"/>
        </Make>
    </Year>
    <Year value="1987">
        <Make value="Dodge">
            <Model value="Ram Charger"/>
            <Model value="Grand Caravan"/>
        </Make>
        <Make value="Honda">
            <Model value="Civic"/>
            <Model value="Prelude"/>
        </Make>
        <Make value="Nissan">
            <Model value="300ZX"/>
            <Model value="Pulsar"/>
            <Model value="Sentra"/>
        </Make>
    </Year>
    <Year value="1999">
        <Make value="GMC">
            <Model value="Jimmy"/>
            <Model value="Sierra 2500 HD"/>
            <Model value="Yukon"/>
        </Make>
        <Make value="Honda">
            <Model value="Passport"/>
            <Model value="Prelude"/>
            <Model value="CR-V"/>
        </Make>
        <Make value="Jeep">
            <Model value="Cherokee"/>
        </Make>
        <Make value="Mercury">
            <Model value="Grand Marquis"/>
            <Model value="Sable"/>
            <Model value="Villager"/>
        </Make>
        <Make value="Pontiac">
            <Model value="Firebird"/>
            <Model value="Montana"/>
            <Model value="Sunfire"/>
        </Make>
    </Year>
    <Year value="2003">
        <Make value="Dodge">
            <Model value="Dakota"/>
            <Model value="Caravan"/>
            <Model value="Ram Charger"/>
            <Model value="Viper"/>
        </Make>
        <Make value="Mercury">
            <Model value="Sable"/>
        </Make>
    </Year>
    <Year value="2004">
        <Make value="Dodge">
            <Model value="Stratus"/>
            <Model value="Viper"/>
        </Make>
        <Make value="Ford">
            <Model value="Crown Victoria"/>
            <Model value="F250"/>
            <Model value="Thunderbird"/>
        </Make>
        <Make value="GMC">
            <Model value="Sierra 3500"/>
        </Make>
        <Make value="Jeep">
            <Model value="Grand Cherokee"/>
            <Model value="Liberty"/>
        </Make>
    </Year>
</Vehicles>


フォーム

階層的なセカンダリ データ ソースができたので、これからフォームを作成します。まず、レベルが 3 つある繰り返しカスケードリストをサポートする単純なスキーマを設計します。次に、繰り返しテーブル内のドロップダウン リストボックスを使用して、レイアウトを設計します。レイアウトができたら、カスケードの作成に集中します。

セカンダリ データ ソースをフォームに追加する

  1. 新しい空白のフォームをデザインします。
  2. [Tools] メニューの [Data Connections] をクリックし、[Add] をクリックします。
  3. Data Connection Wizard (データ接続ウィザード) の [Receive Data] をクリックし、[Next] をクリックします。
  4. [XML Document] をクリックし、[Next] をクリックします。
  5. [Browse] をクリックし、Vehicles - Hierarchical Data Source.xml ファイルを探して選択し、[Open] をクリックします。次に、[Next] をクリックします。
  6. [Finish] をクリックし、[Yes] をクリックしてから、[Close] をクリックします。

スキーマの作成

  1. [Data Source] 作業ウィンドウを開きます。
  2. 「Vehicles」という名前のグループを追加します。
  3. [Vehicles] グループをクリックし、「Vehicle」という名前の繰り返しグループを追加します。
  4. [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。

ビューの設計

  1. [Vehicle] を右クリックし、[Repeating Table] をクリックします。
  2. 見出し行の3 つのセルをすべて選択し、フォント サイズを「8」に設定します。
  3. 3 つのテキストボックスをそれぞれ右クリックし、[Change To | Drop-Down List Box] をクリックします。この結果を図 1 に示します。


図 1 繰り返しカスケード ドロップダウン リスト ボックスのレイアウト

  1. 繰り返しテーブルのラベルをダブルクリックします。
  2. [Repeating Table Properties] ダイアログボックスの [Data] タブで、挿入ボタンのヒントのテキストを「Insert Vehicle」に変更し、[OK] をクリックします。


カスケード リスト

フォームのレイアウトができたので、タスクの主目的である繰り返しリストを別のリストからカスケードさせる作業に入ります。処理はそれほど難しくありませんが、カスケード レベルの数が増えるごとに複雑さも増します。カスケードの作成にはフィルタの使用が必要です。リストボックスに表示されるオプションは、前のリスト ボックスで選択された値に基づいてフィルタされます。作成するカスケードは繰り返し構造なので、current 関数を使用して、フィルタが他の行の値にクロスオーバーしないようにする必要があります。それでは、用意しているセカンダリ データ ソースを使用して、各ドロップダウン リスト ボックスのオプションを設定し、カスケード フィルタを作成しましょう。

[Year] ドロップダウン リストを設定する

  1. [Year] ボックスをダブルクリックします。
  2. [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
  3. [Data Connection] ボックスの一覧の [Vehicles - Hierarchical Data Source] をクリックします。
  4. [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Year/value] をクリックしてから、[OK] を 2 回クリックして、開いているダイアログ ボックスを閉じます。

[Make] ドロップダウン リストを設定する

  1. [Make] ボックスをダブルクリックします。
  2. [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
  3. [Data Connection] ボックスの一覧の [Vehicles - Hierarchical Data Source] をクリックします。
  4. [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Year/Make/value] をクリックします。

現在の行の [Year] の選択値に基づいて [Make] ドロップダウン リストをフィルタする

  1. [Filter Data] をクリックし、[Add] をクリックします。
  2. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
  3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Year/value] をクリックし、[OK] をクリックします。
  4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
  5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
  6. 次の式を入力します (図 2 を参照)。

current()/my:Year


図 2 [Year] を現在の行の値と比較するためのフィルタ

  1. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

データ クロスオーバーの問題が発生することは前に述べました。データ クロスオーバーの例は、図 3 と図 4 の違いに示されています。current 関数を使用しない場合、車両のメーカーは、現在繰り返しテーブル内で選択されているすべての年式でフィルタされるため、無効な選択項目の組み合わせが表示されます。したがって、年式で 1963 年、1979 年、および 2004 年の 3 行が選択されている場合、それぞれの [Make] ボックスの一覧には、図 4 のように、選択されている 3 つの年式のメーカーすべてのリストが含まれます。current 関数を適切に使用すると、[Make] ボックスの選択項目が、同じ行の [Year] ボックスで選択された年式の項目に限定されるので、データのクロスオーバーを回避できます。これを図 3 に示します。


図 3 current 関数を使用して年式でフィルタされた車両メーカー


図 4 current 関数を使用しないで年式でフィルタされた車両メーカー

ここまでで、レベルが 2 つの繰り返しカスケードができました。[Make] ボックスのオプションは、現在の行で選択されている [Year] の値に基づいてフィルタされます。これについては、フォームをプレビューしてテストできます。次は、第 3 レベルのカスケードを作成します。ここから、カスケードのレベルを追加作成するたびにどんどん複雑になってくることがわかります。

[Model] ドロップダウン リストを設定する

  1. [Model] ボックスをダブルクリックします。
  2. [Drop-Down List Box Properties] ダイアログ ボックスで、[Look Up Values In A Data Connection] をクリックします。
  3. [Data Connection] ボックスの一覧の [Vehicles - Hierarchical Data Source] をクリックします。
  4. [Entries] テキスト ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Year/Make/Model/value] をクリックします。

現在の行の [Year] の選択値に基づいて [Model] ドロップダウン リストをフィルタする

  1. [Filter Data] をクリックし、[Add] をクリックします。
  2. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
  3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Year/value] をクリックし、[OK] をクリックします。
  4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
  5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
  6. [Insert A Formula] ダイアログ ボックスに次の式を入力します。

current()/my:Year

  1. [OK] をクリックします。

現在の行の [Make] の選択値に基づいて [Model] ドロップダウン リストをフィルタする

  1. [And] をクリックして、2 つ目のフィルタ条件を作成します。
  2. 2 つ目のフィルタ条件の 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
  3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Year/Make/value] をクリックし、[OK] をクリックします。
  4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
  5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
  6. [Insert A Formula] ダイアログ ボックスに次の式を入力します。

current()/my:Make

  1. [OK] をクリックします。2 つのフィルタの条件を図 5 に示します。


図 5 繰り返しカスケード リストの第 3 レベルのフィルタ

  1. [OK]を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。

これでレベルが 3 つあるカスケードを作成できました。フォームをプレビューして、ドロップダウン リストボックスの機能をテストしてください。ここで、無効な選択項目の組み合わせを作成できるという問題にお気づきかもしれません。次のセクションでこの問題を解決します。


変更後に選択項目をクリアする

カスケードリストで対応が必要な問題として、既に選択されていた項目が、その前のレベルで選択項目が変更されたときに無効になる可能性が高いことがあります。たとえば、年式に 1963 年、車種に Chevrolet を選択し、後で年式に 1973 年を選択した場合、Chevrolet は 1973 年式の車種としてデータソースにリストされていないのに、選択済みの車種としてそのまま残ります。そこで、無効な選択項目の組み合わせが存在できないように古い値をクリアする必要があります。これは、動作規則を使って簡単に修正できます。

少し時間をかければ、おそらく後に続く選択済みの値が有効かどうかを判断して、無効な値だけをクリアすることもできるでしょう。しかし、後の選択項目を単純にすべてクリアすることには利点があります。その 1 つは、ドミノ効果のように動作規則もカスケードできることです。1 つの値が変更されると、次の値がクリアされます。その値のクリアによって、さらにそれに続く値が次々にクリアされます。動作規則は自動的に現在の行に適用されるので、動作規則でcurrent 関数を使用してフィルタする必要はありません。

作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [Value] ボックスは空白のままにします。

[Year] の選択値が変更されたときに [Make] の選択済みの値をクリアする

  1. [Year] ボックスをダブルクリックします。
  2. [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
  3. 動作規則に「Clear Make」という名前を付け、[Add Action] をクリックします。
  4. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
  5. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicles/Vehicle/Make] をクリックします。
  6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

[Make] で選択値が変更されたときに [Model] の選択済みの値をクリアする

  1. [Make] ボックスをダブルクリックします。
  2. [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
  3. 動作規則に「Clear Model」という名前を付け、[Add Action] をクリックします。
  4. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
  5. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicles/Vehicle/Model] をクリックします。
  6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

確認

これで、レベルが 3 つあり、無効な選択項目の組み合わせが表示されない繰り返しカスケード リストを作成できました。フォームをプレビューし、さまざまな選択項目の組み合わせを試してください。

©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

Comments

No Comments

About Kaoru Okumura

Program Manager, Qdabra.com Kaoru worked for ten years at Microsoft as a program manager, and many years at IBM Tokyo Research Lab as an advisory researcher. She led projects on natural language related research and products including Japanese search and proofing tools. Kaoru holds a Master of Science in Mathematics from Kyushu University, and BA from International Christian University. She enjoys performing Butoh dance, and taking photography.
Copyright © 2003-2019 Qdabra Software. All rights reserved.
View our Terms of Use.