「TableをX++で作るには?」の編集履歴(バックアップ)一覧はこちら
TableをX++で作るには? - (2012/04/24 (火) 16:24:54) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
TableをX++で作るには、AOTの操作関数を使います。
クラス定義
>static void CreateTable(str _tablePath, str _tableName)
>{
> // テーブルを作成する
> TreeNode treeNode;
> #AOT
> ;
>
> if(TreeNode::findNode(_tablePath + _tableName)) // テーブルが既に存在した場合
> {
> info(_tablePath + _tableName + " は既に存在しています");
> }
> else
> {
> // 追加先のノードを取得
> treeNode = TreeNode::findNode(_tablePath);
>
> // テーブルを追加
> treeNode.AOTadd(_tableName);
>
> // AOTと同期させる
> SqlDataDictionary::synchronize();
>
> info(_tablePath + _tableName + " を追加しました");
> }
>}
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");
> }
※参考:http://dynamicsuser.net/forums/p/36641/189646.aspx
※参考:http://www.cetix.de/DynamicsNews/Thread7863-Cannot_set_the_ExtendedDataType_property_of_table_field.aspx