プロパティテーブル
概要と主要な概念
プロパティテーブルは、モデル内のオブジェクトのプロパティを可視化して変更しやすくするためのツールです。モデルにオブジェクトを追加すると、各オブジェクトにその動作を設定するプロパティの定義済みのセットが割り当てられます。モデル内のオブジェクトの数が増えると、モデル内のすべてのオブジェクトのすべてのプロパティを表示して管理するのが難しくなります。[プロパティ]ペインを使用すれば、複数のオブジェクトを同時に簡単に編集できますが、プロパティテーブルの方がはるかに強力です。プロパティテーブルでは、複数のオブジェクトのプロパティ値の表示と比較の両方が可能なだけでなく、それらのプロパティを直感的で使いやすいExcelに似たテーブルインターフェイスで変更することも可能です。
プロパティテーブルでこれが可能なのは、モデルをデータベーステーブルのように表示できるからです。各オブジェクトはこのテーブル内の1つの行を表し、各オブジェクトのプロパティはデータベーステーブル内のフィールド、つまり、列を表します。このデータベースに似た視点を使用して、表示または編集する特定のプロパティを選択しながら、オブジェクトのテーブルにクエリを行うことができます。クエリは、特定のタイプのオブジェクト、グループメンバーシップ、特定のプロパティ値などで絞り込むことができます。最後に、クエリは、これらの同じ基準でまたは別々の基準で並べ替えることができます。このクエリの結果がテーブルビューに表示されるため、テーブルの複数の行で複数のオブジェクトを簡単に比較したり、テーブル内のオブジェクトのプロパティを個別にまたは一度に複数をすばやく簡単に変更したりできます。
プロパティテーブルの作成
主に、プロパティテーブルを作成する方法は2つあります。プロパティテーブルは、ツールボックスを使用して作成することも、特定のオブジェクトの[プロパティ]ペインを使用して作成することもできます。
ツールボックスからのプロパティテーブルの作成
ツールボックスからプロパティテーブルを作成するには、[ツールボックス]タブをクリックして、ボタンをクリックし、[プロパティテーブル]を選択します。これにより、モデル内の各オブジェクトの名前が表示される基本的なプロパティテーブルが作成されます。プロパティテーブルタブでは、さらなる構成を行うことができます。
[プロパティ]ペインからのプロパティテーブルの作成
[プロパティ]ペインからプロパティテーブルを作成するには、オブジェクトをクリックして、そのプロパティで必要なペインを探します。ペインのタイトルバーには、通常、ボタンがあります。このボタンを押して、[新しいプロパティテーブルを作成]を選択します。これにより、関連するプロパティフィールドと、そのオブジェクトタイプで絞り込むフィルタを使用して、新しいプロパティテーブルが作成されます。選択されたオブジェクトの対応する行がテーブルで強調表示されます。
プロパティテーブルのカスタマイズ
プロパティテーブルタブには、表示するプロパティ、表示するオブジェクトのセットを絞り込む方法、およびそれらのテーブル内での順序を定義するためのコントロールが含まれています。
ボタンを押して、テーブルに表示するプロパティを定義します。
ボタンを押して、テーブルに表示するオブジェクトを絞り込むためのプロパティを定義します。絞り込むためのプロパティを選択すると、そのプロパティがフィルタ編集フィールドに表示され、それをクリックするとフィルタ式を定義できるようになります。
最後に、ボタンをクリックして、テーブルの並び順を定義できます。これは、フィルタリングの定義方法と同様に機能します。
オブジェクトラベル値
オブジェクトラベル値で選択、絞り込み、および並べ替えを行うこともできます。これを行うには、該当する、
、または
ボタンを押します。ダイアログの最上部に、[ラベル]フィールドが表示されるはずです。ラベルの名前を入力して、
ボタンを押します。
これにより、選択/絞り込み/並べ替えにそのラベルが追加されます。
オブジェクトプロパティの変更
必要なものだけが表示されるようにテーブルを構成したら、そのテーブルを使用してオブジェクトのプロパティ値を比較するだけでなく、それらを個別にまたは一度に複数を変更することもできます。
単一のオブジェクトを変更するには、そのオブジェクトのターゲットプロパティセルをダブルクリック(またはセルをクリックしてF2を押す)して、それに設定する値を入力してから、セル以外の場所をクリックします。これにより、入力した値がすぐにオブジェクトのプロパティに適用されます。ただし、一部のプロパティではこのような直接編集ができないことに注意してください。
または、複数のオブジェクトのプロパティを同時に編集できます。単一のプロパティの1つ以上の行を選択すると、選択した行の横にボタンが表示されます。そのボタンを押して、値を編集するためのダイアログを開きます。編集が終わったら、そのダイアログの[適用]ボタンを押すと、編集した値がテーブルで選択したすべての行に適用されます。
SQLの直接使用
プロパティテーブルは、オブジェクトプロパティを表示して管理するための使いやすいツールです。ただし、根本的には、プロパティテーブルは、FlexSimの強力なSQL機能を中心としたユーザーインターフェイスラッパーにすぎません。プロパティテーブルタブの右側に、[SQL]ボタンが表示されます。このボタンを押すと、表示しているテーブルに関連付けられたSQLクエリの全体が表示されます。
このクエリをTable.query()コマンドの呼び出しにコピー/貼り付けると、プロパティテーブルに表示されているものと同じ結果が得られます。単純なシナリオでは、すでにプロパティテーブルインターフェイスでできること以上のことはできませんが、次のように、独自のカスタマイズされた機能を実装できる可能性が広がります。
- モデル内のオブジェクトとグローバルテーブルなどの他のデータを関連付ける内部結合クエリの作成
- AVG()やCOUNT()などの集約関数を使用した複数のオブジェクトに関する情報の集約
- SQL UPDATE句とDELETE句を使用したプロパティの変更またはモデルからのオブジェクトの削除
- SQL INSERT INTO句を使用したモデルの自動構築
Objects()テーブルの使用
モデル内のオブジェクトのセットにクエリを行うには、クエリ内でObjects()テーブルを使用します。例:
SELECT Object, Name FROM Objects()
Objects()テーブルは、標準のSQLテーブル値関数で呼び出されるテーブルです。オプションで、この関数にパラメータを渡して、サブツリーでオブジェクトが検索される「ルート」ノードを定義することができます。パラメータは、パス、オブジェクトの名前、モデル内のオブジェクトへの参照のいずれかにすることができます。
SELECT Object, Name FROM Objects('MODEL:/FirstFloor')
SELECT Object, Name FROM Objects('FirstFloor')
SELECT Object, Name FROM Objects(Model.find('FirstFloor'))
上のすべての例が同じ結果を提供します。ここで、「ルート」ノードはモデル内のFirstFloorという名前のオブジェクトです。一方、Objects()にパラメータが渡されなかった場合は、「ルート」ノードがモデルになります。クエリは、ルートオブジェクトのサブツリーを再帰的に検索してオブジェクを見つけ、各オブジェクトがテーブル内の1つの行を表す「仮想」テーブルを作成します。
モデルの自動構築
前述したように、Objects()テーブルとSQL INSERT INTO句を組み合わせて使用して、実際にモデル内のオブジェクトを作成し、それらにプロパティ値を割り当てることができます。たとえば、Table.query()へのスクリプト呼び出しに以下のクエリをコピー/貼り付け、それを実行します。
INSERT INTO Objects() (Class, Name, Location, OutObjects) VALUES
('Source', 'Source1', ARRAY(0, 0, 0), ARRAY('Queue1')),
('Queue', 'Queue1', ARRAY(5, 0, 0), ARRAY('Processor1', 'Processor2', 'Processor3')),
('Processor', 'Processor1', ARRAY(10, 3, 0), ARRAY('Sink1')),
('Processor', 'Processor2', ARRAY(10, 0, 0), ARRAY('Sink1')),
('Processor', 'Processor3', ARRAY(10, -3, 0), ARRAY('Sink1')),
('Sink', 'Sink1', ARRAY(15, 0, 0), ARRAY())
これにより、接続された完全に機能するオブジェクトのセットがモデル内に作成されます。このようなクエリを手作業で作成したくないかもしれませんが、この機能を使用すれば、モデル構築も完全にデータ駆動型のアクティビティにすることができます。テーブルから読み取ってSQL INSERT INTOクエリを組み立てる単純なスクリプトを作成してから、そのクエリを実行してモデル内にオブジェクトを作成できます。今後、このような機能をFlexSimのプロパティテーブルに統合したいと考えていますが、これを自分で行うために必要なツールはすでに揃っています。
INSERT INTOの必須フィールド
INSERT INTO句を使用してモデルを自動構築する場合は、2つの特殊なフィールドのうちの少なくとも1つをクエリに挿入して、作成するオブジェクトのタイプをFlexSimが理解できるようにする必要があります。もう一方のプロパティフィールドはオプションで、指定されなかった場合は、デフォルトのプロパティ値に戻ります。
INSERT INTOを使用する場合は、ClassフィールドとCopyFromフィールドのどちらかを含める必要があります。Classフィールドは、インスタンスを作成するクラスの名前です。「Source」、「Processor」、「Queue」などがあります。このフィールドは、プロパティテーブルに表示するために使用することもできます。または、特別なCopyFromフィールドを指定できます。これは、コピーを作成するオブジェクトのパスまたは名前です。このフィールドを使用して、モデル内にオブジェクトを作成して事前構成してから、そのオブジェクトを自動構築ステップで作成することができます。
下のサンプルクエリは、前の例と同様ですが、ここでは、モデル内にTemplateSourceという名前のオブジェクトがすでに作成されています。このソースのコピーは、CopyFromフィールドを使用して作成されます。他のオブジェクトはすべてライブラリクラスのインスタンスとして作成されます。
INSERT INTO Objects() (Class, CopyFrom, Name, Location, OutObjects) VALUES
(NULL, 'TemplateSource', 'Source1', ARRAY(0, 0, 0), ARRAY('Queue1')),
('Queue', NULL, 'Queue1', ARRAY(5, 0, 0), ARRAY('Processor1', 'Processor2', 'Processor3')),
('Processor', NULL, 'Processor1', ARRAY(10, 3, 0), ARRAY('Sink1')),
('Processor', NULL, 'Processor2', ARRAY(10, 0, 0), ARRAY('Sink1')),
('Processor', NULL, 'Processor3', ARRAY(10, -3, 0), ARRAY('Sink1')),
('Sink', NULL, 'Sink1', ARRAY(15, 0, 0), ARRAY())
FlexSimでのSQLの使用方法については、「SQLクエリ」を参照してください。