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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2025, 09:22   #1  
Отшельник is offline
Отшельник
Участник
 
48 / 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
Отшельник
Участник
 
48 / 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
Отшельник
Участник
 
48 / 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,725 / 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
Цитата:
Сообщение от Отшельник Посмотреть сообщение
Подскажите ДЖОБ.
Появились по видимому во время модификаций.
Покажите эту тему разработчикам которые делали модификации. Они разберутся.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вывод всех таблиц со всеми полями 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:45.