データモデルへのカスタムエンティティの追加
新規エンティティをデータモデルに追加するには、次の複数の手順を実行します。
新規構築ブロックの作成
新規構築ブロックを作成するには、次の手順を実行します。
1. 新しいプロジェクトを作成します。会社名など、プロジェクトに一意のプリフィックスを使用します。PTC プレフィックスは、PTC によって提供されるエンティティのために予約されています。この例では、MyCompany.MyBuildingBlock という名前のプロジェクトを作成します。この構築ブロック用に作成する新規 Thing Template、Thing、またはその他のエンティティごとに、そのエンティティの「一般情報」ページの「プロジェクト」値として新規プロジェクトを追加します。
2. プロジェクトに新規エントリポイント Thing Template を作成します。この例では、新規 Thing Template に MyCompany.MyBuildingBlock.EntryPoint_TT という名前を付けます。使用する「ベース Thing Template」は、新規構築ブロックのタイプによって異なります。
◦ 構築ブロックが PTC 構築ブロックから拡張している場合は、PTC 構築ブロックからのエントリポイント Thing Template を使用します。
◦ 構築ブロックが
抽象構築ブロックである場合は、
PTC.Base.ComponentEntryPoint_TT Thing Template を使用します。
◦ 構築ブロックが
実装構築ブロックである場合は、
PTC.DefaultConfiguration.EntryPoint_TT
Thing Template を使用します。
◦ 構築ブロックが
標準構築ブロックである場合は、
PTC.Base.ComponentEntryPoint_TT Thing Template を使用します。
◦ 構築ブロックが
ユーザインタフェース構築ブロックである場合は、
PTC.Base.ComponentEntryPoint_TT Thing Template を使用します。
3. プロジェクトに新規 Thing を作成します。これは、その「ベース Thing Template」として、手順 2 で作成した Thing Template を使用します。この例では、新規 Thing に MyCompany.MyBuildingBlock.EntryPoint という名前を付けます。
4. 構築ブロックが PTC 構築ブロックから拡張していない場合は、新しいエンティティを管理するためのサービス定義を保持するために、プロジェクトに新規 Thing Shape を作成します。この例では、新規 Thing Shape に MyCompany.MyBuildingBlock.Managment_TS という名前を付けます。構築ブロックが PTC 構築ブロックから拡張している場合は、この手順をスキップします。
5. 構築ブロックが PTC 構築ブロックから拡張していない場合は、「ベース Thing Template」として PTC.Base.CommonManager_TT を使用する、新規 Thing Template をプロジェクトに作成します。この例では、新規 Thing Template に MyCompany.MyBuildingBlock.Manager_TT という名前を付けます。構築ブロックが PTC 構築ブロックから拡張している場合は、この手順をスキップします。
6. 構築ブロックが PTC 構築ブロックから拡張していない場合は、手順 4 で作成した Thing Shape を、手順 5 で作成した Thing Template 上の「実装されたシェイプ」フィールドに追加します。構築ブロックが PTC 構築ブロックから拡張している場合は、この手順をスキップします。
7. プロジェクトに新規 Thing を作成します。これは、その「ベース Thing Template」として、手順 5 で作成した Thing Template を使用します。この例では、新規 Thing に MyCompany.MyBuildingBlock.Manager という名前を付け、その「ベース Thing Template」として MyCompany.MyBuildingBlock.Manager_TT を使用します。
8. 新規構築ブロックが PTC 構築ブロックから拡張している場合は、元の構築ブロックのマネージャ Thing から新規構築ブロックのマネージャ Thing に、コンフィギュレーションを追加します。
a. 手順 7 で作成したマネージャ Thing (この例では、MyCompany.MyBuildingBlock.Manager) に移動します。
b. 「コンフィギュレーション」で、元の構築ブロックのマネージャ Thing の「コンフィギュレーション」ページにあるものと同じコンフィギュレーションを追加します。
9. カスタムマネージャを登録します。
a. PTC.Base.Manager Thing に移動します。
b. 「コンフィギュレーション」で、「DefaultGlobalManagerConfiguration」コンフィギュレーションテーブルの「追加」をクリックします。
▪ 「名前」で、MyCompany.MyBuildingBlock.Manager などのカスタムマネージャの名前を入力します。
▪ 「値」で、手順 7 で作成したカスタムマネージャ Thing をサーチして選択します。
c. 「追加」をクリックして、コンフィギュレーションテーブルにカスタムマネージャを追加します。
d. 「保存」をクリックして、マネージャ Thing への更新を保存します。
新規エンティティ用のデータシェイプの作成
新規エンティティ用のデータシェイプを作成するには、次の手順を実行します。
1. ThingWorx Composer で、新規データシェイプを作成します。新規構築ブロック用のプロジェクトにデータシェイプを追加します。この例では、データシェイプに MyObject という名前を付けます。
2. 「フィールド定義」で、「追加」をクリックし、データシェイプに含める各プロパティに対して新規フィールド定義を指定します。
a. 1 つのフィールドをプライマリキーとして指定するには、そのフィールドの「プライマリキー」チェックボックスをオンにします。
b. プライマリキーフィールドの「ベースタイプ」を LONG に設定します。プライマリキーフィールドが LONG データ型の場合、このフィールドの値は自動生成され、値を増分する論理はデータベースによって処理されます。別の「ベースタイプ」が選択されている場合は、プライマリキーの一意性のために論理を処理する必要があります。
構築ブロックデータモデルに合わせるには、UID フィールドを追加し、「ベースタイプ」を LONG に設定し、「プライマリキー」チェックボックスをオンにします。
3. 「保存」をクリックして、新規データシェイプを保存します。
|
データシェイプに対してデータベーステーブルが作成されると、データベーステーブルの名前は、すべて小文字のデータシェイプ名 (プレフィックスを除く) になります。たとえば、データシェイプが ABC.MyObject という名前の場合、データベーステーブルの名前は myobject になります。データベーステーブルの名前にプレフィックスは含まれないため、データベーステーブルの名前が同じになるような複数のデータシェイプ名 (ABC.MyObject や PTC.JobOrder.MyObject など) はサポートされていません。
同様に、データベーステーブル内の列名は、データシェイプからの小文字のフィールド名になります。たとえば、MyPrimaryLocation という名前のフィールドの場合は、myprimarylocation という名前の列が生成されます。その結果、同じ文字であるが文字の大小が異なるフィールド名 (MyName、myName、myname など) は、同じデータシェイプではサポートされていません。
|
新規データシェイプを含めるためのデータベース情報の更新
新規データシェイプを含めるには、データベース情報を更新します。これを行うには、新規構築ブロックのマネージャ Thing (MyCompany.MyBuildingBlock.Manager) で、エンティティ用のデータベース情報を、GetDBInfo サービスに追加します。
新規データシェイプ用のデータベース情報を既存の GetDBInfo サービスに追加するには、次の操作を行います。
1. 新規構築ブロックのマネージャ Thing (MyCompany.MyBuildingBlock.Manager) に移動します。
2. 「サービス」で、GetDBInfo サービスに移動しオーバライドします。
3. スクリプトエディタで、既存のデータシェイプエントリと同様に、新規データシェイプ用のエントリを配列として追加します。データシェイプ用のデータベース情報を含めます。
◦ dataShapeName - 新しいデータベーステーブルを追加するデータシェイプの名前。
◦ indexedFields - インデックシングされる列。インデックシングは、サーチと並べ替えの高速化に役立ちます。配列には複数のインデックス付きフィールドを定義できます。配列内の各要素には、次のプロパティが含まれている可能性があります。
▪ name - 列の名前。必須。
▪ unique - 列に一意の値が必要かどうかを指定します。
▪ fieldNames - 列の名前を含む配列。1 つの列だけが指定されている場合、単一インデックスが作成されます。複数の列が指定されている場合、複合インデックスが作成されます。
|
fieldnames に単一の値を指定する代わりに、単一の値に列の名前である name を指定することで、単一インデックスを作成できます。name と fieldnames が両方とも指定されている場合、name は無視され、fieldnames の値を使用してインデックスが作成されます。
|
▪ identifier - データベース内でのエンティティの名前。指定されない場合、システムは <テーブル名>_<列名>_idx のフォーマットで値を自動的に生成します。指定された場合、値は指定した値と自動的に生成された任意の値の両方に対して一意でなければなりません。値の最大長は、データベースに許容されている識別子の最大長です。
◦ fields - 仕様がさらに必要な任意の列。配列には複数のフィールドを定義できます。配列内の各要素には、次のプロパティが含まれている可能性があります。
▪ name - 列の名前。必須。
▪ length - 列が String であり、データベースのデフォルトの長さ以外の長さが必要な場合の列の長さ。
▪ notNull - 列が Null であってはならないかどうかを指定します。
▪ defaultValue - このプロパティのデフォルト値。
|
列に一意の値が必要な場合は、fields 配列ではなく、indexedFields 配列での unique を使用してこれを指定します。
|
◦ foreignKeys - 新しいデータベーステーブル用の
外部キー列の定義。配列には複数の外部キーを定義できます。配列内の各要素には、次のプロパティを含む必要があります。
▪ name - 外部キーとなる現在のデータシェイプでの列の名前。
▪ referenceDataShapeName - 参照データベーステーブルのデータシェイプ。
▪ referenceFieldName - 参照されている値を含むフィールドの名前。
▪ identifier - データベース内でのエンティティの名前。指定されない場合、システムは <テーブル名>_<列名>_fk のフォーマットで値を自動的に生成します。指定された場合、値は指定した値と自動的に生成された任意の値の両方に対して一意でなければなりません。値の最大長は、データベースに許容されている識別子の最大長です。
▪ onDelete - 参照データシェイプのインスタンスが削除されるときの、現在のデータシェイプのインスタンスの動作 (該当する場合)。
▪ deleteReference - 現在のデータシェイプのインスタンスが削除されるときの、参照データシェイプのインスタンスの動作 (該当する場合)。
たとえば、新しい MyObject データシェイプに、インデックス付きフィールドを指定せず、外部キーを指定し、Location フィールドの長さを 4000 文字に設定するには、次のように入力します。
{
"dataShapeName": "MyObject",
"indexedFields": [],
"foreignKeys": [{"name":"WorkDefinitionUID", "referenceDataShapeName":"PTC.SCA.SCO.WorkDefinition", "referenceFieldName":"UID"}],
"fields": [
{
"name": "Location",
"length": 4000
}
]
}
4. 「完了」をクリックし、「保存」をクリックして、更新されたサービスを保存します。
CRUD サービスの作成
新規データシェイプのインスタンスを管理するために必要な CRUD サービスを作成します。
1. 構築ブロックの管理 Thing Shape (MyCompany.MyBuildingBlock.Managment_TS) で、「サービス」の下の「追加」をクリックし、必要なサービスを作成します。構築ブロックエンティティには、既存の CRUD サービスをモデルとして使用します。
◦ 作成サービス:
▪ サービス名を入力します。この例では、AddMyObjects と入力します。
▪ サービス入力の場合、MyObjects の「ベースタイプ」で INFOTABLE という名前の入力を追加します。「データシェイプ」の場合、データシェイプを選択します。
▪ サービス出力の場合、INFOTABLE を選択し、お使いのデータシェイプを選択します。
▪ スクリプト枠で、次のようなコードを入力します。
var insertParams = {
infoTable: MyObjects,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].Insert(insertParams);
◦ 削除サービス:
▪ サービス名を入力します。この例では、DeleteMyObject と入力します。
▪ サービス入力の場合、STRING の「ベースタイプ」で UID という名前の入力を追加します。
▪ サービス出力の場合、INFOTABLE を選択し、お使いのデータシェイプを選択します。
▪ スクリプト枠で、次のようなコードを入力します。
var params = {
UID: UID,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].Delete(params);
◦ 更新サービス:
▪ サービス名を入力します。この例では、UpdateMyObjects と入力します。
▪ サービス入力の場合、MyObjects の「ベースタイプ」で INFOTABLE という名前の入力を追加します。「データシェイプ」の場合、データシェイプを選択します。
▪ サービス出力の場合、INFOTABLE を選択し、お使いのデータシェイプを選択します。
▪ スクリプト枠で、次のようなコードを入力します。
var params = {
infoTable: MyObjects,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].Update(params);
◦ このデータシェイプの個々のインスタンスを読み込むサービス:
▪ サービス名を入力します。この例では、GetMyObject と入力します。
▪ サービス入力の場合、STRING の「ベースタイプ」で UID という名前の入力を追加します。
▪ サービス出力の場合、INFOTABLE を選択し、お使いのデータシェイプを選択します。
▪ スクリプト枠で、次のようなコードを入力します。
var params = {
UID: UID,
dataShapeName: "MyObject"
};
var result = Things[me.GetDatabaseThingName()].GetEntity(params);
◦ オプションで、filter、offset、limit 入力パラメータを含む、このデータシェイプの複数のインスタンスを読み込むサービス。入力パラメータが指定されていない場合は、MyObject のすべてのインスタンスが返されます:
▪ サービス名を入力します。この例では、GetMyObjects と入力します。
▪ サービス入力の場合:
▪ JSON の「ベースタイプ」で filter という名前の入力を追加します。
▪ INTEGER の「ベースタイプ」で offset という名前の入力を追加します。
▪ INTEGER の「ベースタイプ」で limit という名前の入力を追加します。
▪ サービス出力の場合、INFOTABLE を選択し、お使いのデータシェイプを選択します。
▪ スクリプト枠で、次のようなコードを入力します。
var params = {
filter: filter,
dataShapeName: "MyObject",
offset: offset,
limit: limit
};
var result = Things[me.GetDatabaseThingName()].Query(params);
2. 「保存」をクリックして、新しいサービスを Thing Shape に保存します。
データベース情報とデータベーススキーマの同期化
データベース情報をデータベーススキーマと同期化することで、新規エンティティをデータベースに追加します。詳細については、
データベース情報とデータベーススキーマの同期化を参照してください。