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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2025, 09:22   #1  
Отшельник is offline
Отшельник
Участник
 
49 / 11 (1) +
Регистрация: 15.06.2011
Записей в блоге: 1
Непонятка с ИД полями
После модификации система начала вести себя не предсказуемо:
Не со всеми полями, но...

X++:
if (ediDocsXMLStructureLoc.TagId == "BuyerUnitOfMeasure")
            {
                tabId = _record.TableId;  //ПРАВИЛЬНОЕ как в АОТ
                fieldId = ediDocsXMLStructureLoc.SrcFieldId; //40014 ПРАВИЛЬНОЕ как в АОТ

                info(strFmt("SrcFieldId = %1 (%2)", ediDocsXMLStructureLoc.SrcFieldId, typeof(ediDocsXMLStructureLoc.SrcFieldId)));
                info(strFmt("Table: %1 (ID: %2)", tableId2Name(_record.TableId), _record.TableId));
                info(strFmt("Buffer type: %1", tableId2Name(_record.TableId)));
                dict = new DictTable(_record.TableId);

                for (i = 1; i <= dict.fieldCnt(); i++)
                {
                    fieldId = dict.fieldCnt2Id(i);
                    info(strFmt("ИД поля %3 Поле: %1, Значение: %2", dict.fieldName(fieldId), _record.(fieldId),fieldId));
                }

                fieldId = ediDocsXMLStructureLoc.SrcFieldId;
                rawVal = _record.(fieldId); //Выводит 0
                rawVal = _record.(40014); //Выводит 0

                fid = any2int(ediDocsXMLStructureLoc.SrcFieldId);
                rawVal = _record.(fid);//Выводит 0
                rawVal = _record.(ediDocsXMLStructureLoc.SrcFieldId + 0);//Выводит 0
            }
Хотя инфолог дает такую информацию:
SrcFieldId = 40014 (Integer)
Table: EDIDocDELNOTLine_KBK (ID: 40375)
Buffer type: EDIDocDELNOTLine_KBK
...
ИД поля 40014 Поле: BuyerUnitOfMeasure, Значение: рул
ИД поля 65535 Поле: TableId, Значение: 40375
...

Значит BuyerUnitOfMeasure имеет значение "рул"

Джобиком, по этой же записи показывает значение:
X++:
static void _DeleteTmp(Args _args)
{
    EDIDocDELNOTLine_KBK eDIDocDELNOTLine;
    Common     _record;
    DictTable dictTable;
    TableId tableId;
    FieldId fieldId;
    str fieldName;
    ;

    select firstOnly eDIDocDELNOTLine
        where eDIDocDELNOTLine.RecId == 5637171360;


    info(strFmt("%1",  eDIDocDELNOTLine.(40014)));

    _record = eDIDocDELNOTLine;

    info(strFmt("%1",  _record.(40014)));
    info(strFmt("%1", FieldNum(EDIDocDELNOTLine_KBK, BuyerUnitOfMeasure )));
Сообщение
рул
рул
40014

И это на некоторых полях. А некоторые сохранили свою работоспособность.




И еще одна странность появилась по этой же теме.

На настроечной таблице EDIDocsXMLStructure_KBK, есть EDIT-метод, который помогает выбирать нужное поле из таблицы EDIDocDELNOTLine_KBK.

Выбираем по наименованию поля из списка полей, а в EDIDocsXMLStructure_KBK записывается ИД этого поля. (т.е 40014)

Так вот этот EDIT-метод, работающий уже много лет, начал записывать не правильные ИД поля!

Так для поля BuyerUnitOfMeasure (40014) он записывает в EDIDocsXMLStructure_KBK ИД = 105550... Откуда ?!!

И джобик показывает, что у меня таких полей в принципе нет ни на одном слое.
X++:
static void SRA_Job284(Args _args)
{
    UtilIdElements  utilElements;
    ;
    while select id, parentId, name, utilLevel
        from    utilElements
        order by parentId, id
        where   //utilElements.utilLevel  <   UtilEntryLevel::usr &&
               utilElements.recordType ==  UtilElementType::TableField
            &&  utilElements.Id         >=  100000
    {
        info( strfmt( '%1.%2 (%3) %4', tableid2name( utilElements.parentId ), utilElements.name, utilElements.utilLevel, utilElements.Id ) );
    }
}
Ладно, бывает и такая магия.
Я создал новое поле, ИД которого в АОТ 40017.
Выбираю его и в таблицу записывается ИД = 105553.
Что за счетчик такой? Откуда эти номера?

На всякий случай код EDIT-метода (который не менялся уже много лет).
X++:
edit fieldName fieldName(boolean set, fieldName name)
{
    if (set)
    {
        this.SrcFieldId = fieldname2id(this.SrcTableId, name);
    }

    return fieldid2name(this.SrcTableId, this.SrcFieldId);
}
__________________
Dynamics AX 2009 SP1, Rollup 5, SQL Server 2008
Хороший ученик во всем найдет себе учителя...
Старый 11.11.2025, 14:18   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4,004 / 3299 (118) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
X++:
    info(int2str(fieldExt2Id(105550)));
    info(int2str(fieldId2Ext(40014, 1)));
выдает так
Цитата:
40014
105550
думаю, дальше разберетесь.

У вас там расширенные идентификаторы записались.
За это сообщение автора поблагодарили: Отшельник (1).
Старый 11.11.2025, 14:36   #3  
Отшельник is offline
Отшельник
Участник
 
49 / 11 (1) +
Регистрация: 15.06.2011
Записей в блоге: 1
Тему понял.
Есть ли вариант выгнать этих паршивцев из системы ?

Иначе эта "зараза" вылезет во многих местах ((
Буду ловить ее до пенсии )
__________________
Dynamics AX 2009 SP1, Rollup 5, SQL Server 2008
Хороший ученик во всем найдет себе учителя...
Старый 11.11.2025, 14:52   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4,004 / 3299 (118) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Джобить.
Ну и проверить код, которым они создались
Старый 11.11.2025, 14:59   #5  
Отшельник is offline
Отшельник
Участник
 
49 / 11 (1) +
Регистрация: 15.06.2011
Записей в блоге: 1
Цитата:
Сообщение от Logger Посмотреть сообщение
Джобить.
Ну и проверить код, которым они создались
Подскажите ДЖОБ.
Появились по видимому во время модификаций.

Их много - ловить долго буду - но буду.
Может ДЖОБ подскажет что искать.

Помогите пожалуйста.
Все выходные просидел (( Сейчас хоть луч "света в темном царстве" ))
__________________
Dynamics AX 2009 SP1, Rollup 5, SQL Server 2008
Хороший ученик во всем найдет себе учителя...
Старый 11.11.2025, 21:05   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,726 / 1208 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если я правильно понял, то вопросы формулируются так

Вопрос 1

rawVal = _record.(id)

переменная rawVal не возвращает значение. Отображает 0

однако

info(strFmt('%1', _record.(id)));

отображает значение поля


Ответ

Переменная rawVal какого типа?

Если это anyType, то для таких переменных тип устанавливается при первом присвоении значения и уже не меняется до завершении метода.

Вероятно, она у Вас получила числовое значение и, как следствие, конвертирует все значения в число. Вот и значение "рул" конвертировала в число и получился 0


Вопрос 2

Есть некая таблица, в которую записывают id-полей. Начиная с какого-то момент в это поле стало записываться не FieldId, а fieldId2Ext(). Существующий метод для записи использует функцию fieldName2id()

Ответ

Насколько я понимаю, надо по перекрестным ссылкам искать все места, где происходит обновление значения этого поля таблицы (запись значения id-поля). Не конкретно в показанном edit-методе, а вообще везде. Может быть, где-то в другом месте какое-то обновление выполняется или кто-то джоб какой-то создал

Дополните Вашу таблицу служебными полями ModifiedDateTime + ModifiedBy, чтобы понять, кто же и когда сделал такую специфическую запись. Правда это на будущее.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 12.11.2025, 08:29   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4,004 / 3299 (118) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Отшельник Посмотреть сообщение
Подскажите ДЖОБ.
Появились по видимому во время модификаций.
Покажите эту тему разработчикам которые делали модификации. Они разберутся.
Старый 12.11.2025, 11:36   #8  
Отшельник is offline
Отшельник
Участник
 
49 / 11 (1) +
Регистрация: 15.06.2011
Записей в блоге: 1
Спасибо. Реальная помощь
Во всей системе поменялись поля таблиц, основанные на расширенном типе fieldId.
Как по волшебству ) Обстоятельства выясняю.

Спасибо за anyType. Я забыл об этом поведении, а метод рекурсивный...

Менял обратно на не расширенные значения ИД полей таким джобом (может новичнам пригодиться)
X++:
static void SRA_FixFieldIdsee2fEntityLine_KBK(Args _args)
{
    ee2fEntityLine structRec;
    FieldId realFieldId;
    DictTable dictTable;
    str fieldName;
    int counterFixed = 0;

    ttsBegin;

    while select forUpdate structRec
        where structRec.SrcFieldId >= 100000 // подозрение на расширенный FieldId
    {
        realFieldId = fieldExt2Id(structRec.SrcFieldId);

        if (realFieldId != structRec.SrcFieldId)
        {
            dictTable = new DictTable(structRec.SrcTableId);
            fieldName = dictTable.fieldName(realFieldId);

            info(strFmt("Fix: RecId %1 | Old: %2 -> New: %3 | FieldName: %4 | Table: %5 (%6) | DocumentRefRecId: %7 | TagId: %8",
                        structRec.RecId,
                        structRec.SrcFieldId,
                        realFieldId,
                        fieldName,
                        structRec.SrcTableId,
                        tableId2Name(structRec.SrcTableId),
                        structRec.DstFieldName,
                        structRec.EntityId));

            structRec.SrcFieldId = realFieldId;
            structRec.doUpdate();
            counterFixed++;
        }
    }

    ttsCommit;

    info(strFmt("Исправлено записей: %1", counterFixed));
}

Вопрос по опыту. Чем может обернуться для системы в целом, если где останутся расширенные значения полей?
__________________
Dynamics AX 2009 SP1, Rollup 5, SQL Server 2008
Хороший ученик во всем найдет себе учителя...
Старый 12.11.2025, 14:00   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,726 / 1208 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Отшельник Посмотреть сообщение
Вопрос по опыту. Чем может обернуться для системы в целом, если где останутся расширенные значения полей?
Зависит от задачи.

Если цель - это получить значения поля через Common.(id), то разницы никакой. В таком виде одинаково правильно поймет и значение id и значение idExt.

Расширенное значение - это то же самое значение, но как первый элемент массива. Для "обычных" полей это одно и то же. Т.е. расширенное значение принципиально важно только для полей типа массив и только для элементов после первого
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вывод всех таблиц со всеми полями fedka DAX: Программирование 11 10.10.2012 21:38
Как в динамическом запросе использовать исловие OR между двумя полями? yooshi DAX: Программирование 12 07.08.2009 16:34
Объект Application клиента по ИД сессии на АОСе wolfstein DAX: Программирование 5 18.03.2009 14:35
Проблемы с date-полями death machine DAX: Прочие вопросы 4 13.04.2004 02:54
Диалоговое окно с Lookup полями Julietta DAX: Программирование 1 15.12.2003 13:00

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

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

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