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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.04.2015, 15:07   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как передать для Thread временные таблицы?
Ax2009. Как передать в новую нить (Thred) содержимое временной таблицы?

У меня пока единственная идея - это конвертация содержимого таблицы в нечто более примитивное. Например, в контейнер через buf2con() / con2buf(). Но, может есть варианты без конвертации?

PS: GlobalCache - не работает, поскольку в новом Thread получаю чистый (новый) GlobalCache

Пока работаю так:

X++:
// Вызов Thread
void run()
{
    Thread      thread;
    Container   conHeader;
    ;

    while select headerData
    {
        conHeader += [global::buf2con(headerData)];
    }
    thread = new Thread();
    thread.setInputParm([conHeader]);
    thread.removeOnComplete(true);
    thread.run(classnum(MyClass), staticmethodstr(MyClass, runThread));
    thread.waitUntilSignaled();
    infolog.import(thread.getOutputParm());
}

// Обработка
static void runThread(Thread _thread)
{
    container   packedArgs;
    container   conHeader;
    container   conValue;
    int         nextI;

    MyClass  report;
    TmpTable     headerData;
    ;

    report = new MyClass();

    packedArgs = _thread.getInputParm();
    conHeader = conPeek(packedArgs, 1);
    for (nextI = 1; nextI <= conLen(conHeader); nextI++)
    {
        conValue = conPeek(conHeader, nextI);
        global::con2buf(conValue, headerData);
        headerData.insert();
    }
    // Метод через setTmpData() актуализирует временную таблицу в контексте класса
    report.setHeaderData(headerData);

    // Выполнение
    report.run();

    _thread.setOutputParm(infolog.copy(1,infolog.num()));

}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 10.04.2015, 15:27   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Вот тут предлагают Set.
За это сообщение автора поблагодарили: Владимир Максимов (2).
Старый 10.04.2015, 15:32   #3  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
А почему не через параметры? Если все нити работают в одно время, то не вижу проблемы. Нужно проинициализировать курсор временной таблицы в самом начале (лучше на сервере) и его использовать.
Инициализировать так:
X++:
server static TmpTableName initTmpTableName()
{
    TmpTableName    tmpTableName;
    ;
    tmpTableName.clear();
    tmpTableName.insert();
    tmpTableName.delete();

    return tmpTableName;
}
Проект для примера, где есть серверный класс с диалогом, в диалоге заполнем руками временную таблицу, в классе выводим значения.
Вложения
Тип файла: xpo PrivateProject_test.xpo (10.7 Кб, 334 просмотров)

Последний раз редактировалось raz; 10.04.2015 в 15:36.
Старый 10.04.2015, 15:38   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Если не секрет, зачем вам thread ?
Если распараллеливаете задачу на потоки для ускорения, то лучше уж пакеты сделать с помощниками как в закрытии склада.
Старый 10.04.2015, 17:19   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Вот тут предлагают Set.
Хм... Те же контейнеры, но "вид сбоку" Впрочем, все-равно спасибо...

Цитата:
Сообщение от raz Посмотреть сообщение
А почему не через параметры?
Потому, что для Thread передать как параметр временную таблицу не получится. Передается только "голая" структура. Без данных.

Ну, или я "не умею их готовить" Можете сделать пример с использованием Thread, чтобы это работало?

Цитата:
Сообщение от Logger Посмотреть сообщение
Если не секрет, зачем вам thread ?
"Где бы, что ни говорили, все одно сведет на баб" (с)

Ответить-то я могу, это даже не секрет, но практика показывает, что после ответа на вопрос "зачем" обсуждение основного вопроса прекращается, и начинаются советы как делать по другому, чего не хотелось бы...

Цитата:
Сообщение от Logger Посмотреть сообщение
Если распараллеливаете задачу на потоки для ускорения, то лучше...
Вот об этом я и говорю... Для особо упорных - нет. Речь не идет об ускорении... Использование Thread необходимо, чтобы избежать некоторых ошибок в процессе исполнения. Т.е. отказаться от Thread можно, но сложно...
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 10.04.2015, 17:46   #6  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Можете сделать пример с использованием Thread, чтобы это работало?
Не получилось. А почему не использовать нормальную таблицу?
Старый 10.04.2015, 18:16   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от raz Посмотреть сообщение
А почему не использовать нормальную таблицу?
Потому, что это временные данные Нужны только на время работы класса. По окончании работы класса удаляются.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 10.04.2015, 19:05   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Использование Thread необходимо, чтобы избежать некоторых ошибок в процессе исполнения. Т.е. отказаться от Thread можно, но сложно...
Если вы захотите когда нить свою обработку засунуть в пакет, то обнаружите что thread в пакетном режиме не работают. И это будет облом.
Старый 10.04.2015, 19:06   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Потому, что это временные данные Нужны только на время работы класса. По окончании работы класса удаляются.
Дак в Аксапте таких данных дофига.
SalesParm*
PurchParm*

etc
Лень все перечислять.
Старый 13.04.2015, 08:37   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Не думаю, что это в принципе получится

Для каждого нового экземпляра Thread создается своя куча (убедиться в этом можно при помощи класса HeapCheck, созданного внутри потока), со своим набором объектов и курсоров
По-этому, в принципе нельзя получить ссылку на объект из другого потока

Скорее всего, таким образом добиваются безопасности потоков, поскольку в языке нет базовый классов/функций, позволяющих выполнять параллельный доступ
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 13.04.2015 в 08:39.
За это сообщение автора поблагодарили: Владимир Максимов (2), Logger (2), Kabardian (4).
Старый 13.04.2015, 16:44   #11  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 513 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Есть хороший пост на MSDN Threading in Dynamics AX.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: AlGol (1), virtuoso (1).
Старый 20.04.2015, 09:56   #12  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Возможно в ax 2012. В 2009 не думаю что получится передать напрямую.

В 2012 есть метод Common.getPhysicalTableName() и если таблица TempDB то к ней можно достучатся напрямую через SQL (используется в change tracking в R3. см. метод \Classes\RetailCDXChangeTracking\runChangeTracking_table)

Если очень хочется, можно самому создавать временную таблицу на SQL (из X++), передавать ее имя в Thread, написать обертку вокруг всего этого ....
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 20.04.2015, 10:36   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Не смешивайте, пожалуйста)

Для InMemory и в 2012 нельзя
__________________
Axapta v.3.0 sp5 kr2
Старый 20.04.2015, 11:34   #14  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Если очень хочется, можно самому создавать временную таблицу на SQL (из X++), передавать ее имя в Thread, написать обертку вокруг всего этого ....
Сильно сомневаюсь...

Временная таблица MS SQL "живет" в рамках созданного соединения. В терминах Axapta: в рамках объекта Connection (или ODBCConnection или UserConnection). Но передать любой объект в новый Thread - невозможно! Следовательно, и про объект Connection можно забыть...

Нет, можно, конечно, делать глобальную временную таблицу, но это уже мало чем отличается от постоянной таблицы со всеми сопутствующими проблемами...

Или Thread всегда (?) работает в рамках того же самого соединения, не создавая нового?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 20.04.2015, 14:24   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Коннекшен для TempDB неважен

Недавно приводили пример, как может заполняться таблица на самом SQL-сервере в хранимой процедуре

Для доступа к этой таблице достаточно передать ее имя (уникальное для сессии)
__________________
Axapta v.3.0 sp5 kr2
Старый 20.04.2015, 14:43   #16  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
Коннекшен для TempDB неважен
Это как? Другой пользователь/сеанс может увидеть "мои" временные данные?

Цитата:
Сообщение от AndyD Посмотреть сообщение
Недавно приводили пример, как может заполняться таблица на самом SQL-сервере в хранимой процедуре

Для доступа к этой таблице достаточно передать ее имя (уникальное для сессии)
Это все будет работать только в том случае, если сессия не переключилась на другое соединение. В смысле, и ХП SQL-сервера и дальнейшее обращение к временной таблице выполнялось в рамках одного соединения к серверу. Пусть даже эти обращения были в разных классах, но соединение должно быть одно и то же!

На практике, гарантировать "не переключение" соединения на уровне Axapta можно только путем прямого контроля за объектом Connection. Все остальное - это "как повезет". Может получиться, а может и нет...

Тот факт, что, как правило, Axapta "держит" текущее соединение до окончания обработки, как раз и относится к таким "везениям". Некое действие по умолчанию, которое программист контролировать не может. Поэтому строить на этом какие-то далеко идущие выводы - не стоит.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 20.04.2015, 14:52   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Это как? Другой пользователь/сеанс может увидеть "мои" временные данные?
Совершенно верно
Одно условие - он должен знать имя таблицы (не аксаптовское, а физическое, что-нибудь типа такого [tempdb].[dbo].[t100005_E51B88936E814961BE9EFF89CE81E8D4]).

Насчет сессии, повторюсь, совершенно неважно
Я в Менеджмент студии руками заполнял значения таблицы, которая отображалась в интерфейсе аксапты

Насчет "удержания соединения" - это уже задача программиста, что бы оно удерживалось на время работы стороннего средства)
__________________
Axapta v.3.0 sp5 kr2
Старый 20.04.2015, 17:08   #18  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
Сообщение от AndyD
Не смешивайте, пожалуйста)

Для InMemory и в 2012 нельзя
Не смешиваю Я четко написал "если таблица TempDB то...".

Цитата:
Сообщение от AndyD Посмотреть сообщение
Одно условие - он должен знать имя таблицы (не аксаптовское, а физическое, что-нибудь типа такого [tempdb].[dbo].[t100005_E51B88936E814961BE9EFF89CE81E8D4]).
Вот именно поэтому передать значение в Thread очень даже возможно - передавайте название таблици и уже делаете что хотите с ней внутри Thread.

X++:
TmpTable tmpTable;

//fill tmpTable

thread = new Thread();
    thread.setInputParm([tmpTable.getPhysicalTableName()]);
    thread.removeOnComplete(true);
    thread.run(classnum(MyClass), staticmethodstr(MyClass, runThread));
    thread.waitUntilSignaled();
    
// tmpTable после работы Thread
tmpTable будет удалена автоматом как выйдите за рамки метода.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 20.04.2015, 20:24   #19  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
имя таблицы (не аксаптовское, а физическое, что-нибудь типа такого [tempdb].[dbo].[t100005_E51B88936E814961BE9EFF89CE81E8D4]).
Я так понимаю, это "фишка" Ax2012 и в Ax2009 не применима?

Тот факт, что у имени таблицы отсутствует ведущий символ "#", идентифицирующий именно временную таблицу в терминах MS SQL - это особенности "перевода" (пример) или действительно таблица создается в узле Table, а не в узле "Temporary Tables" базы данных tempdb? В смысле, если смотреть через MS SQL Server Management Studio.

Т.е. с точки зрения MS SQL - это именно временная таблица, живущая только в текущем соединении, или постоянная таблица просто созданная в базе tempdb?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 20.04.2015, 21:54   #20  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Я так понимаю, это "фишка" Ax2012 и в Ax2009 не применима?
Да, только для 2012-й
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Тот факт, что у имени таблицы отсутствует ведущий символ "#", идентифицирующий именно временную таблицу в терминах MS SQL - это особенности "перевода" (пример) или действительно таблица создается в узле Table, а не в узле "Temporary Tables" базы данных tempdb? В смысле, если смотреть через MS SQL Server Management Studio.

Т.е. с точки зрения MS SQL - это именно временная таблица, живущая только в текущем соединении, или постоянная таблица просто созданная в базе tempdb?
В tempdb все таблицы временные)
Поскольку, при перестарте сиквела он целиком и полностью пересоздается

Таблица создается в узле Table - это не "перевод", а пример реальной таблицы
__________________
Axapta v.3.0 sp5 kr2
Теги
ax2009, thread, временная таблица

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Временные таблицы и их временные файлы AraraT® DAX: Прочие вопросы 6 12.04.2010 00:39
Временные таблицы в отчете Прокопьева DAX: Программирование 25 02.10.2006 14:54
Не страшно ли временные таблицы временно сделать постоянными? Gustav DAX: Программирование 11 09.02.2006 11:04
Временные таблицы в отчетах konfet DAX: Программирование 5 19.01.2005 11:32
Временные таблицы vasiliy DAX: Программирование 6 09.11.2004 11:04
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:24.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.