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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.12.2020, 20:17   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,987 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Набросал небольшое исследование.
В общем из мапа достается равная копия буфера несвязанная с курсором.
Хотя почему-то в моем случае она обновилась и без skipTtsCheck
Неожиданно.

X++:
static void testBuffer(Args _args)
{
    // RecId           recId = 5637144576;
    InventTable     inventTable;
    InventTable     inventTable2;
    
    Map             map = new Map(Types::Int64, Types::Record);
    ;
    
    // inventTable.disableCache(true);
    ttsBegin;
    
    // inventTable = InventTable::findRecId(recId, curExt2dataareaid(tableNum(InventTable)), true);
    select 
    forupdate 
    inventTable order by RecId;
    
    info(strFmt("до помещения в мап inventTable.usageCount() = %1", inventTable.usageCount()));
    info(strFmt("recId = %1, forUpdate = %2", inventTable.RecId, inventTable.selectForUpdate())); // выдаст true
    
    map.insert(inventTable.RecId, inventTable);
    info(strFmt("после помещения в мап inventTable.usageCount() = %1", inventTable.usageCount()));
    
    inventTable2 = map.lookup(inventTable.RecId);
    info(strFmt("Достали из мапа recId = %1, forUpdate = %2", inventTable2.RecId, inventTable2.selectForUpdate())); // выдаст false
    
    if (inventTable2.equal(inventTable))
    {
        info(strFmt("Буфер извлеченный из БД и из мапа РАВНЫ. inventTable.usageCount() = %1, inventTable2.usageCount() = %2", inventTable.usageCount(), inventTable2.usageCount()));
    }
    else
    {
        info(strFmt("Буфер извлеченный из БД и из мапа НЕ равны.inventTable.usageCount() = %1, inventTable2.usageCount() = %2", inventTable.usageCount(), inventTable2.usageCount()));
    }
    
    inventTable.RecId++;
    
    if (inventTable2.RecId == inventTable.RecId)
    {
        info("в памяти это один и тот же объект");
    }
    else
    {
        info("в памяти это разные объекты");
    }
    
    // а что с курсором ?
    
    try
    {
        next inventTable;
        info(strFmt("С буфером извлеченным из базы связан курсор и можно выполнить next. - Извлечена следующая запись с RecId = %1", inventTable.RecId));
    }
    catch
    {
        info(strFmt("С буфером извлеченным из базы уже НЕ связан курсор (и это странно) RecId = %1", inventTable.RecId));
    }
    
    /* // если раскомментить код то будет ошибка времени выполнения что говорит о том что курсор уже не связан с inventTable2 т.е. мы работали с копией 
    try
    {
        next inventTable2;
        info(strFmt("С буфером извлеченным из базы связан курсор и можно выполнить next. - Извлечена следующая запись с RecId = %1", inventTable2.RecId));
    }
    catch
    {
        info(strFmt("С буфером извлеченным из базы уже НЕ связан курсор (и это странно) RecId = %1", inventTable2.RecId));
    }
    */
    
    info(strFmt("RecId = %3. inventTable.BOMLevel до обновления = %1. forupdate = %2", inventTable.BOMLevel, inventTable.selectForUpdate(), inventTable.RecId));
    inventTable.BOMLevel++;
    inventTable.doUpdate();
    inventTable.reread();
    info(strFmt("inventTable.BOMLevel после обновления = %1", inventTable.BOMLevel));
    
    info(strFmt("RecId = %3. inventTable2.BOMLevel до обновления = %1. forupdate = %2", inventTable2.BOMLevel, inventTable2.selectForUpdate(), inventTable2.RecId));
    inventTable2.BOMLevel++;
    inventTable2.doUpdate();
    inventTable2.reread();
    info(strFmt("inventTable2.BOMLevel после обновления = %1", inventTable2.BOMLevel, inventTable.RecId));
    // оказалось что skipTtsCheck уже не нужен
    
    ttsCommit;
    
}
За это сообщение автора поблагодарили: mazzy (15), SHiSHok (4).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
stephenmann: Technical History of Dynamics AX - From Axapta 3.0 to AX2012 Blog bot DAX Blogs 5 03.03.2017 10:22
ax2012 - почему не находит по RecID УЖЕ существующую запись? mazzy DAX: Программирование 14 21.11.2014 10:20
как получить активную запись грида dreamer DAX: Программирование 1 23.03.2007 14:58
Как получить запись из связанного DataSource (InnerJoin) Berty Wooster DAX: Программирование 1 17.09.2003 20:04

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

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

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