|
26.06.2008, 15:16 | #1 |
Участник
|
Временная таблица
Всем доброго времени суток. Огромная просьба разъяснить ситуацию. Есть форма, источником грида которой служит временная таблица. Заполняет ее метод, находящийся во временной таблице типа:
static server TableTmp FillTable(входящие параметры) { Блок описания переменных ; delete TableTmp; while select... { select... TableTmp.Field1 = ... TableTmp.insert } return TableTmp } При нажатии на кнопку обновить (она, собственно и вызывает метод на таблице) форма обновляется, но данных в ней нет.Заранее благодарен. ЗЫ Запрос построен правильно, ибо на форме в методе работает ок! |
|
26.06.2008, 15:25 | #2 |
Участник
|
Как на форме принимается таблица из метода?
|
|
26.06.2008, 15:27 | #3 |
Участник
|
void clicked()
{ super(); TableTmp::FillTableNew(SnQueryTableTmp, DateBegin.dateValue(), DateEnd.dateValue(), FilialField.valueStr(), Line.valueStr()); SnQueryTableTmp_DS.executeQuery(); } |
|
26.06.2008, 15:25 | #4 |
Участник
|
Покажите код, которым вы источник данных, сформированный в этом методе, делаете общим с тем, который используется на форме?
Должно быть что-то типа X++: TableTmp.setTmpData(TableTmp::FillTable( )); |
|
26.06.2008, 15:27 | #5 |
Участник
|
Код вы мощно выделили чуть глаза не сломал.
Есть кнопочка X++, когда сообщения пишите. Читается лучше. 1) Не понятно зачем вы написали delete TableTmp 2) В init формы написали датасорс.setTmpData(тмп_таблица)? |
|
26.06.2008, 15:30 | #6 |
Участник
|
Еще ньюанс - у вас эта временная таблица, как я вижу, заполняется на сервере
Плохо. Временный таблицы плохо (НЕ) работают с клиент-серверным взаимодействием. Попробуйте, для начала, изменить модификатор на client в статическом методе, чтобы подтвердить/отбросить этот вариант/гипотезу |
|
26.06.2008, 15:32 | #7 |
Участник
|
Цитата:
Сообщение от kashperuk
Еще ньюанс - у вас эта временная таблица, как я вижу, заполняется на сервере
Плохо. Временный таблицы плохо (НЕ) работают с клиент-серверным взаимодействием. Попробуйте, для начала, изменить модификатор на client в статическом методе, чтобы подтвердить/отбросить этот вариант/гипотезу |
|
26.06.2008, 15:35 | #8 |
Участник
|
Нашел ошибку в запросе, говорит, что joined курсор был использован в другом операторе select. Могу я в объявлении переменных (временная таблица) использовать два разных именования для одной таблицы?
|
|
26.06.2008, 15:39 | #9 |
Участник
|
Всем огромное спасибо, вопрос снят (дело было к вечеру....))))
|
|
26.06.2008, 15:56 | #10 |
Участник
|
Так в чем состояла проблема, и в чем заключалось решение?
|
|
26.06.2008, 21:11 | #11 |
:o)
|
Всем привет!
Заполняем временную таблицу данными из castTrans.. Для поледующего вызова формы CastTrans, по нажатию на строчку отчёта, чтобы развернуть сумму отчёта и посмотреть проводки... Без правильного recId не весь функционал формы работает... подскажите как быть? Как обновить во временной таблице RecId? Спасибо!
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов. |
|
28.06.2008, 20:26 | #12 |
Дмитрий Ерин
|
jeky,
а почему решили использовать временную таблицу для этих целей? Может быть, стоит попробовать отдать форме сформированный запрос на реальную таблицу? Посмотрите, как похожий механизм реализован в оборотно-сальдовой ведомости: Расчеты с клиентами / Запросы / Оборотно-сальдовая ведомость. После выполнения запроса нажать правой кнопкой на интересующей строке и выбрать "Исходный документ". Реализацию механизма см. в методе: \Classes\RLedgerSheetEngine_TurnoverCustVend\originalDocuments |
|
26.06.2008, 21:30 | #13 |
Боец
|
Нужно при заполнении временной таблицы сразу же апдейтить recId, но перед апдейтом вызвать метод tmpTable.overwriteSystemfields(true). Пример;
X++: static void Job1(Args _args) { TmpAotImport tmpAotImport; ; tmpAotImport.TreeNodeName = 'XXX' tmpAotImport.insert(); tmpAotImport.selectForUpdate(true); tmpAotImport.overwriteSystemfields(true); tmpAotImport.RecId = 1111; tmpAotImport.update(); info(int2str(tmpAotImport.RecId)); } |
|
27.06.2008, 15:28 | #14 |
----------------
|
to DSPIC
не верь глазам своим X++: static void Job1(Args _args) { TmpAotImport tmpAotImport; ; tmpAotImport.TreeNodeName = 'XXX'; tmpAotImport.insert(); tmpAotImport.selectForUpdate(true); tmpAotImport.overwriteSystemfields(true); tmpAotImport.RecId = 1111; tmpAotImport.update(); select tmpAotImport; // проверка info(int2str(tmpAotImport.RecId)); } |
|
|
За это сообщение автора поблагодарили: DSPIC (1), jeky (1). |
27.06.2008, 16:04 | #15 |
Боец
|
Уппс.. select я не дописал. При написании этого кода я сомневался что RecId можно заменить, так оно и есть. Спасибо.
2 jeky: тогда придется искать workaround. |
|
28.06.2008, 22:05 | #16 |
----------------
|
отвечу за jeky
надо выводить проводки с просроченными платежами с учетом периода, что запихнуть в квери не получится. есть мысли откуда берется RecId для временных таблиц? |
|
29.06.2008, 07:10 | #17 |
Участник
|
Вась, подскажи. А что даст, если получиться во временной таблице получить нужный recId, через что и как ты потом будешь его использовать?
Я так понимаю вы хотите реализовать механизм driilldown. А recId хотите использовать, как форточку для недостающих данных. Или не так. Как я делал такой механизм: 1) Снимал слепок(данные) с запроса в первую временную таблицу. 2) Группировал требуемые данные из первой временной таблицы, получая вторую. 3) Суммировал итоговые поля во второй, получал третью(Если нужны подитоги). 4) Результаты 2 и 3 выкидывал на элемент ActiveX, похожий на Excel. 5) Когда два раза щёлкаем на строке отчёта открывается форма со стороками из которых была получена данная строка. Как это реализуется в системе: берём запрос из первого пункта, считываем строку на которой сделали drilldown, получаем значения полей по которым у нас была группировка, достраиваем range-ми по ним наш запрос. Берём форму которая будет открываться по drillDown, получаем её первый датасорс formDataSource = formRun.dataSource(); и заменяем её query, нашим formDataSource.query(наш query). Если в 1 пункте данные считываются из одного запроса всё ок, driilldown реализуется нормально, если есть дополнительные find-ы, ифы, начинаются танцы с бубном, которые в результате могут ни к чему не превести. Что вполне логично, чтобы что-то раскрутить, нужно тоже самое перед этим скрутить. Последний раз редактировалось miklenew; 29.06.2008 в 08:08. |
|
29.06.2008, 18:40 | #18 |
----------------
|
Все верно
Цитата:
если есть дополнительные find-ы, ифы, начинаются танцы с бубном, которые в результате могут ни к чему не привести.
formDatasource.cursor().setTmp; formDatasource.cursor().setTmpData(tmpCustTrans); Получается все красиво... форма привычная, данные понятны, сортировки, фильтры, переходы к основным таблицам, просмотр исходного документа, докумнта ГК и т.д. и т.п... НО нет сопоставлений, истории, открытых проводок, так как все это делается через... RecId, который не совпадает с реальным. Решается это добавлением join со временной таблицей в исходном formDatasource. Но остался нерешенным вопрос "откуда берется RecId для временной таблицы и можно ли этим управлять" |
|
|
За это сообщение автора поблагодарили: miklenew (2), jeky (1). |
29.06.2008, 21:14 | #19 |
Участник
|
Цитата:
Создал дублированием таблицу CustTrans. Поставил Tempory да. Через dictField небось создал копию с оригинала CustTrans. Блин, почему в range ограничение на количество значений. Можно было бы все эти recId засунуть в query и не парится. |
|
30.06.2008, 12:27 | #20 |
Участник
|
Цитата:
Цитата:
Сообщение от AndyD
http://erpkb.com/Axapta/RecId
Нумерация для каждой временной таблицы (в том числе и тех, которые сделаны временными через вызов setTmp()) начинается с константы и возрастает на некоторую дельту (0x30) в рамках времени жизни табличной переменной. |
|