Показать сообщение отдельно
Старый 07.02.2017, 16:06   #214  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Цитата:
Сообщение от mazzy Посмотреть сообщение
2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста.
Никогда не сталкивался с процессом регистрации и проект сейчас в стадии запуска, так что немного не до этого. Но если кто-то желает помочь с этим и займется - я не возражаю и только всячески приветствую.
Цитата:
Сообщение от mazzy Посмотреть сообщение
а можно попросить у вас еще и код, который у вас приводит к подобному "результату"?
Сам код разбросан по кускам разных классов, которые в силу NDA я не имею права выкладывать. Но в целом идея такая:
  1. Создаете в таблице YourTableName поле типа контейнер PackedData
  2. Заполняете структуру значениями в обычном исполняемом коде и через .pack() сохраняете его в таблицу. Например так:
    X++:
        YourTableName                           yourTableName;
        Struct                                  struct;
    
        struct  = new Struct();
        
        struct.add('ScenarioHistoryRecId', someRecId);
        struct.add('ResponseCode'        , someText);
        struct.add('InvoiceDateDispute'  , someDateTime);
        struct.add('OrigInvoiceDueDate'  , anotherDateTime);
        struct.add('OutstandingAmount'   , someRealValue);
        struct.add('DateReminderSent'    , oneMoreDateTime);
        struct.add('NewDueDateRemind'    , someDate);
        
        yourTableName.clear();
        yourTableName.PackedData = struct.pack();
        yourTableName.insert()
  3. Создаете наследника RunBaseBatch, в методе run() десереализируете сохраненную структуру через create() и запускаете один раз просто так, а второй раз в пакете.
    X++:
        YourTableName                           yourTableName = YourTableName::find(yourTableRecId);
        Struct                                  dataStruct    = yourTableName.PackedData
                                                              ? Struct::create(yourTableName.PackedData)
                                                              : new Struct();
        Counter                                 i;
    
        info(strFmt("Record id: %1", yourTableName.RecId));
        
        for (i = 1; i <= dataStruct.fields(); i++)
        {
            info(strFmt("%1: %2", dataStruct.fieldName(i), dataStruct.value(dataStruct.fieldName(i))));
        }
  4. Удивляетесь увиденному

Похоже, что в AX ключи следуют в порядке их добавления, а в CIL в алфавитном порядке. Мне вот абсолютно на порядок плевать, но хотелось бы, раз они меняют порядок ключей, то чтобы и порядок значений изменился соответствующим образом. У нас R2, проверьте кто-нибудь в R3, может уже исправили.
__________________
Кононов Пётр

Последний раз редактировалось pedrozzz; 07.02.2017 в 16:20.
За это сообщение автора поблагодарили: mazzy (5).