サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

DataSetコンポーネントで検索のメソッドが使えない

ID: FN0405002 Product: Flash

Platform: All
Version: MX Professional 2004

1. 現象
2. 原因
3. 対処法
  [1][スキーマ]の定義
  [2][バインディング]の設定
4. 補足
  [A][バインディング]の個別設定
  [B]mx.data.typesパッケージのクラスで型指定 − ActionScript 2.0修得者向け対処方

1. 現象
Flash MX Professional 2004のDataSetクラスには、データセット(collection)の現行のビュー内で指定したフィールド値を検索するメソッドとして、DataSet.find()DataSet.findFirst()DataSet.findLast()があります。これらのメソッドは、いずれも指定したフィールド値の項目が存在すればtrue、存在しなければfalseを返します。

ところがいずれのメソッドも、指定したフィールド値が存在するにもかかわらず、つねにfalseを返します。つぎのスクリプトは、DataSet.find()メソッドを使用したサンプルです(スクリプト001)。スクリプトを記述したタイムラインには、DataSetインスタンスmyDataSetが配置されているものとします。

スクリプト001■DataSet.find()メソッドのテスト

// フレームアクション
// DataSet.find()メソッドのテスト
import mx.data.components.DataSet;
var myDataSet:DataSet;
var recData:Array = [{id:0, firstName:"Mick", lastName:"Jones"},
           {id:1, firstName:"Joe", lastName:"Strummer"},
           {id:2, firstName:"Paul", lastName:"Simonon"}];
myDataSet.items = recData;
myDataSet.addSort("firstName", ["firstName"]);
var bResult:Boolean = myDataSet.find(["Paul"]);
trace(bResult); // 出力: false

2. 原因
DataSet.find()DataSet.findFirst()DataSet.findLast()を使用するには、検索対象のフィールドが予め[スキーマ]に定義されていなければなりません。その旨の記載がないのは、ドキュメントパグだと考えられます。

3. 対処法
メソッドを使用するには、[コンポーネントインスペクタ]で検索対象のフィールドを[スキーマ]に定義し、[バインディング]を設定します。検索対象フィールドが複数あるときは、それらを同様に定義します。

[1][スキーマ]の定義
まず、[コンポーネントインスペクタ]の[スキーマ]タブで、[+](コンポーネントプロパティの追加)ボタンをクリックして、プロパティを追加します。[field name]フィールドに検索対象フィールド名を入力し、[data type]からフィールドのデータタイプを選択します(図001)。

図001■[コンポーネントインスペクタ]の[スキーマ]タブで検索対象フィールドを定義

[2][バインディング]の設定
つぎに、[スキーマ]に定義したプロパティを、DataSetインスタンスに[バインディング]します。[バインディング]は、(a)個別に設定する方法と、(b)DataBindingClassコンポーネントを利用する方法があります。ここでは後者によることとし、前者の方法は後述「4. 補足」に「[バインディング]の個別設定」として補足します。

DataBindingClassesコンポーネントは、[ウィンドウ]メニューから[その他のパネル] > [サンプルライブラリ] > [クラス]で表示される[ライブラリ]に格納されています。このDataBindingClassesコンポーネントのインスタンスを、DataSetインスタンスと同じステージ上にドラッグ&ドロップします(図002)。

図002■DataBindingClassesインスタンスをステージにドロップ

これで、[スキーマ]の定義と[バインディング]の設定は完了です。先にテストしたスクリプト001に、検索結果を出力する処理を追加しました(スクリプト002)。今度は、検索フィールドに指定した値に合致したデータが、[出力]されます。

スクリプト002■DataSet.find()メソッドのテスト2

// フレームアクション
// DataSet.find()メソッドのテスト2
import mx.data.components.DataSet;
var myDataSet:DataSet;
var recData:Array = [{id:0, firstName:new String("Mick"), lastName:"Jones"},
           {id:1, firstName:new String("Joe"), lastName:"Strummer"},
           {id:2, firstName:new String("Paul"), lastName:"Simonon"}];
myDataSet.items = recData;
myDataSet.addSort("firstName", ["firstName"]);
if (myDataSet.find(["Paul"])) {
  var oItem:Object = myDataSet.currentItem;
  trace([oItem.id, oItem.firstName, oItem.lastName]);
}

// [出力]ウィンドウの表示
2,Paul,Simonon

4. 補足
[A][バインディング]の個別設定
「2. 対処法」の「[2][バインディング]の設定」で、DataBindingClassesを使わず、[コンポーネントインスペクタ]で個別に設定する方法を簡単にご説明します(「[1][スキーマ]の設定」は、済んでいるものとします)。

まず、[コンポーネントインスペクタ]の[バインディング]タブで[+](バインディングの追加)ボタンをクリックし、表示された[バインディングの追加]ダイアログボックスで[スキーマ]に定義したプロパティを選択して、[OK]ボタンをクリックします(図003)。他にも検索対象フィールドがあれば、同様に[バインディング]を追加します。

図003■[コンポーネントインスペクタ]の[バインディング]タブでプロパティを追加

つぎに、[コンポーネントインスペクタ]の[バインディング]に追加されたプロパティが選択された状態で、[bound to]フィールドを2回クリックします(図004)。

図004■[コンポーネントインスペクタ]の[バインディング]でプロパティの[bound to]フィールドを2回クリック

[バインド]ダイアログボックスの[コンポーネントのパス]でDataSetインスタンスを選択し、[スキーマの場所]から追加されたプロパティを選択して、[OK]ボタンをクリックします(図005)。他にも検索対象フィールドがあれば、同様に[bound to]を設定します。

図005■[バインド]ダイアログボックスで[コンポーネントのパス]と[スキーマの場所]を設定

これで、[バインディング]の設定ができました。

図006■[バインディング]の[bound to]フィールドに設定されたコンポーネントとスキーマ

[B]mx.data.typesパッケージのクラスで型指定 − ActionScript 2.0修得者向け対処法
ActionScript 2.0のクラス定義について理解をされている中・上級者向けに、別の対処法をご紹介します。

DataSetの検索メソッドを使用するためには、mx.data.typesパッケージのデータ型を定義するクラスで、必要な型指定が何らかの変数に対して宣言されていれば、スキーマの設定は必要ありません。データ型を定義するクラスのうち必要とされるのは、検索対象フィールドがストリングであればStr、数値はNum、またブール(論理)値がBoolです。型宣言を行う変数は、任意のダミーで構いません。

以下のフレームアクション(スクリプト002)では、検索対象フィールドをふたつ設定しました。ひとつは数値でもうひとつがストリングです。ブール値は指定していません。スクリプトを実行すると、[出力]パネルにはつぎの結果が表示されます。

// [出力]パネルの表示
3,Paul,McCartney

スクリプト003■DataSet.find()メソッドのテスト3

// フレームアクション
// DataSet.find()メソッドのテスト3
import mx.data.components.DataSet;
// ダミー変数をデータ型指定
var temp:mx.data.types.Str;
var temp:mx.data.types.Num;
// var temp:mx.data.types.Bool;  // 検索対象フィールドにブール値はない
var myDataSet:DataSet;
var recData:Array = [{id:0, firstName:"Mick", lastName:"Jones"},
           {id:1, firstName:"Joe", lastName:"Strummer"},
           {id:2, firstName:"Paul", lastName:"Simonon"},
           {id:3, firstName:"Paul", lastName:"McCartney"}];
myDataSet.items = recData;
myDataSet.addSort("id_and_firstName", ["id", "firstName"]);
if (myDataSet.find([3, "Paul"])) {
  var oItem:Object = myDataSet.currentItem;
  trace([oItem.id, oItem.firstName, oItem.lastName]);
}

_____

作成者: 野中文雄
更新日: 2004年6月8日 バグ内容の修正に伴う全面改訂
作成日: 2004年5月14日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.