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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.10.2008, 10:57   #1  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
? Помещение временной таблицы в Map
Собственно сабж...Требуется хранить в структуре Map временные таблицы. Просто так ее туда не положить, однако обходной путь вроде бы нашелся. Создал класс обертку

X++:
class TmpTable4CollectionStruct
{
    Common      common;
}
void new(Common     _common)
{
    ;
    //common.setTmp();

    common = _common;
}
Common getCommon()
{
    ;

    return common;
}
И собственно Job-ик для проверки.

X++:
static void Test(Args _args)
{
    LedgerTable                 ledgerTable;
    LedgerTable                 tmpLedgerTable;

    LedgerTable                 tmpLedgerTableFromMap;

    Map                         map = new Map(Types::Integer, Types::Class);

    TmpTable4CollectionStruct   struct,
                                struct2;
    int                         i;
    ;
 

    tmpLedgerTable.setTmp();


    while select ledgerTable
        order by AccountNum
    {
        buf2buf(ledgerTable, tmpLedgerTable);
        tmpLedgerTable.insert();

        i++;

        if (i > 10) break;
    }
    info("Tmp");

    while select tmpLedgerTable
        info(strfmt("%1 -> %2", tmpLedgerTable.AccountNum, tmpLedgerTable.AccountName));

    struct = new TmpTable4CollectionStruct(tmpLedgerTable);



    map.insert(1, struct);

   
    struct2 = map.lookup(1);

    // tmpLedgerTableFromMap.setTmp();
    tmpLedgerTableFromMap = struct2.getCommon();

    info("FromMap");

    while select tmpLedgerTableFromMap
        info(strfmt("%1 -> %2", tmpLedgerTableFromMap.AccountNum, tmpLedgerTableFromMap.AccountName));



}
Вроде бы то, что надо(на практике вся задумка еще не эксплуатировалась), однако хотелось бы узнать, можно ли как-то по другому, без класса обертки помещать собранные временные таблицы в Map!?!

p.s. DAX 4
Старый 24.10.2008, 11:14   #2  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
можно через контейнер:
buf2Con(Common common),
con2Buf(container c, Common common)
Старый 24.10.2008, 11:14   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
вот быстренько наваял пример:
X++:
static void test(Args _args)
{
    InventTable     inventTable, inventTableMap;
    Map             map = new Map(Types::Integer, Types::Record);
    MapEnumerator   enumerator;
    ;


    select inventTable
        where inventTable.dm_deleted == NoYes::No;

    map.insert(inventTable.RecId, inventTable);

    enumerator = map.getEnumerator();

    while(enumerator.moveNext())
    {
        inventTableMap = enumerator.currentValue();
    }

    info(inventTableMap.ItemId);
}
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 24.10.2008, 11:18   #4  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от Lemming Посмотреть сообщение
Просто так ее туда не положить
Это, простите, почему?
Старый 24.10.2008, 11:20   #5  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
?
Цитата:
Сообщение от Yprit Посмотреть сообщение
Это, простите, почему?
А как? Можно простенький примерчик!?!
Старый 24.10.2008, 11:23   #6  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от lev Посмотреть сообщение
вот быстренько наваял пример:
X++:
static void test(Args _args)
{
    ...
    Map             map = new Map(Types::Integer, Types::Record);
    ...


}
Record это одна запись, задача поместить в Map собранную, т.е. содержащую набор записей, временную таблицу.
Старый 24.10.2008, 11:24   #7  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Ну, например, как lev написал. Или вот так
X++:
  Map                 map = new Map(extendedTypeId2Type(typeId(RefRecId)),types::Record);
    TmpFrmVirtual       tmp;
    MapEnumerator       me;
    
    ;
    
    tmp.clear();
    tmp.ItemId = "1";
    tmp.Qty    = 1.00;
    tmp.insert();
    
    tmp.clear();
    tmp.ItemId = "2";
    tmp.Qty    = 2.00;
    tmp.insert();

    tmp.clear();
    tmp.ItemId = "3";
    tmp.Qty    = 3.00;
    tmp.insert();

    while select tmp
        map.insert(tmp.RecId,tmp);
        
    me = map.getEnumerator();
    
    while (me.moveNext())
    {
        tmp = me.currentValue();
        
        info(strFmt("%1 %2",tmp.ItemId,tmp.Qty));
    }
Старый 24.10.2008, 11:27   #8  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от Lemming Посмотреть сообщение
Record это одна запись, задача поместить в Map собранную, т.е. содержащую набор записей, временную таблицу.
Ох... Вот Вы что хотите, оказывается... А зачем? Ну сделайте мэп из мэпов или контейнеров. В мэпы положите нужный вам набор записей.
Старый 24.10.2008, 11:30   #9  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от Yprit Посмотреть сообщение
Ну, например, как lev написал. Или вот так
X++:
  Map                 map = new Map(extendedTypeId2Type(typeId(RefRecId)),types::Record);
    TmpFrmVirtual       tmp;
    MapEnumerator       me;
    
    ;
    
    tmp.clear();
    tmp.ItemId = "1";
    tmp.Qty    = 1.00;
    tmp.insert();
    
    tmp.clear();
    tmp.ItemId = "2";
    tmp.Qty    = 2.00;
    tmp.insert();

    tmp.clear();
    tmp.ItemId = "3";
    tmp.Qty    = 3.00;
    tmp.insert();

    while select tmp
        map.insert(tmp.RecId,tmp);
        
    me = map.getEnumerator();
    
    while (me.moveNext())
    {
        tmp = me.currentValue();
        
        info(strFmt("%1 %2",tmp.ItemId,tmp.Qty));
    }
То что можно собрать коллекцию Record-ов я знаю, спасибо. Речь идет о том, что например нам необязательно распаковывать класс, что бы положить его в Map, вопрос был как раз в том, можно ли такой фокус провернуть со временной таблой, без лишних оберток. Более того, временные таблицы передаются по ссылке, а не по значению И хотелось бы как то это свойство сохранить, а вот что будет со ссылкой на орнигинал в случае набора записей(Record-ов) не совсем ясно!?!
Старый 24.10.2008, 16:40   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Простите за оффтоп, но это жуткое извращение - временную таблицу в Map, так еще и всю!
Старый 24.10.2008, 16:51   #11  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Простите за оффтоп, но это жуткое извращение - временную таблицу в Map, так еще и всю!
Отнюдь. Как передать временную таблицу с клиента на сервер или с сервера на клиент? Как сохранить параметры чего-либо в SysLastValue, если параметры организованы во временной таблице?
Старый 24.10.2008, 17:26   #12  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
Сообщение от EVGL Посмотреть сообщение
Как сохранить параметры чего-либо в SysLastValue, если параметры организованы во временной таблице?
А разве просто временная таблица не сохраняется безо всяких Map. Пример - отчет InventDimPhys сохраняет временную таблицу InventDimParm

X++:
final class ReportRun extends ObjectRun
{
    InventDimParm               inventDimParm;

    #define.CurrentVersion(6)
    #localmacro.CurrentList
        ...
        totalAccount,
        inventDimParm
    #endmacro
}
public container pack()
{
    return [#CurrentVersion, #CurrentList] ;
}
Старый 24.10.2008, 17:32   #13  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
Сообщение от EVGL Посмотреть сообщение
Как передать временную таблицу с клиента на сервер или с сервера на клиент?
Тоже было дело парился с такой задачей. В итоге посмотрел, как это сделано в одном из случаев в стандарте (по-моему при создании кредит ноты или чего-то подобного в заказах) - у наследника runBase перекрыт метод canSwapBetweenCS:

X++:
protected boolean  canSwapBetweenCS()
{
    return false;
}
И все - нет проблемы передачи временной таблицы (из нескольких записей) с сервера на клиент и обратно. (Это как вариант - ни в коем случае не руководство к действию)
Старый 24.10.2008, 18:39   #14  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от petr Посмотреть сообщение
А разве просто временная таблица не сохраняется безо всяких Map. Пример - отчет InventDimPhys сохраняет временную таблицу InventDimParm
Да, но это только если там одна запись.
Старый 24.10.2008, 19:59   #15  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Простите за оффтоп, но это жуткое извращение - временную таблицу в Map, так еще и всю!
Тем не менее видел такой код при упаковке и распаковке наследников RunBaseBatch в трешке.
Что-то связанное с Supp
Старый 24.10.2008, 20:00   #16  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Lemming Посмотреть сообщение
X++:
        buf2buf(ledgerTable, tmpLedgerTable);
        tmpLedgerTable.insert();
Такой код я бы лучше заменил вызовом
X++:
        tmpLedgerTable.data(ledgerTable);
        tmpLedgerTable.insert();
Результат будет тот же, но сэкономит процессорное время.
За это сообщение автора поблагодарили: Lemming (1).
Старый 25.10.2008, 12:41   #17  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Результат будет тот же, но сэкономит процессорное время.
Честно говоря код был написан за 3 минуты для проверки subj-а, но все равно спасибо, буду помнить про data().
Старый 29.10.2008, 21:40   #18  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3545 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Такой код я бы лучше заменил вызовом
X++:
        tmpLedgerTable.data(ledgerTable);
        tmpLedgerTable.insert();
Результат будет тот же, но сэкономит процессорное время.
В отличии от метода buf2buf - метод data имеет две особенности, о которых нужно помнить при его использовании:
1. При необходимости программно скопировать запись в постоянной таблице - данный метод просто спозиционирует переменную таблицы на ту же запись - т.е следующая конструкция только "откопирует" курсор, при этом RecId не будет равен нулю (что логично, но не всегда удобно):
X++:
    LedgerTable fromLedgerTable, toLedgerTable;
    ;
    select fromLedgerTable;
    toLedgerTable.data(fromLedgerTable);
2. Метод data (в отличии от buf2buf) копирует все системные поля. Но если поля modified* и RecId все равно перезапишутся при вызове метода insert(), то остальные поля к примеру create* и dataAreaId не перезапишутся. Таким образом следующий код приведет к созданию записи не в той компании:
X++:
    LedgerTable fromLedgerTable, toLedgerTable;
    ;
    changecompany ('dax')
    {
        select fromLedgerTable;
        changecompany ('nav')
        {
            toLedgerTable.data(fromLedgerTable);
            toLedgerTable.insert(); // Будет создана запись в компании dax
        }
    }
не говоря уже о том, что данные в полях create* будут некорректными. Тот же эффект будет наблюдаться и при использовании временных таблиц.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 29.10.2008 в 21:53.
За это сообщение автора поблагодарили: ZVV (1), Logger (5), mayk (1), AP-1055D (1).
Старый 20.04.2009, 00:01   #19  
Turganov Artem is offline
Turganov Artem
Участник
 
2 / 10 (1) +
Регистрация: 28.07.2003
Пришлось реализовать задачу с временной таблицей в Map.
В контейнер и Map можно сохранить только Record. Копия строки в таблице, но не само строку (обновить ее нельзя, если извлечь из Маp, сначала ее надо найти в таблице).
Без обертки не как, кроме класса можно использовать класс формы.
Пакуем очевидно класс - обертку.

Лично пришлось решать как обычно не стандартную задачу. На каждом этапе сложно алгоритма нужно было сохранять промежуточную таблицу. Создаю класс с временной таблице - пишу на каждом этапе. На выходе меню со списком этапов. Кнопка по текущему курсору открывает форму с нужны экземпляром сохраненной темповой таблицы со контентом из Map.
Старый 19.10.2017, 11:58   #20  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
X++:
static void msk_testStruct(Args _args)
{
    struct val;
    Map map = new map(Types::Integer, Types::Class);
    MapEnumerator enum;
    int i;

    struct setCar(int modelYear, str Carbrand)
    {
        struct myCar;
        ;
        
        myCar = new struct ("int ModelYear; str Carbrand");
        mycar.value ("ModelYear", modelYear);
        mycar.value ("Carbrand", carbrand);
        return mycar;
    }
    ;

    map.insert(1, setCar(2000, "BMW"));
    map.insert(2, setCar(2005, "Mersedes"));

    enum = map.getEnumerator();
    while (enum.moveNext())
    {
        i = enum.currentKey();
        val = enum.currentValue();
        info(strFmt("N = %1, Year = %2, Brand = %3", i, val.value("ModelYear"), val.value("Carbrand")));
    }
}
__________________
Бесты и регарды!
Теги
map, временная таблица, клиент-сервер

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Динамическое связывание временной таблицы Paul_ST DAX: Программирование 8 25.09.2007 16:17
данные из временной таблицы в отчете алька DAX: Программирование 4 19.04.2007 17:47
Проблема с очисткой временной таблицы v.fedorov DAX: Программирование 13 26.10.2006 23:02
Формирование отчета на основе временной таблицы neys DAX: Программирование 8 26.05.2006 15:23
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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