Показать сообщение отдельно
Старый 23.12.2010, 16:54   #21  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Глюки при импорте xpo.
project_ImportError.rar

Еще один глюк при сравнении таблиц при импорте.
В прилагаемом архиве два проекта, загружаем первый.
1. Опять запускаем импорт, жмем Show details, в окне импорта смотрим отличия в поле таблицы (Adjustment отличается), хотя по факту - не отличается.
2. При импорте второго проекта в окне импорта сравнении этой ошибки нет.

В-общем, если поле наследовано от edt с Adjustment = Right, то при сравнении во время импорта выдается, будто там - Left. Ошибка в
X++:
treeNodeImport  = infolog.getImportedNode(...)
Если сразу вытащить свойства из treeNodeImport после его загрузки из файла, там действительно будет Left. Во втором проекте просто перенес строку с Adjustment над строкой ExtendedDataType. В этом случае все ок, свойства читаются корректно.

Ошибка повторяется на 4.0 и 2009.

P.S. Вроде ничего страшного, однако мешает при импорте больших проектов, когда нужно найти отличия в объектах в системе и xpo. Везде, где поле наследовано от edt с выравниваем вправо, будет отличие, которого на самом деле нет. Если нет вот такой вот "штучечки" Есть ли у кого-нибудь такая штучечка?, такой проблемы не возникает, все равно по одному объекту сравнивать.


Вдогонку: если выгрузить таблицу с непустой группой полей AutoReport и пустой группой AutoLookup, то в окне импорта при сравнении будет отличие в порядке этих групп. Группы меняются местами, если первая с полями, вторая - без. Это на 4.0, на 2009 не проверял. У себя вылечил вот тут \Classes\SysTreeNode\comparableTextList.
Исходный код:
X++:
/*
  Subnodes
*/

    iterator = treeNode.AOTiterator();
    if (iterator)
        tmp = iterator.next();

    while (tmp)
    {
        if (!SysTreeNode::hasSource(tmp) || tmp.AOTgetSource())
        {
            children += '  '+tmp.treeNodeName()+'\n';
        }
        tmp = iterator.next();
    }
исправление:
X++:
/*
  Subnodes
*/

    iterator = treeNode.AOTiterator();
    if (iterator)
        tmp = iterator.next();

    while (tmp)
    {
        if (!SysTreeNode::hasSource(tmp) || tmp.AOTgetSource())
        {
            // 23/12-2010 bugfix compare tables (see order of field groups AutoReport, AutoLookup.
            // modify order to their native one) kird:  -->
            if (curuserid() == "kird")
            {
                if (treeNode.AOTname() == "Field Groups" &&
                    (tmp.treeNodeName() == "AutoReport" || tmp.treeNodeName() == "AutoLookup"))
                {
                    children = '  '+"AutoReport"+'\n';
                    children += '  '+"AutoLookup"+'\n';
                }
                else
                    children += '  '+tmp.treeNodeName()+'\n';
            }
            else
            // 23/12-2010 bugfix kird:  <--
                children += '  '+tmp.treeNodeName()+'\n';
        }
        tmp = iterator.next();
    }
За это сообщение автора поблагодарили: Dron AKA andy (2), Maximin (2), Logger (1).