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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2015, 13:26   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Проход по всему АОТ и изменение свойств
Доброго времени суток!

Стоит задача обойти абсолютно все узлы АОТ, проверить есть ли у них свойство CountryRegionCodes, получить его значение и в определенных условиях присвоить новое значение.

Нашел много вариантов прохода по АОТ, но не нашел способа решить вторую часть задачи. Подскажите самый простой способ решения.
Старый 11.11.2015, 13:45   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Вам нужно, чтобы поля, доступные в определенных регионах, были видны в других или вообще всех регионах? Задача нетривиальная. В коде куча проверок типа "if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoRU]))", т.е. даже если вы "откроете" поля, они могут оказаться пустыми. От региона может зависеть, как то или иное поле будет заполнено. Так что автоматически присваивать новое значение свойству CountryRegionCodes опасно, если не анализировать каждое изменение.

Последний раз редактировалось Stitch_MS; 11.11.2015 в 13:48.
Старый 11.11.2015, 13:45   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
305 / 873 (30) +++++++
Регистрация: 23.10.2012
X++:
TreeNode.AOTsetProperty( 'name', value );
TreeNode.AOTsave();
If(TreeNode.TreeNodeType().isConsumingMemory())
    TreeNode.treeNodeRelease();

Последний раз редактировалось Товарищ ♂uatr; 11.11.2015 в 13:56.
Старый 11.11.2015, 14:06   #4  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Вам нужно, чтобы поля, доступные в определенных регионах, были видны в других или вообще всех регионах? Задача нетривиальная. В коде куча проверок типа "if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoRU]))", т.е. даже если вы "откроете" поля, они могут оказаться пустыми. От региона может зависеть, как то или иное поле будет заполнено. Так что автоматически присваивать новое значение свойству CountryRegionCodes опасно, если не анализировать каждое изменение.
Надо что бы в определенном регионе было видно еще один регион.
Я в курсе что по коду придется тоже проходить, думаю вручную поиском это вполне реально сделать. Просто АОТ вручную перелопачивать так себе вариант )
Старый 11.11.2015, 16:55   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от syl Посмотреть сообщение
Надо что бы в определенном регионе было видно еще один регион.
Я в курсе что по коду придется тоже проходить, думаю вручную поиском это вполне реально сделать.
Можно попробовать значение макросов изменить так чтобы два региона имели одно и тоже значение. Сам не пробовал, нужно тестировать.
Старый 11.11.2015, 17:35   #6  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от syl Посмотреть сообщение
Надо что бы в определенном регионе было видно еще один регион.
Я в курсе что по коду придется тоже проходить, думаю вручную поиском это вполне реально сделать. Просто АОТ вручную перелопачивать так себе вариант )
Можно попробовать дублировать ISO код для вашего региона. Нужно смотреть и тестировать.
Если не взлетит, то тогда альтернатива - выгрузить нужные объекты и пройтись по коду и свойствам один раз, сделав нужные изменения.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 13.11.2015, 01:11   #7  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от syl Посмотреть сообщение
Доброго времени суток!

Стоит задача обойти абсолютно все узлы АОТ, проверить есть ли у них свойство CountryRegionCodes, получить его значение и в определенных условиях присвоить новое значение.

Нашел много вариантов прохода по АОТ, но не нашел способа решить вторую часть задачи. Подскажите самый простой способ решения.
Форма SysAOTFind, вызывается по Ctrl+F.
Умеет искать любое свойство элемента в АОТ.
- патчим, и она начинает Работать на вас
- не забываем снести патч по окончанию
Старый 13.11.2015, 11:58   #8  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Написал такой джоб:
X++:
static void ChangeRegionCodes(Args _args)
{
    UtilElements        e;    
    TreeNode            treeNode;    
    Dialog              dialog;
    DialogField         _level;
    DialogField         _from;
    DialogField         _to;
    UtilEntryLevel      utilLevel;
    str                 _fromVal;
    str                 _toVal;    
    str                 value;
    int                 i;
    ;
    
    dialog = new Dialog("Change locale");
    _level = dialog.AddField(enumStr(UtilEntryLevel));
    _from = dialog.AddField(extendedTypeStr(Region));
    _to = dialog.AddField(extendedTypeStr(Region));
    if(dialog.run())
    {
        utilLevel = _level.value();
        _fromVal = _from.value();
        _toVal = _to.value();
    }
    
    while select e where e.utilLevel == utilLevel && !(e.recordType == 37) //SharedProjects
    {
        treeNode = xUtilElements::getNodeInTree(xUtilElements::parentElement(e));

        try
        {
            if(treeNode.AOTtypeStr() != "WMU"
            && treeNode.AOTtypeStr() != "PRN"
            && treeNode.AOTtypeStr() != "JOB")
            value = treeNode.AOTgetProperty("CountryRegionCodes");
            if(value && strContains(value, _fromVal) && !strContains(value, _toVal))
            {
                treeNode.AOTsetProperty("CountryRegionCodes", value + strFmt(",",_toVal));
                treeNode.AOTsave();
                i++;
            }
            If(treeNode.TreeNodeType().isConsumingMemory())
                treeNode.treeNodeRelease();
        }
        catch
        {
            info(treeNode.AOTtypeStr());
        }
    }
    info(strFmt("Count of objects changed: %1", i));
}
При проходе по sys слою работает пару часов потом выдает ошибку "недостаточно памяти".
Есть еще варианты?
Старый 13.11.2015, 12:12   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Случаи нехватки памяти при перелопачивании клиентом всего АОТа нередки. Во-первых, можно перенести работу job'а на сервер (запускать его соотв. пунктом меню), во-вторых, можно сжалиться и лопатить не весь АОТ за раз, а по отдельным веткам
За это сообщение автора поблагодарили: syl (1).
Старый 13.11.2015, 12:29   #10  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Случаи нехватки памяти при перелопачивании клиентом всего АОТа нередки. Во-первых, можно перенести работу job'а на сервер (запускать его соотв. пунктом меню), во-вторых, можно сжалиться и лопатить не весь АОТ за раз, а по отдельным веткам
Угу, а именно:
  • Extended Data Type
  • Menu and menu items
  • Enum and enum value
  • Table and table field
  • View and view field
  • Map and map field
  • Form control
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: syl (1).
Старый 13.11.2015, 13:34   #11  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от Link Посмотреть сообщение
Угу, а именно:
  • Extended Data Type
  • Menu and menu items
  • Enum and enum value
  • Table and table field
  • View and view field
  • Map and map field
  • Form control
В таблице UtilElements я не нашел типов View и Map. И есть проблема с формами, сама форма не содержит свойство CountryRegionCodes, надо както получать свойство из дочерней ноды дизайна
Старый 16.11.2015, 11:55   #12  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Все сделал. Если кому интересно, вот код:

X++:
class ChangeRegionCodes
{
    int64 i,z;
}

private void ChangeCode(TreeNode _objTreeNode)
{
    int line;
    str value;
    ;
    if (_objTreeNode)
    {
        _objTreeNode = _objTreeNode.AOTfirstChild();

        while (_objTreeNode)
        {
            z++;

            try
            {
                value = _objTreeNode.AOTgetProperty("CountryRegionCodes");
                if(strContains(value, "RU") && !strContains(value, "UA"))
                {
                    _objTreeNode.AOTsetProperty("CountryRegionCodes", value + ",UA");
                    _objTreeNode.AOTsave();
                    i++;
                }
            }
            catch
            {
                infolog.clear(0);
            }

            this.ChangeCode(_objTreeNode);

            _objTreeNode = _objTreeNode.AOTnextSibling();
        }
    }
}

private void Proceed()
{
    TreeNode    objTreeNode;
    utcDateTime time;
    setPrefix("Change region codes");
    time = DateTimeUtil::utcNow();

    objTreeNode = TreeNode::findNode(@"\Menu Items\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Data Dictionary\Tables\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Data Dictionary\Maps\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Data Dictionary\Views\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Data Dictionary\Extended Data Types\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Data Dictionary\Base Enums\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Menus\");
    this.ChangeCode(objTreeNode);
    objTreeNode = TreeNode::findNode(@"\Forms\");
    this.ChangeCode(objTreeNode);

    info(strFmt("Process started at %1",time));
    info(strFmt("Count of objects changed: %1. Objects count: %2", i, z));
    info(strFmt("Process ended at %1",DateTimeUtil::utcNow()));
}

static server void main()
{
    ChangeRegionCodes c = new ChangeRegionCodes();
    c.Proceed();
}
Проверено, отработал отлично, но очень долго (в моем случае около 11 часов)
Старый 16.11.2015, 11:59   #13  
axm2013
Гость
 
n/a
Цитата:
Сообщение от syl Посмотреть сообщение
...Проверено, отработал отлично, но очень долго (в моем случае около 11 часов)
Может разделить на потоки?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Korus Axapta Retail: Потребительские свойства. Как можно отобрать номенклатуру с определенными значениями свойств? mazzy DAX: Прочие вопросы 28 28.05.2009 12:22
Изменение свойств DataSource в RunTime kashperuk DAX: Программирование 15 13.10.2005 11:36
Изменение элемента в АОТ anf DAX: Программирование 0 25.11.2004 10:18
Изменение свойств ProgrammableSection Алексей Контев DAX: Программирование 2 13.05.2002 22:39
Изменение свойств Grid с помощью метода источника данных displayOption Anton Sk. DAX: База знаний и проекты 0 03.12.2001 18:08
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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