26.04.2012, 12:58 | #1 |
Участник
|
Временная таблица, из контейнера в источник данных.
Необходимо передать временную таблицу и ряд других параметров одним контейнером, потом достать временную таблицу из контейнера и поместить в качестве данных для источника данных.
Ахарта отказывается понимать такой мухлеж, показывает пустой грид. Точно тот же код, но данные не помещавшиеся в контейнер отображаются нормально. |
|
26.04.2012, 13:23 | #2 |
Участник
|
Боюсь вас разочаровать, но таблицу нельзя просто так взять и поместить в контейнер.
Передача временной таблицы |
|
26.04.2012, 13:30 | #3 |
Боец
|
А в чем именно проблема? таблица легко пакуется.
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 |
Участник
|
|
|
26.04.2012, 14:31 | #5 |
Участник
|
Здорово, а если таблица заранее неизвестна?
>Вообще для меня сама по себе задача преобразования временной таблицы в контейнер вызывает вопросы. Для чего это можно использовать? Таблица передается в контейнере с наборов других параметров. Последний раз редактировалось uchenik; 26.04.2012 в 14:36. |
|
26.04.2012, 14:48 | #6 |
Участник
|
Цитата:
Можете описать задачу, которую пытаетесь решить подобным образом? PS: Уже само желание передавать набор параметров в контейнере - крайне подозрительно. Как правило, это исключительная ситуация и применяется в особых случаях. "Стандарт" - это передача ссылки на объект-родитель и прямое чтение нужных реквизитов из методов этого родителя. Собственно, а как Вы вообще планируете передать этот самый параметр-контейнер в форму? Ведь без вариантов - через метод объекта-родителя. Какие проблемы-то создать несколько методов в объекте-родителе или специальный класс-параметр?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
26.04.2012, 14:48 | #7 |
Программатор
|
передать таблицу отдельно?
|
|
26.04.2012, 15:02 | #8 |
Участник
|
Рантаймные лукапы нужны, с несколькими источниками данных, закладками, кнопками...
|
|
26.04.2012, 15:07 | #9 |
Участник
|
|
|
26.04.2012, 15:24 | #10 |
Участник
|
Код: 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 |
Участник
|
Похоже надо все же более пристально посмотреть на sysTableLookup...
|
|
26.04.2012, 16:17 | #12 |
Участник
|
Я правильно понимаю, что список контейнеров в данном случае - это способ организации хранения/передачи неоднородной структуры.
При работе с неоднородными структурами нужно помнить, что какой бы неоднородной не была бы структура данных вы же всё равно будете обрабатывать её по заранее определённым правилам. Так зачем же тогда создавать иллюзию универсальности если правила обработки фиксированы и предопределены. Я бы данную структуру данных преобразовал бы в список классов (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(); 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); |
|
26.04.2012, 18:04 | #13 |
Участник
|
Структуры конечно прикольно, вот только с таблицей они не помогли.
|
|
26.04.2012, 18:12 | #14 |
Участник
|
|
|
26.04.2012, 18:35 | #15 |
Участник
|
Да нет, копипаст должен быть осознанным
Код: conBuf = condel(conBuf, 1, 1); Жаль на структуры успел переделать, громоздко очень к заполнению получается. но удобно в плане обработки, согласен. |
|
27.04.2012, 08:07 | #16 |
Участник
|
Цитата:
На самом деле удобство кодирования оно конечно важно, но лично для меня в отказе от контейнера главным преимуществом видится увеличение производительности. Вы же поймите, что используя контейнер для того чтобы просто передать данные в класс вы осуществляете лишнее копирование этих данных причём не один раз. Дважды когда упаковываете/распаковываете контейнер. Использование функций buf2con и con2buf, то это ещё четыре дополнительных копирования. Плюс сама передача контейнера (а контейнеры всегда передаются по значению, а не по ссылке) это ещё одно копирование. Итого минимум семь раз вы переливаете данные временной таблицы из пустого в порожнее только ради того чтобы соответствовать "контейнерному" интерфейсу Последний раз редактировалось S.Kuskov; 27.04.2012 в 08:11. |
|
02.05.2012, 01:05 | #17 |
Сенбернар
|
Это как ???
Чем больше контейнер, тем больше недоразумений при последующих модификациях, с ним связанных. Подумайте об этом
__________________
Best Regards, Roman |
|
02.05.2012, 07:56 | #18 |
Участник
|
По правде сказать, я лично когда увидел тему, в первую очередь подумал о передаче на клиента времянки, заполненной на сервере
Цитата:
Цитата:
Сообщение от S.Kuskov
На самом деле удобство кодирования оно конечно важно, но лично для меня в отказе от контейнера главным преимуществом видится увеличение производительности. Вы же поймите, что используя контейнер для того чтобы просто передать данные в класс вы осуществляете лишнее копирование этих данных причём не один раз.
|
|
|
|