TableをX++で作るには、AOTの操作関数を使います。
クラスを作成し(例:TableManagerClass)、以下のようなメソッドを定義します。
static void CreateTable(str _tableName)
{
// テーブルを作成する
TreeNode treeNode;
str tablePath = #TablesPath + "\\";
;
if(TreeNode::findNode(tablePath + _tableName)) // テーブルが既に存在した場合
{
info(tablePath + _tableName + " は既に存在しています");
}
else
{
// 追加先のノードを取得
treeNode = TreeNode::findNode(tablePath);
// テーブルを追加
treeNode.AOTadd(_tableName);
// AOTと同期させる
SqlDataDictionary::synchronize();
info(tablePath + _tableName + " を追加しました");
}
}
Jobを作成し、以下のように書きます。
static void JobCreateTable(Args _args)
{
// テーブルを作成する
;
// テーブル名
tableName = "Table_Test";
// テーブルを生成する
TableManagerClass::CreateTable(tableName);
}
Jobを実行するとテーブルが作成されます。
(既にテーブルが存在する場合には、メッセージのみ表示しています)
フィールドを作成する場合は、以下のようなメソッドを定義します。
static void CreateField(str _tableName, str _fieldName, str _fieldType,
str _stringSize, str _label, str _mandatory, str _extendedDataType = "")
{
// フィールドを作成する
AOTTableFieldList fieldList;
TreeNode fieldNode;
str propertyStr;
str fieldPath = #TablesPath + "\\" + _tableName + "\\Fields";
;
fieldList = infolog.findNode(fieldPath);
// セキュリティチェック
if (!hasSecuritykeyAccess(securitykeynum(SysDevelopment), AccessType::View))
{
return;
}
// フィールドを追加
if (fieldList.AOTFindChild(_fieldName))
{
info(fieldPath + _fieldName + " は既に存在しています");
}
else
{
if(_fieldType == "Enum")
{
fieldList.addEnum(_fieldName);
}
else if(_fieldType == "Integer")
{
fieldList.addInteger(_fieldName);
}
else if(_fieldType == "String")
{
fieldList.addString(_fieldName);
fieldNode = fieldList.AOTFindChild(_fieldName);
if(_extendedDataType == "")
{
fieldNode.AOTsetProperty("StringSize", _stringSize);
}
}
else if(_fieldType == "Date")
{
fieldList.addDate(_fieldName);
}
else if(_fieldType == "Real")
{
fieldList.addReal(_fieldName);
}
else
{
info("_fieldTypeが正しくありません!");
return;
}
//info("nodeType: " + int2str(fieldList.AOTFindChild(_fieldName).AOTgetNodeType()));
// プロパティ変更
fieldNode = fieldList.AOTFindChild(_fieldName);
fieldNode.AOTsetProperty("Label", _label);
fieldNode.AOTsetProperty("Mandatory", _mandatory);
propertyStr = fieldNode.AOTgetProperties(false, false);
propertyStr = setProperty(propertyStr, "ExtendedDataType", _extendedDataType);
fieldNode.AOTsetProperties(propertyStr);
// ノード保存
fieldNode.AOTsave();
info(fieldPath + _fieldName + "(" + _fieldType
+ ", StringSize=" + _stringSize + ", Label=" + _label
+ ", Mandatory=" + _mandatory + ", ExtendedDataType=" + _extendedDataType
+ ") を追加しました");
}
// AOTと同期させる
SqlDataDictionary::synchronize();
}
上記は特定の型とプロパティにしか、対応していませんが、
処理を同様に増やすことで対応が出来ます。
また、この場合、Jobでは以下のように書きます。
(以下は、テーブルもあわせて作成する例)
static void JobCreateTable(Args _args)
{
// テーブルを作成する
str tableName;
str fieldName;
str fieldType;
;
// テーブル/フィールドのパスと名前
tableName = "Table_Test";
fieldName = "StringTest";
fieldType = "String";
// テーブルを生成する
TableManagerClass::CreateTable(tableName);
// フィールドを生成する
TableManagerClass::CreateField(tableName, fieldName, fieldType, "60", "テストフィールド", "Yes", "testDataType");
}
最終更新:2012年06月20日 14:54