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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.06.2008, 15:16   #1  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
:( Временная таблица
Всем доброго времени суток. Огромная просьба разъяснить ситуацию. Есть форма, источником грида которой служит временная таблица. Заполняет ее метод, находящийся во временной таблице типа:
static server TableTmp FillTable(входящие параметры)
{
Блок описания переменных
;
delete TableTmp;
while select...

{
select...

TableTmp.Field1 = ...

TableTmp.insert
}
return TableTmp

}

При нажатии на кнопку обновить (она, собственно и вызывает метод на таблице) форма обновляется, но данных в ней нет.Заранее благодарен.

ЗЫ Запрос построен правильно, ибо на форме в методе работает ок!
Старый 26.06.2008, 15:25   #2  
mau is offline
mau
Участник
 
34 / 24 (1) +++
Регистрация: 12.03.2003
Адрес: Москва
Как на форме принимается таблица из метода?
Старый 26.06.2008, 15:25   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Покажите код, которым вы источник данных, сформированный в этом методе, делаете общим с тем, который используется на форме?

Должно быть что-то типа

X++:
TableTmp.setTmpData(TableTmp::FillTable( ));
Возможно в методе на форме вы просто записи вставляли непосредственно в источник данных формы - поэтому работало.
Старый 26.06.2008, 15:27   #4  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
void clicked()
{
super();


TableTmp::FillTableNew(SnQueryTableTmp, DateBegin.dateValue(), DateEnd.dateValue(), FilialField.valueStr(), Line.valueStr());
SnQueryTableTmp_DS.executeQuery();
}
Старый 26.06.2008, 15:27   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Код вы мощно выделили чуть глаза не сломал.
Есть кнопочка X++, когда сообщения пишите. Читается лучше.
1) Не понятно зачем вы написали delete TableTmp
2) В init формы написали датасорс.setTmpData(тмп_таблица)?
Старый 26.06.2008, 15:28   #6  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
ДаЮ но аналогичный метод на таблице работает на 100%, в нем while select другой только
Старый 26.06.2008, 15:30   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Еще ньюанс - у вас эта временная таблица, как я вижу, заполняется на сервере
Плохо. Временный таблицы плохо (НЕ) работают с клиент-серверным взаимодействием.
Попробуйте, для начала, изменить модификатор на client в статическом методе, чтобы подтвердить/отбросить этот вариант/гипотезу
Старый 26.06.2008, 15:32   #8  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Еще ньюанс - у вас эта временная таблица, как я вижу, заполняется на сервере
Плохо. Временный таблицы плохо (НЕ) работают с клиент-серверным взаимодействием.
Попробуйте, для начала, изменить модификатор на client в статическом методе, чтобы подтвердить/отбросить этот вариант/гипотезу
сейчас попробую
Старый 26.06.2008, 15:35   #9  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
Нашел ошибку в запросе, говорит, что joined курсор был использован в другом операторе select. Могу я в объявлении переменных (временная таблица) использовать два разных именования для одной таблицы?
Старый 26.06.2008, 15:39   #10  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
Всем огромное спасибо, вопрос снят (дело было к вечеру....))))
Старый 26.06.2008, 15:56   #11  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Так в чем состояла проблема, и в чем заключалось решение?
Старый 26.06.2008, 21:11   #12  
jeky is offline
jeky
:o)
Аватар для jeky
 
130 / 64 (3) ++++
Регистрация: 22.05.2008
Всем привет!

Заполняем временную таблицу данными из castTrans..
Для поледующего вызова формы CastTrans, по нажатию на строчку отчёта, чтобы развернуть сумму отчёта и посмотреть проводки...
Без правильного recId не весь функционал формы работает...
подскажите как быть? Как обновить во временной таблице RecId?

Спасибо!
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 26.06.2008, 21:30   #13  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Нужно при заполнении временной таблицы сразу же апдейтить 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  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Уппс.. select я не дописал. При написании этого кода я сомневался что RecId можно заменить, так оно и есть. Спасибо.
2 jeky: тогда придется искать workaround.
Старый 28.06.2008, 20:26   #16  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
jeky,
а почему решили использовать временную таблицу для этих целей? Может быть, стоит попробовать отдать форме сформированный запрос на реальную таблицу? Посмотрите, как похожий механизм реализован в оборотно-сальдовой ведомости: Расчеты с клиентами / Запросы / Оборотно-сальдовая ведомость. После выполнения запроса нажать правой кнопкой на интересующей строке и выбрать "Исходный документ".

Реализацию механизма см. в методе:
\Classes\RLedgerSheetEngine_TurnoverCustVend\originalDocuments
Старый 28.06.2008, 22:05   #17  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
отвечу за jeky
надо выводить проводки с просроченными платежами с учетом периода, что запихнуть в квери не получится.

есть мысли откуда берется RecId для временных таблиц?
Старый 29.06.2008, 07:10   #18  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Вась, подскажи. А что даст, если получиться во временной таблице получить нужный 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   #19  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Все верно
Цитата:
если есть дополнительные find-ы, ифы, начинаются танцы с бубном, которые в результате могут ни к чему не привести.
поэтому в первой таблице сохраняются RecId исходных данных, при drilldown создается временная таблица проводок, которые были исходными для суммы, и она запихивается в форму.
formDatasource.cursor().setTmp;
formDatasource.cursor().setTmpData(tmpCustTrans);

Получается все красиво... форма привычная, данные понятны, сортировки, фильтры, переходы к основным таблицам, просмотр исходного документа, докумнта ГК и т.д. и т.п... НО нет сопоставлений, истории, открытых проводок, так как все это делается через... RecId, который не совпадает с реальным.
Решается это добавлением join со временной таблицей в исходном formDatasource.
Но остался нерешенным вопрос "откуда берется RecId для временной таблицы и можно ли этим управлять"
За это сообщение автора поблагодарили: miklenew (2), jeky (1).
Старый 29.06.2008, 21:14   #20  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Wamr Посмотреть сообщение
formDatasource.cursor().setTmp;
formDatasource.cursor().setTmpData(tmpCustTrans);
Хитрый способ.
Создал дублированием таблицу CustTrans.
Поставил Tempory да.
Через dictField небось создал копию с оригинала CustTrans.
Блин, почему в range ограничение на количество значений.
Можно было бы все эти recId засунуть в query и не парится.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
производительность: map или временная таблица kitty DAX: Программирование 5 15.11.2007 12:36
Временная таблица и форма рантайм Андрей К. DAX: Программирование 1 03.06.2007 16:22
Временная таблица + RLS leshy DAX: Программирование 6 27.04.2006 12:39
select sum(amount) from временная таблица ATimTim DAX: Программирование 6 11.06.2004 14:16
next и временная таблица Dron AKA andy DAX: Программирование 3 24.04.2003 16:42
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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