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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.07.2006, 13:09   #1  
kitty is offline
kitty
Участник
 
364 / 26 (1) +++
Регистрация: 24.05.2005
создать и передать временную таблицу
Есть класс, в одном из методов формируется запрос по одной из существующих таблиц. Нужно, результаты этого запроса пометить во временную таблицу с такой же структурой.что и сущ таблица + еще 2 поля. Как это сделать не забивая заново все поля? setTmp не подходит, тк структура разная немного. SetTmpData
PHP код:
   QueryRun = new QueryRun(MyTablequery);
     
QueryRun .next();
     
MyTable        QueryRun get(tableNum(MyTable ));   
     
MyTmpTable .setTmpData(MyTable); 
тож не работает =(.
Более того, эту получившуюся временную таблицу хотелось бы потом передать в другой класс на обработку, где помимо всего прочего будет производиться вставка доп записей. Достаточно ли будет в новом классе получить через getMyTmpTable текущего класса курсор на врем таблицу, проинициализировать табл переменную с пом SetTmpData и дальше с ней уже производить все манипуляции.
Спасибо
Старый 12.07.2006, 13:55   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А чем плох способ забивания заново всех полей?
Просто создайте метод на этой таблице, что-нить вида:
initFromMyTable(MyTable _rec);

А в нем один раз уж придется прописать заполнение всех полей.

Зато потом сможете использовать и не только здесь.

Да, если передать ссылку на этот объект в другой класс, то можно будет дальше работать с этими данными, добавляя записи, к примеру.
Старый 12.07.2006, 14:03   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
используйте SysDictTable и присваивайте поля по имени
Старый 12.07.2006, 14:48   #4  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,225 / 976 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от kitty
Есть класс, в одном из методов формируется запрос по одной из существующих таблиц. Нужно, результаты этого запроса пометить во временную таблицу с такой же структурой.что и сущ таблица + еще 2 поля.
IMHO лучше весего, было бы использовать INSERT_RECORDSET
__________________
Isn't it nice when things just work?
Старый 12.07.2006, 15:33   #5  
zelen is offline
zelen
Участник
 
64 / 13 (1) ++
Регистрация: 08.11.2004
Адрес: г.Москва
Вот набрасал пример джоба, который заполняет таблицу (можно и темповую, неважно), в таблице есть метод, который пишет данные в неё по полученной записи,
единственно нужно добавить анализ по полям типа modifiedBY,TableId и т.п., а так все работает :

X++:
static void TestJob(Args _args)
{
    TmpTest tmpTest;
    InventTable inventTable;
    ;

    while select * from inventTable
    {
        tmpTest.setTmpData(tmpTest.makeRecord("InventTable","TmpTest"
                                                                       ,inventTable,tmpTest));
        if (tmpTest.RecId != 0)
            tmpTest.insert();
    }
    while select * from tmpTest
    {
        info(tmpTest.ItemId + tmpTest.ItemName);
    }
}
метод на таблице :

X++:
Common makeRecord(str _fromTable, str _toTable, Common _fromCommon, Common _toCommon)
{
    DictTable   dictTable1 = new DictTable(tablename2Id(_toTable));
    DictTable   dictTable2 = new DictTable(tablename2Id(_fromTable));

    int             i;
    int             t2FieldId;
    str             t1FieldId; 
    ;

    for (i = 1;i <= dictTable2.fieldCnt();i++)
    {
        t1FieldId = dictTable2.fieldName(dictTable2.fieldCnt2Id(i));

        if (!dictTable1.fieldName2Id(t1FieldId))
            continue;

        t2FieldId = dictTable2.fieldCnt2Id(i);
        _toCommon. (dictTable1.fieldName2Id(t1FieldId)) = _fromCommon. (t2FieldId);
    }
    if (_toCommon.RecId != 0)
        return _toCommon;//.insert();
    else
        return null;
}
Старый 12.07.2006, 16:54   #6  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Еще бы оформить это как функцию класса global и можно переносить в прокты

PS Вещь реально нужная, поскольку buf2buf работает как раз по id что не всегда удобно
Старый 12.07.2006, 17:19   #7  
zelen is offline
zelen
Участник
 
64 / 13 (1) ++
Регистрация: 08.11.2004
Адрес: г.Москва
вот доработанный код метода, можно ставить в Global :
X++:
container table2table(str _fromTable, str _toTable, Common _fromCommon, Common _toCommon)
{
    DictTable   dictTable1 = new DictTable(tablename2Id(_toTable));
    DictTable   dictTable2 = new DictTable(tablename2Id(_fromTable));

    int         i, ret;
    int         t2FieldId;
    str         t1FieldId;
    ;

    ret = 0;
    for (i = 1;i <= dictTable2.fieldCnt();i++)
    {
        t1FieldId = dictTable2.fieldName(dictTable2.fieldCnt2Id(i));
        t2FieldId = dictTable2.fieldCnt2Id(i);

        if (!dictTable1.fieldName2Id(t1FieldId))
            continue;
        else if (isSysId(t2FieldId))
            continue;

        _toCommon. (dictTable1.fieldName2Id(t1FieldId)) = _fromCommon. (t2FieldId);
        ret++;
    }
    if (ret)
        return [_toCommon,ret];
    else
        return [null,ret];

}
Старый 12.07.2006, 17:26   #8  
zelen is offline
zelen
Участник
 
64 / 13 (1) ++
Регистрация: 08.11.2004
Адрес: г.Москва
Хотя можно возвращать не контейнер, а Common, кому как нравится :-)
Старый 12.07.2006, 17:34   #9  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
а если переделать начало и не передавать параметры "str _fromTable, str _toTable,"?

DictTable dictTable1 = new DictTable(_toCommon.TableId);
DictTable dictTable2 = new DictTable(_fromCommon.TableId);
Старый 12.07.2006, 17:50   #10  
zelen is offline
zelen
Участник
 
64 / 13 (1) ++
Регистрация: 08.11.2004
Адрес: г.Москва
да конечно, так будет даже компактней :-)
Старый 13.07.2006, 14:20   #11  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,225 / 976 (37) +++++++
Регистрация: 03.04.2002
Решил развлечься малость. Вот метод, который копирует не одну строку, а всю таблицу. Может кому сгодится.
P.S. Работает весьма быстро

PHP код:
/** Копирует все данные из таблицы _fromTable в одноименные поля _toTable */
static Common cloneTable(str _fromTablestr _toTable)
{
    
DictTable dictTable1 = new DictTable(tableName2Id(_toTable));
    
DictTable dictTable2 = new DictTable(tableName2Id(_fromTable));

    
int i;
    
int t2FieldId;
    
str t1FieldId;

    
str fields;
    
str copyJob "Common testTmp()\n{\n%1 fromTable;\n%2 toTable;\n;\n INSERT_RECORDSET toTable (%3)  select %3 from fromTable;\n return toTable;\n }"
    
;

    for (
1;<= dictTable2.fieldCnt();i++)
    {
        
t1FieldId dictTable2.fieldName(dictTable2.fieldCnt2Id(i));
        
t2FieldId dictTable2.fieldCnt2Id(i);

        if (
dictTable1.fieldName2Id(t1FieldId) && !isSysId(t2FieldId))
            
fields fields fields ", " +  t1FieldId t1FieldId;
    }

    return 
runbuf(strfmt(copyJob_fromTable_toTablefields));

__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 13.07.2006 в 14:22.
За это сообщение автора поблагодарили: George Nordic (2).
Старый 13.07.2006, 14:40   #12  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Кстати, метод можно сделать более универсальным, передавая необязательный параметр - Map, ключами которой будут названия полей исходной таблицы, а значениями - названия полей целевой таблицы.
Тогда можно будет избавиться от ограничения на идентичность названия полей, их количество и т.д.
Прошу прощения, что пишу только идею, а не код - просто сейчас не много времени. После выходных, если кому-то будет интересно, могу выложить код. Хотя, по моему, исправлений вышенаписанного кода будет не много.
Теги
временная таблица

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передать временную таблицу из формы в класс Eldar9x DAX: Программирование 26 20.06.2008 19:09
Два DataSource на одну временную таблицу mou DAX: Программирование 4 22.03.2008 11:00
Как передать временную таблицу Aslan DAX: Программирование 15 23.05.2006 17:34
Невозможно создать таблицу chel DAX: Программирование 0 21.04.2004 21:02
Как при вызове класса передать в него таблицу? ArturK DAX: Программирование 7 09.04.2004 12:15

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

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

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