in

InfoPath Dev

This Blog

Syndication

Archives

Greg Collins

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

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

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

カスケードのレベル数が増えると、それにかかわる処理と作業もより複雑になります。また、カスケード リストが繰り返しテーブルまたは繰り返しセクション内に表示される場合は、別の問題、「データのクロスオーバー」に対処する必要があります。

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

階層的なセカンダリ データ ソース

階層的なデータソースは、一般に 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. Vehicle」という名前のグループを追加します。
  3. [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。

ビューの設計

  1. ビューに 3 列のレイアウト用の表を追加します。
  2. 図 1 のように、左から右の順に、[Year]、[Make]、[Model] の各フィールドをドロップダウン リスト ボックスとしてレイアウト用の表のセルに挿入します。


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


カスケード リスト

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

[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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
  6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[OK] をクリックします (図 2 を参照)。


図 2 カスケード リストの第 2 レベルのフィルタ

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

ここまでで、レベルが 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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
  6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
  6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Make] をクリックしてから、[OK] をクリックします (図 3 を参照)。


図 3 カスケード リストの第 3 レベルのフィルタ

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

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


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

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

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

作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [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/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/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

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