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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.01.2008, 20:58   #19  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Зацепило. Поигрался на тему. Сваял джоб-имитатор ситуации, использовав три временных буфера от таблицы InventTable. Получил набор хороших id-шников, которые можно засунуть, например, в map и далее уже без анализа использовать в цикле. Одним словом - выкладываю, а там, может, на что-то натолкнет еще...

P.S. 09:50 16.01.08. Добавил еще один временный буфер и сделал имитацию обновления исходной таблицы. Джоб обновил.
X++:
static void Test_6_star_7(Args _args)
{
    InventTable table1_t;       // исходная таблица
    InventTable tmpTable1_m;    // маски
    InventTable tmpTable2_g;    // хорошие id
    InventTable tmpTable3_u;    // обновления для хороших id
    // InventTable inventTable;
    ;

    // ниже везде id храним в ItemId, Amount в Height 
    //(просто так выбрали подходящие поля из InventTable)

    // имитация table1 (исходная таблица)
    table1_t.setTmp();
    ttsbegin;
    table1_t.ItemId = '7489'; table1_t.Height = 10; table1_t.doInsert();
    table1_t.ItemId = '7569'; table1_t.Height = 11; table1_t.doInsert();
    table1_t.ItemId = '6758'; table1_t.Height = 12; table1_t.doInsert();
    table1_t.ItemId = '6547'; table1_t.Height = 13; table1_t.doInsert();
    ttscommit;
/*
    // а можно прочитать из реальной постоянной таблицы
    // например, из inventTable
    ttsbegin;
    while select inventTable
    {
        table1_t.data(inventTable);
        table1_t.doInsert();
    }
    ttscommit;
*/
    info('--- 1. ДО ОБНОВЛЕНИЯ:');
    while select table1_t
        info( strFmt('id: %1, Amount: %2', table1_t.ItemId, table1_t.Height) );

    // имитация tmpTable1 (маски)
    tmpTable1_m.setTmp();
    ttsbegin;
    tmpTable1_m.ItemId = '*7'; tmpTable1_m.Height = 2; tmpTable1_m.doInsert();
    tmpTable1_m.ItemId = '6*'; tmpTable1_m.Height = 3; tmpTable1_m.doInsert();
    ttscommit;

    // хорошие id - во временной служебной таблице
    tmpTable2_g.setTmp();
    ttsbegin;

    while select ItemId, count(RecId)
        from table1_t group by ItemId
        join tmpTable1_m
            where table1_t.ItemId like tmpTable1_m.ItemId
    {
        if (table1_t.RecId==1)
        {
            tmpTable2_g.ItemId = table1_t.ItemId;
            tmpTable2_g.doInsert();
        }
    }
    ttscommit;

    // готовим набор обновлений (id и Amount) - во временной служебной таблице
    tmpTable3_u.setTmp();
    ttsbegin;

    while
        select ItemId from tmpTable2_g
          join Height from tmpTable1_m
            where tmpTable2_g.ItemId like tmpTable1_m.ItemId
    {
        tmpTable3_u.ItemId = tmpTable2_g.ItemId;
        tmpTable3_u.Height = tmpTable1_m.Height;
        tmpTable3_u.doInsert();
    }
    ttscommit;

    info('--- 2. ОБНОВЛЕНИЯ:');
    while select tmpTable3_u
        info( strFmt('id: %1, addAmount: %2', tmpTable3_u.ItemId, tmpTable3_u.Height) );

    // обновляем исходную таблицу
    ttsbegin;

    while 
        select forupdate table1_t join tmpTable3_u
            where table1_t.ItemId == tmpTable3_u.ItemId
    {
        table1_t.Height += tmpTable3_u.Height;
        table1_t.doUpdate();
    }
    ttscommit;

    info('--- 3. ПОСЛЕ ОБНОВЛЕНИЯ:');
    while select table1_t
        info( strFmt('id: %1, Amount: %2', table1_t.ItemId, table1_t.Height) );
}
В окне infolog:
Код:
--- 1. ДО ОБНОВЛЕНИЯ:
id: 6547, Amount: 13.00
id: 6758, Amount: 12.00
id: 7489, Amount: 10.00
id: 7569, Amount: 11.00
--- 2. ОБНОВЛЕНИЯ:
id: 6758, addAmount: 3.00
--- 3. ПОСЛЕ ОБНОВЛЕНИЯ:
id: 6547, Amount: 13.00
id: 6758, Amount: 15.00
id: 7489, Amount: 10.00
id: 7569, Amount: 11.00
Теги
join, like, фильтр, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Fred Shen: 'Not Like' in Dynamics AX Blog bot DAX Blogs 0 28.10.2006 16:40
Использование "like" при работе с классом "QueryBuildRange" poul DAX: Программирование 18 11.08.2006 12:20
как правильно использовать not like polygris DAX: Программирование 1 06.05.2006 16:59
Как правильно сделать проверку условия? Hidden DAX: Программирование 2 11.01.2006 13:05
Возможность использования Like в QueryBuildRange Koriolis DAX: Программирование 5 14.02.2005 17:43

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

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

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