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