Цитата:
Изначально опубликовано vesna
..Хочу сделать мастер создания справочников, чтобы освободить себя от нудной работы создания EDT, таблицы, полей, индексов и тд,тд..
После программного создания EDT, появиться еще одна проблемка - настроить Relation на EDT через код.
Я делал следующим образом.
Программно экспортировал существующий EDT (например AssetId). Далее в тексте xpo-файла производил замену текущего названия EDT на новое. После этого импортировал исправленный xpo-файл. Далее модифицировал свойства EDT через метод Global::setProperty().
Конечно этот метод можно назвать извращенным. Однако, более красивого способа, как можно добавить EDT's relation, я не нашел.
PHP код:
#aot
#AotExport
#File
#Properties
#define.DefaultStr_PatternName("AssetId")
#define.DefaultInt_PatternName("xRefPathRecId")
#define.EDTStartPos(61)
#define.test('123456789')
static void newEDT(str _name = "test", str _parentEDTName = "Num", boolean _withRelation = true)
{
TreeNode treeNode = treenode::findNode(#ExtendedDataTypesPath);
TreeNode patternNode;
str patternName;
str filename;
TextBuffer textBuffer;
int exportId;
DictType dictType;
;
if (treeNode.AOTfindChild(_name))
throw error(strfmt("EDT %1 already exists", _name));
if (_withRelation)
{
dictType = new DictType(treeNode.AOTfindChild(_parentEDTName).applObjectId());
switch (dictType.baseType())
{
case Types::String :
patternName = #DefaultStr_PatternName;
break;
case Types::Integer :
patternName = #DefaultInt_PatternName;
break;
default:
throw error(strfmt("Ðarent EDT %1 must be string or integer data type", _parentEDTName));
}
}
else
{
patternName = _parentEDTName;
}
patternNode = treeNode.AOTfindChild(patternName);
if (!patternNode)
throw error(strfmt("Pattern EDT %1 does not exist", patternName));
filename = Xinfo::directory(DirectoryType::Temp) + patternName + #xpo;
patternNode.treeNodeExport(filename);
textBuffer = new TextBuffer();
textBuffer.fromFile(filename);
textBuffer.replace(patternName, #test);
textBuffer.replace(#test, _name);
textBuffer.toFile(filename);
exportId = infolog.startImport(filename, 0);
infolog.importElement(exportId,
UtilFileType::Application,
UtilElementType::ExtendedType,
_name,
#EDTStartPos,
#impOk);
infolog.endImport(exportId, 1);
if (!treeNode.AOTfindChild(_name))
throw error(strfmt("EDT %1 has not been created", _name));
}
Теперь можно изменить программно Relation
PHP код:
TreeNode EDTNode = ....AOTfindChild(myNewEDT);
TreeNode parent = EDTNode.AOTfindChild(#PropertyRelations);
TreeNode relation;
str properties;
;
parent = EDTNode.AOTfindChild(#PropertyRelations);
relation = parent.AOTfirstChild();
if (!relation)
{
throw error(strfmt("Relation of EDT %1 does not exist", EDTNode.toString()));
}
properties = relation.AOTgetProperties();
properties = setProperty(properties, #PropertyTable, _tableName);
properties = setProperty(properties, #PropertyRelatedfield, _relatedName);
relation.AOTsetProperties(properties);
EDTNode.AOTsave();
Надесь это как-нибудь поможет.