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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.04.2012, 12:58   #1  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Временная таблица, из контейнера в источник данных.
Необходимо передать временную таблицу и ряд других параметров одним контейнером, потом достать временную таблицу из контейнера и поместить в качестве данных для источника данных.
Ахарта отказывается понимать такой мухлеж, показывает пустой грид.
Точно тот же код, но данные не помещавшиеся в контейнер отображаются нормально.
Старый 26.04.2012, 13:23   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Боюсь вас разочаровать, но таблицу нельзя просто так взять и поместить в контейнер.
Передача временной таблицы
Старый 26.04.2012, 13:30   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
А в чем именно проблема? таблица легко пакуется.

X++:
static void Job31(Args _args)
{
    container           conBuf;
    SalesPool           salesPool;
    ;

    salesPool.setTmp();

    //... insert records

    //pack
    while select salesPool
    {
        conBuf += buf2con(salesPool);
    }


    //unpack
    salesPool = null;
    salesPool.setTmp();
    
    while (conlen(conBuf))
    {
        salesPool.clear();

        con2buf(conpeek(conBuf, 1), salesPool);
        
        salesPool.insert();
        
        conBuf = condel(conBuf, 1, 1);
    }
}
За это сообщение автора поблагодарили: Кирен (1).
Старый 26.04.2012, 14:16   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DSPIC Посмотреть сообщение
А в чем именно проблема?
Это ко мне вопрос?
Под словом "просто" я имел в виду "за одну итерацию"

Вообще для меня сама по себе задача преобразования временной таблицы в контейнер вызывает вопросы. Для чего это можно использовать?
Старый 26.04.2012, 14:31   #5  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Здорово, а если таблица заранее неизвестна?

>Вообще для меня сама по себе задача преобразования временной таблицы в контейнер вызывает вопросы. Для чего это можно использовать?
Таблица передается в контейнере с наборов других параметров.

Последний раз редактировалось uchenik; 26.04.2012 в 14:36.
Старый 26.04.2012, 14:48   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от uchenik Посмотреть сообщение
Необходимо передать временную таблицу и ряд других параметров одним контейнером, потом достать временную таблицу из контейнера и поместить в качестве данных для источника данных.
Это желание противоречит идеологии взаимодействия форм в Axapta. Сделать можно, но это "не правильно". Вы все время будет "спотыкаться" на таких формах, поскольку они будут работать не по стандарту. Сильно затрудните себе и тем программистам, которые придут после Вас сопровождение и модификацию.

Можете описать задачу, которую пытаетесь решить подобным образом?

PS: Уже само желание передавать набор параметров в контейнере - крайне подозрительно. Как правило, это исключительная ситуация и применяется в особых случаях. "Стандарт" - это передача ссылки на объект-родитель и прямое чтение нужных реквизитов из методов этого родителя.

Собственно, а как Вы вообще планируете передать этот самый параметр-контейнер в форму? Ведь без вариантов - через метод объекта-родителя. Какие проблемы-то создать несколько методов в объекте-родителе или специальный класс-параметр?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 26.04.2012, 14:48   #7  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
передать таблицу отдельно?
Старый 26.04.2012, 15:02   #8  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Рантаймные лукапы нужны, с несколькими источниками данных, закладками, кнопками...
Старый 26.04.2012, 15:07   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от uchenik Посмотреть сообщение
Рантаймные лукапы нужны, с несколькими источниками данных, закладками, кнопками...
Как это объясняет использование контенера для передачи параметров?
Старый 26.04.2012, 15:24   #10  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Код:
List param;
...
param.addEnd(['newdatasource', tablenum(InventTable), fieldnum(InventTable, ItemName)]);
param.addEnd(['newdatasourcequery', tablenum(InventTable), query.pack(), fieldnum(InventTable, ItemId)]);
param.addEnd(['newdatasourcetmp', tablenum(anytable), anytable, fieldnum(anytable, anyfield)]);
...
Lookup::run(param, this);
...
В простом виде как-то так, плюс еще должна быть закладка:
Изображения
 

Последний раз редактировалось uchenik; 26.04.2012 в 15:34.
Старый 26.04.2012, 15:34   #11  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Похоже надо все же более пристально посмотреть на sysTableLookup...
Старый 26.04.2012, 16:17   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я правильно понимаю, что список контейнеров в данном случае - это способ организации хранения/передачи неоднородной структуры.

При работе с неоднородными структурами нужно помнить, что какой бы неоднородной не была бы структура данных вы же всё равно будете обрабатывать её по заранее определённым правилам. Так зачем же тогда создавать иллюзию универсальности если правила обработки фиксированы и предопределены.

Я бы данную структуру данных преобразовал бы в список классов (List = new List(Types::Class)) поместил бы этот список в класс обёртку, который бы контролировал типы хранящихся в списке значений. Для представления элементов списка сделал бы иерархию классов: Базовый класс представляет общий интерфейс для формирования вкладки, а его наследники реализуют каждый конкретный способ организации вкладки. Для удобства использования можно добавить статические методы, создающие экземпляры необходимых классов. После всего этого привидённый вами код мог бы выглядеть например так

X++:
Lookup = new Lookup();
Lookup.addTab(Lookup::newdatasource(tablenum(InventTable), fieldnum(InventTable, ItemName));
Lookup.addTab(Lookup::newdatasourcequery(tablenum(InventTable), query.pack(), fieldnum(InventTable, ItemId));
Lookup.addTab(Lookup::newdatasourcetmp(tablenum(anytable), anytable, fieldnum(anytable, anyfield));
Lookup.parmCaller(this);
Lookup.run();
Конечнор всё это требует глобального перестроения существующей архитектуры. Если оставлять существующую архитктуру решения, то можно по крайней мере заменить контейнер на чтонибудь более гибкое. Например Struct
X++:
List param = new List(Types::Class);
Struct Struct;

Struct = new Struct();
Struct.add("type", "newdatasource");
Struct.add("tablenum", tablenum(InventTable));
Struct.add("fieldnum", fieldnum(InventTable, ItemName));
List.addEnd(Struct);

Struct = new Struct();
Struct.add("type", "newdatasourcequery");
Struct.add("tablenum", tablenum(InventTable));
Struct.add("query", query);
Struct.add("fieldnum", fieldnum(InventTable, ItemId));
List.addEnd(Struct);

Struct = new Struct();
Struct.add("type", "newdatasourcetmp");
Struct.add("tablenum", tablenum(anytable));
Struct.add("cursor", anytable);
Struct.add("fieldnum", fieldnum(anytable, anyfield));
List.addEnd(Struct);

Lookup::run(param, this);
P.S.: О способах структурирования данных интересная ветка есть Как правильно хранить статичный набор начальных данных в классах?
Старый 26.04.2012, 18:04   #13  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Структуры конечно прикольно, вот только с таблицей они не помогли.
Старый 26.04.2012, 18:12   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от uchenik Посмотреть сообщение
Структуры конечно прикольно, вот только с таблицей они не помогли.

Проблемы с передачей таблицы - из за использования контейнеров. Избавитесь от контейнера - избавитесь от проблемы
Старый 26.04.2012, 18:35   #15  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Да нет, копипаст должен быть осознанным

Код:
conBuf = condel(conBuf, 1, 1);
В этой строке надо удалять не один элемент, а по количеству полей в таблице + 1 (id таблицы)

Жаль на структуры успел переделать, громоздко очень к заполнению получается. но удобно в плане обработки, согласен.
Старый 27.04.2012, 08:07   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от uchenik Посмотреть сообщение
Жаль на структуры успел переделать, громоздко очень к заполнению получается. но удобно в плане обработки, согласен.
То есть два цикла для упаковки/распаковки временной таблицы - это не громоздко?

На самом деле удобство кодирования оно конечно важно, но лично для меня в отказе от контейнера главным преимуществом видится увеличение производительности. Вы же поймите, что используя контейнер для того чтобы просто передать данные в класс вы осуществляете лишнее копирование этих данных причём не один раз. Дважды когда упаковываете/распаковываете контейнер. Использование функций buf2con и con2buf, то это ещё четыре дополнительных копирования. Плюс сама передача контейнера (а контейнеры всегда передаются по значению, а не по ссылке) это ещё одно копирование. Итого минимум семь раз вы переливаете данные временной таблицы из пустого в порожнее только ради того чтобы соответствовать "контейнерному" интерфейсу

Последний раз редактировалось S.Kuskov; 27.04.2012 в 08:11.
Старый 02.05.2012, 01:05   #17  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от uchenik Посмотреть сообщение
Здорово, а если таблица заранее неизвестна?
Это как ???
Цитата:
Сообщение от uchenik Посмотреть сообщение
Таблица передается в контейнере с наборов других параметров.
Чем больше контейнер, тем больше недоразумений при последующих модификациях, с ним связанных. Подумайте об этом
__________________
Best Regards,
Roman
Старый 02.05.2012, 07:56   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
По правде сказать, я лично когда увидел тему, в первую очередь подумал о передаче на клиента времянки, заполненной на сервере
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
"Стандарт" - это передача ссылки на объект-родитель и прямое чтение нужных реквизитов из методов этого родителя.
В контексте клиент-серверного взаимодействия это может породить т.н. chatiness, от которого старательно избавлялись в 2009-й.
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
На самом деле удобство кодирования оно конечно важно, но лично для меня в отказе от контейнера главным преимуществом видится увеличение производительности. Вы же поймите, что используя контейнер для того чтобы просто передать данные в класс вы осуществляете лишнее копирование этих данных причём не один раз.
Это - безусловный плюс, а еще можно вспомнить про проверку типизации на этапе компиляции (и трудновылавливаемые ошибки, связанные с ее отсутствием), перекрестные ссылки и проч...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Таблица, расширенный тип данных, базовый перечислимый тип или класс, вызванные test_Sdelka, уже существуют. Импортирование Table прервано. Poleax DAX: Программирование 4 17.05.2011 17:57
Временная таблица Antoncheg DAX: Программирование 21 15.08.2008 18:25
Чтение данных за пределами файла, временная таблица zemlyn DAX: Программирование 0 05.12.2005 18:32
Форма - источник данных - таблица nikbik DAX: Программирование 2 26.09.2005 10:51
select sum(amount) from временная таблица ATimTim DAX: Программирование 6 11.06.2004 14:16

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

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

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