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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2008, 12:59   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Есть ли у кого-нибудь такая штучечка?
Есть большой xpo в нём много объектов.
Делаю импорт.
Изменений в нём я знаю что мало.
Переберать сравнением каждый объект, чтоб увидеть изменения не хочется.
Так вот вопрос:
Может у кого нибудь есть такая доработка и он ей поделится.
Так чтоб галочку какую-нибудь отжать или что-то в этом роде и система как-нибудь показала только те объекты, которые изменены.
Может штатное средство есть.
Я не нашёл.
Не хочется садится за программирование.
А очень нужно.
Старый 22.01.2008, 13:15   #2  
tourist is offline
tourist
Участник
 
21 / 14 (1) ++
Регистрация: 03.05.2006
Попробуйте загрузить проект в USP, а затем создать новый проект, используя сравнение слоев, корый будет содержать только измененнные в USP объекты
Старый 22.01.2008, 13:20   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от tourist Посмотреть сообщение
Попробуйте загрузить проект в USP, а затем создать новый проект, используя сравнение слоев, корый будет содержать только измененнные в USP объекты
Вариант конечно, но геморойный какой-то.
Лучше уж код написать.
Мне же не на один раз такое нужно.
Старый 22.01.2008, 13:26   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Есть такая разработка.
http://www.systomatics.com/Projects/...cts/proj13.htm
__________________
Андрей.
За это сообщение автора поблагодарили: zemlyn (2), Logger (2), gl00mie (5), miklenew (2), alex55 (1), zZ_TOP_Zz (1).
Старый 22.01.2008, 16:19   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Спасибо. То что доктор прописал.
Правда она щас у меня то виснет, то не виснет.
Не пойму из-за объёма или из-за определённых объектов.
Методом научного тыка.
Найду проблему отпишусь.
Старый 12.08.2009, 15:00   #6  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
Есть такая разработка.
http://www.systomatics.com/Projects/...cts/proj13.htm
Кто-нибудь адаптировал это дело на DAX4? Хочется загрузить, вдруг кто уже заморочился до меня, чтоб не возиться...
__________________
Андрей.
Старый 12.08.2009, 17:34   #7  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Вариант решения.
Писал на коленке на 3.0, перевел на 4.0

\Classes\SysImportElements\compareNodes
X++:
private boolean compareNodes(FormTreeControl _formTreeControl, FormTreeItem _formTreeItem)
{
    TreeNode                        treeNodeAOT;
    TreeNode                        treeNodeImport  = NULL;
    int                             exportId;
    int                             flag            = (#impGetCompareNode + #impKeepIds);
    boolean                         ret;
    ;

    if (_formTreeItem &&
        _formTreeItem.stateBold())
    {
        select firstonly tmpImportAot
            where tmpImportAot.TreeNodePath == _formTreeItem.data();

        if (tmpImportAot)
        {
            treeNodeAOT = infolog.findNode(tmpImportAot.TreeNodePath);
            if (treeNodeAot)
            {
                ret = true;
                exportId        = infolog.startImport(filename, flag);
                treeNodeImport  = infolog.getImportedNode(
                                        exportId,
                                        tmpImportAot.UtilFileType,
                                        tmpImportAot.UtilElementType,
                                        tmpImportAot.treeNodeName,
                                        tmpImportAot.FilePos,
                                        flag);
                ret = SysCompare::silentCompare(SysTreeNode::newTreenode(treeNodeAOT), SysTreeNode::newTreenode(treeNodeImport));

                infolog.endImport(exportId, 1);
            }
        }
    }
    return ret;
}
\Classes\SysImportElements\markDifferentObjects
X++:
public void markDifferentObjects(FormTreeControl _ftc)
{
    int idx;
    FormTreeControl     t = _ftc;
    FormTreeItem        i;
    TreeItemIdx     treeItemIdx;
    boolean checked, res;
    ;

    i = t.getItem(t.getRoot());
    SysFormTreeControl::expandTree(t, i.idx());

    while (i)
    {
        // KDV анализируем только конечные узлы дерева (листы - объекты АОТ):
        if (! strFind(i.data(), '\\', strLen(i.data()), -1))
        {
            // KDV сравниваем последний слой в АОТ и слой XPO:
            res = this.compareNodes(t, i);

            if (res)
                SysFormTreeControl::deselectedTreeItem_checkBox(t, i.idx());
            else
                SysFormTreeControl::selectedTreeItem_checkBox(t, i.idx());

            while select forUpdate firstonly tmpImportAot
                where tmpImportAot.TreeNodePath == i.data()
            {
                tmpImportAot.Import = ! res;
                tmpImportAot.update();
            }
        }
        else
            SysFormTreeControl::deselectedTreeItem_checkBox(t, i.idx());
        i = t.getItem(t.getNextVisible(i.idx()));
    }
}
\Forms\SysImportDialog\Methods\markDifferentObjects
X++:
void markDifferentObjects()
{
    ;
    sysImportElements.markDifferentObjects(AOTtree);
    tmpImportLabel_ds.executeQuery();
}
Добавляем кнопку на форму:
\Forms\SysImportDialog\Designs\Design\[Group:BottomGrp]\[ButtonGroup:ButtonGroup]\Button:MarkDifferentObjects\Methods\clicked
X++:
void clicked()
{
    element.markDifferentObjects();
}
минус - перед нажатием на кнопку нужно включить "Отобразить подробости". Да не особо шустро работает...
За это сообщение автора поблагодарили: Dron AKA andy (4), Small Den (1), Logger (5), leva (1),  (1).
Старый 17.08.2009, 16:11   #8  
olesh is offline
olesh
Участник
 
58 / 26 (1) +++
Регистрация: 02.04.2002
Адрес: Москва
Цитата:
Сообщение от Denicce Посмотреть сообщение
Писал на коленке на 3.0, перевел на 4.0
А для 3.0 не осталось варианта?
Старый 22.01.2008, 17:08   #9  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Да, у меня на объемных проектах тоже подвисает...
Может быть, не хватает ресурсов компа.
__________________
Андрей.
Старый 22.01.2008, 17:28   #10  
zemlyn is offline
zemlyn
Участник
Аватар для zemlyn
 
146 / 44 (2) +++
Регистрация: 28.01.2004
А подскажите, после нажатия на кнопку Keep Diffrence открывается много формочек Сравнение.
Дальше неизмененённые объекты из дерева пропадают.
А формочки Сравнение так и должны (все!) остаться открытыми?
Старый 22.01.2008, 17:37   #11  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
У меня никаких формочек не открывается. АХ 3.0SP3 CU1.
__________________
Андрей.
Старый 22.01.2008, 19:41   #12  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
В аксапте есть ссылка на интересный продукт, очень удобно, даже для очень больших проектов.

http://www.araxis.com/
Миниатюры
Нажмите на изображение для увеличения
Название: araxis.jpg
Просмотров: 765
Размер:	228.8 Кб
ID:	3160  
Изображения
 
За это сообщение автора поблагодарили: Logger (2), Aleksey_M (2).
Старый 13.08.2009, 18:57   #13  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Доработал вариант Denicce под себя: нужно, чтобы неизмененные объекты удалялись из дерева, а оставались только содержащие изменения.

Соответственно, вместо \Classes\SysImportElements\markDifferentObjects предлагается \Classes\SysImportElements\deleteEqualObjects:
X++:
public void deleteEqualObjects(FormTreeControl _ftc)
{
    FormTreeControl     treeControl = _ftc;
    FormTreeItem        treeItem;
    Set                 itemIdxSet = new Set(Types::Integer);

    void deleteNodeWithEmptyParents(FormTreeItem  _treeItem)
    {
        TreeItemIdx         idx;
        TreeItemIdx         childIdx;
        int                 i;
        boolean             parentIsEmpty;

        if (_treeItem)
        {
            idx = _treeItem.idx();
            itemIdxSet.add(idx);
            while select forUpdate firstonly tmpImportAot
                where tmpImportAot.TreeNodePath == _treeItem.data()
            {
                tmpImportAot.Import = false;
                tmpImportAot.update();
            }
            parentIsEmpty = true;
            childIdx = treeControl.getChild(treeControl.getParent(idx));
            while (childIdx)
            {
                if (!itemIdxSet.in(childIdx))
                {
                    parentIsEmpty = false;
                    break;
                }
                childIdx = treeControl.getNextSibling(childIdx);
            }
            if (parentIsEmpty)
                deleteNodeWithEmptyParents(treeControl.getItem(treeControl.getParent(idx)));
        }
    }


    itemIdxSet = new Set(Types::Integer);

    treeItem = treeControl.getItem(treeControl.getRoot());
    if (treeItem)
    {
        SysFormTreeControl::expandTree(treeControl, treeItem.idx());
        while (treeItem)
        {
            // KDV анализируем только конечные узлы дерева (листы - объекты АОТ):
            if (! strFind(treeItem.data(), '\\', strLen(treeItem.data()), -1))
            {
                // KDV сравниваем последний слой в АОТ и слой XPO:
                if (this.compareNodes(treeControl, treeItem))
                    deleteNodeWithEmptyParents(treeItem);

            }
            treeItem = treeControl.getItem(treeControl.getNextVisible(treeItem.idx()));
        }
        SysFormTreeControl::deleteTreeItem(treeControl, itemIdxSet);
    }
}
ну и соотв. образом подменить вызов исходного метода на мой.
__________________
Андрей.

Последний раз редактировалось Dron AKA andy; 25.08.2009 в 12:14.
За это сообщение автора поблагодарили: Small Den (1), Denicce (1), gl00mie (3),  (1).
Старый 14.08.2009, 10:28   #14  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
а compareNodes_NV это мой compareNodes?
Старый 24.08.2009, 18:09   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
нужно, чтобы неизмененные объекты удалялись из дерева, а оставались только содержащие изменения. Соответственно, вместо \Classes\SysImportElements\markDifferentObjects предлагается \Classes\SysImportElements\deleteEqualObjects:
X++:
void deleteNodeWithEmptyParents(FormTreeItem  _treeItem)
{
    TreeItemIdx         idx = _treeItem.idx();
    TreeItemIdx         childIdx;
    int                 i;
    boolean             parentIsEmpty;
    // ...
    if (parentIsEmpty)
        deleteNodeWithEmptyParents(treeControl.getItem(treeControl.getParent(idx)));
}
Если в импортируемом файле нет ни одного отличающегося объекта, то метод deleteNodeWithEmptyParents() доходит до узла AOT и рекурсивно вызывает себя с _treeItem == null, в результате чего код вываливается на строке TreeItemIdx idx = _treeItem.idx(). Наверно, имеет смысл сначала проверять параметр _treeItem, а уже потом вызывать на нем idx().
Старый 14.08.2009, 11:25   #16  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Да
Исправил в своем сообщении.
__________________
Андрей.
Старый 17.08.2009, 13:12   #17  
AX2009
Гость
 
n/a
Полезная штука! Выложите пожалуйста в виде .XPO

Кстати, на 2009 будет работать?
Старый 17.08.2009, 14:39   #18  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
В таком виде легче себе перенести, благо не так много изменений. Плюс не затрагиваются ваши изменения указанных объектов.
Думаю, на девятке тоже работать будет, но я не проверял.
Старый 17.08.2009, 17:17   #19  
AX2009
Гость
 
n/a
Потестил - вобщем работает с существенными ограничениями...
Если класс выгружен только с измененного слоя - неверно отмечает, что он изменен.
Если таблица выгружена только с измененного слоя - валится в throw error 'InventQualityOrderTable' does not have property 'ConfigurationKey'.

Если класс выгружен полностью и нажать на метод от Dron AKA andy выпадает в стек трейс (оригинальный метод отрабатывает корректно)
Старый 18.08.2009, 10:48   #20  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Вариант для 3.0.
\Classes\SysImportElements\compareNodes
X++:
private boolean compareNodes(FormTreeControl _formTreeControl, FormTreeItem _formTreeItem)
{
    TreeNode                        treeNodeAOT;
    TreeNode                        treeNodeImport  = NULL;
    int                             exportId;
    int                             flag            = (#impGetCompareNode + #impKeepIds);
    boolean                         ret;
    ;

    if (_formTreeItem &&
        _formTreeItem.stateBold())
    {
        select firstonly tmpImportAot
            where tmpImportAot.TreeNodePath == _formTreeItem.data();

        if (tmpImportAot)
        {
            treeNodeAOT = infolog.findNode(tmpImportAot.TreeNodePath);
            if (treeNodeAot)
            {
                ret = true;
                exportId        = infolog.startImport(filename, flag);
                treeNodeImport  = infolog.getImportedNode(
                                        exportId,
                                        tmpImportAot.UtilFileType,
                                        tmpImportAot.UtilElementType,
                                        tmpImportAot.treeNodeName,
                                        tmpImportAot.FilePos,
                                        flag);
                ret = new SysCompare(true).compareTreenodes(treeNodeAOT, treeNodeImport);
                infolog.endImport(exportId, 1);
            }
        }
    }
    return ret;
}
остальные методы такие же, как и в 4.0.
За это сообщение автора поблагодарили: olesh (1), gl00mie (5).
Теги
araxis, ax2009, ax3.0, ax4.0, xpo, документация, законченный пример, импорт, инструменты, полезное, разработка, сравнение, сравнение систем, сравнение слоев

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
А в СП6 есть что-нибудь про зарплату? Arahnid DAX: Программирование 5 10.05.2007 12:46
Axapta Report Designer vs. Something Андре DAX: Программирование 39 18.07.2005 11:06
А кто нибудь пробовал получать налоговую отчетность в системе? Sergioso DAX: Функционал 46 17.01.2005 14:56
Есть у кого ни будь Job ик для групповой замены поля dataareaid в группе таблиц ShadowFromXZone DAX: Функционал 7 13.10.2004 12:48
У кого есть вопросы по модулю Проекты AlexFK DAX: Функционал 2 30.04.2004 16:00
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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