AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.08.2005, 14:29   #1  
vesna is offline
vesna
Участник
 
39 / 10 (1) +
Регистрация: 04.11.2004
Адрес: Москва
Создание наследника EDT через Х++
Сразу оговорюсь, для чего (потому что сразу же вместо ответа каждый, пытающийся сделать что-то подобное, первым же "ответом" получал это самое "зачем"): Хочу сделать мастер создания справочников, чтобы освободить себя от нудной работы создания EDT, таблицы, полей, индексов и тд,тд..

Вопрос: ситуация такова, что при создании наследника EDT в Х++ свойства в АОТ родительского типа в свойства надо переносить руками, в отличии от создания того же вручную, где на сохраниение свойства родительского EDT выставляются системой.
Props = tableNode.AOTgetProperties() имеет вид просто строки, индивидуальной для каждого стандартного типа typebase EDT. А через DictType количество свойств для манипуляции ограничен (если я не пропустила в этом классе чего-то важного). Подскажите варианты заполнения свойств наследуемого EDT свойствами родительского EDT. Ну честное слово, не строку же Props обрабатывать..
Старый 15.08.2005, 14:52   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
интересная задача...
вряд ли смогу сказать что-либо полезное по самому вопросу.
Думаю, что вам нужно рыть не в сторону DictType (он скорее на чтение), а в сторону treeNode... Хотя и не уверен.

но посмотрите сюда
http://www.axforum.info/forums/showt...&threadid=1437
http://www.axforum.info/forums/showt...&threadid=1850

а также сюда на работу с DictType (но не создание)
http://forum.mazzy.ru/index.php?showtopic=3668
__________________
полезное на axForum, github, vk, coub.
Старый 15.08.2005, 16:44   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
http://erpkb.com/Axapta/Funkcija/setProperty

http://www.axaptapedia.com/index.php...ded_Data_Types
За это сообщение автора поблагодарили: MikeR (10).
Старый 16.08.2005, 10:04   #4  
vesna is offline
vesna
Участник
 
39 / 10 (1) +
Регистрация: 04.11.2004
Адрес: Москва
Решение найдено! Спасибо!
str val;
val = Global::findProperty(parentProps, "StringSize");
if (val)
Props = Global::setProperty(Props, "StringSize", val);
Старый 16.09.2005, 14:45   #5  
mit is offline
mit
Участник
Аватар для mit
 
386 / 36 (2) +++
Регистрация: 15.01.2003
Адрес: Moscow
Lightbulb
указанным по ссылке belugin способом можно создать только стринговые EDT. Т.о. для каждого типа EDT необходимо написать свой метод, в котором при вставке в UtilIdElements нужно заполнить контейнер нужными свойствами.
Предлагаю свой вариант. Думаю, он проще.
PHP код:
static void Job1(Args _args)
{
UtilIdElements   uie;
XInfo            XInfo = new XInfo();
TreeNode         TNode;
TreeNode         DNode;
name             name "MyInt";
int              id;
;

select maxof(idfrom uie where uie.recordType == UtilElementType::ExtendedType && uie.utilLevel  == XInfo.currentAOLayer();
id =    uie.id;
id++;
select uie where uie.recordType == UtilElementType::ExtendedType && uie.name == "Integer";

uie.id id;
uie.utilLevel  XInfo.currentAOLayer( );
uie.recordType UtilElementType::ExtendedType;
uie.name       name;

uie.insert();
DNode TreeNode::findNode("Data Dictionary\\\\Extended Data Types");
DNode.AOTrefresh();

TNode TreeNode::findNode("Data Dictionary\\\\Extended Data Types\\\\"+name);
TNode.sysUtilDelete();
TNode.AOTsetProperties(setProperty(TNode.AOTgetProperties(), "Label"         "Label" ));
TNode.AOTsetProperties(setProperty(TNode.AOTgetProperties(), "HelpText"      "HelpText" ));
TNode.AOTsetProperties(setProperty(TNode.AOTgetProperties(), "DisplayLength" "Auto" ));
TNode.AOTsetProperties(setProperty(TNode.AOTgetProperties(), "Alignment"     "Auto" ));
TNode.AOTsetProperties(setProperty(TNode.AOTgetProperties(), "Extends"       "Extends" ));

TNode.AOTsave();
DNode.AOTnewWindow();
TNode.AOTnewWindow();

ps забыл что форум питается слешами :-)
Старый 16.09.2005, 14:57   #6  
mit is offline
mit
Участник
Аватар для mit
 
386 / 36 (2) +++
Регистрация: 15.01.2003
Адрес: Moscow
набор свойств можно дополнить. перечень можно скопировать их файла экспортированного элемента, или посмотреть в свойствах элемента.
Старый 16.09.2005, 15:16   #7  
vesna is offline
vesna
Участник
 
39 / 10 (1) +
Регистрация: 04.11.2004
Адрес: Москва
То, что это Integer видно только из названия типа. А где в свойствах типа указывается, что я хочу создать Integer -тип ?
По умолчанию Аксапта создает String -тип.
Если я не права, то ткните меня носом в то место кода, где идет различие между созданием, скажем, Integer-типа от Enum-типа
Старый 16.09.2005, 15:29   #8  
mit is offline
mit
Участник
Аватар для mit
 
386 / 36 (2) +++
Регистрация: 15.01.2003
Адрес: Moscow
Ок, находим в UtilIdElements элемент с нужным типом. В нашем случае, этот элемент называется "Integer". Но легко можно и использовать и AmountNoDecimals. Вот и используем его контейнер. т.е. запись создается на основе имеющейся. Для Enum-типа анологично, можно взять хоть "AltAddressType", затем подчистить свойства - и имеем новый элемент Enum-типа.
Base Enums создаются несколько иначе.
PHP код:
//...
select maxof(idfrom uie  where uie.recordType == UtilElementType::Enum && uie.utilLevel  == XInfo.currentAOLayer();

uie.id++;
uie.utilLevel  XInfo.currentAOLayer( );
uie.recordType UtilElementType::Enum;
uie.name       _name;
uie.insert();

tNode TreeNode::findNode("Data Dictionary\\\\Base Enums");
tNode.AOTrefresh();

tNode TreeNode::findNode("Data Dictionary\\\\Base Enums\\\\"+_name);
//... 
ну и дальше добавляем елементы

ps да чтож он (форум) половину слешей съедает
Старый 16.09.2005, 15:38   #9  
vesna is offline
vesna
Участник
 
39 / 10 (1) +
Регистрация: 04.11.2004
Адрес: Москва
А! Поняла идею! Буду пробовать. Спасибо
Старый 16.09.2005, 16:07   #10  
ahtoh
Гость
 
n/a
wow! девушка-программист
Старый 16.09.2005, 17:21   #11  
vic_z is offline
vic_z
Участник
 
26 / 30 (2) +++
Регистрация: 11.12.2003
Re: Создание наследника EDT через Х++
Цитата:
Изначально опубликовано 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(filename0);

    
infolog.importElement(exportId,
                          
UtilFileType::Application,
                          
UtilElementType::ExtendedType,
                          
_name,
                          
#EDTStartPos,
                          #impOk);

    
infolog.endImport(exportId1);

    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(); 
Надесь это как-нибудь поможет.
Старый 02.05.2012, 07:38   #12  
vital-credo is offline
vital-credo
Участник
 
1 / 10 (1) +
Регистрация: 26.01.2012
Адрес: OMS
Я сделал всё проще. Это конечно не Ax 3.0, а AX 2009 (kernel 5.0.1000.52).
Вот пример функции:
X++:
public void changeRelation(str _tableName, str _relatedName, boolean _withThrow = true)
{
    TreeNode         relation;
    str              properties;
    ;

    relation = EDTNode.AOTfindChild(#PropertyRelations);
    if (!relation)
    {
        if (_withThrow)
            throw error("@SYS8500" + funcName());
        else
            return;
    }

    relation = relation.AOTaddSubNode(#NT_DBTYPENORMALREFERENCE);

    properties = relation.AOTgetProperties();
    properties = setProperty(properties, #PropertyTable, _tableName);
    properties = setProperty(properties, #PropertyRelatedfield, _relatedName);
    relation.AOTsetProperties(properties);

    EDTNode.AOTsave();
}
Старый 02.05.2012, 08:13   #13  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Цитата:
Сообщение от vital-credo Посмотреть сообщение
X++:
 relation = relation.AOTaddSubNode(#NT_DBTYPENORMALREFERENCE);
В AX2009 для этого есть метод AOTaddRelation.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
4.0SP2: Создание записи в ForecastSales через API Jab Straight DAX: Программирование 8 30.11.2007 11:39
Создание РБП, через периодические операции sparur DAX: Функционал 7 30.08.2007 19:44
Создание EDT в X++ Dimus DAX: Программирование 9 14.10.2005 13:48
Список полей таблиц на базе конкретного EDT Владимир Максимов DAX: Программирование 10 06.10.2004 14:45
Создание контролов через TreeNode uvi DAX: Программирование 3 21.07.2003 11:23

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:21.