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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.12.2004, 15:41   #1  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
tmpTable+Cursor= Error....
1.1)
PHP код:
void clicked() //кликед на кнопке формы
{    
    
//tmpDS - датасорс на форме, причем он тоже от таблицы b_CustEmailSettings_tmp
    
b_CustEmailSettings_tmp tmpT;    //<<<<<<< временая таблица
    
FormDataSource          formDataSource;
;


   
formDataSource element.objectSet();
   
tmpT.setTmpData(formDataSource.cursor().data());     // <<<<<< падение аксапты
....

1.2)
PHP код:
void clicked() //кликед на кнопке формы
{    
    
//tmpDS - датасорс на форме, причем он тоже от таблицы b_CustEmailSettings_tmp
    
b_CustEmailSettings_tmp tmpT;    //<<<<<<< временая таблица
;
 
tmpT.setTmpData(tmpDS_DS.cursor().data());        // <<<<<< падение аксапты        
...

Падает так в обоих случаях так:
ax32.exe generated error.....
Вопрос: Почему падает?

2)
PHP код:
 common formDataSource.cursor().data(); // пустой!!! 
кусок имеет отношение к тому же коду. а вот formDataSource.cursor() не пустой......
Вопрос: Почему пустой?

3) И только с помощью такого изврата удалось получить копию буфера:
PHP код:
{
.....
   
formDataSource  element.objectSet();

   
formQueryRun    formDataSource.queryRun();

   
query           = new Query (formQueryRun.pack(false));
   
queryRun        = new QueryRun(query);

   
tmpDataSource   formDataSource;
   
tmpCommonForm   tmpDataSource.cursor();
   
dictTable       = new DictTable(tmpDataSource.table());
   
tmpCommon       dictTable.makeRecord();

   
tmpCommon.setTmpData(tmpCommonForm);
   
queryRun.setCursor(tmpCommon1);
 while(
queryRun .next())
{
..... 
Вопрос: а проще никак нельзя?

P.S. Может я чего то не правильно понимаю? (доки по классам - маловато)
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 08.12.2004, 15:53   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,262 / 985 (37) +++++++
Регистрация: 03.04.2002
начнем с того, что писать в clicked() неприлично
__________________
Isn't it nice when things just work?
Старый 08.12.2004, 15:53   #3  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Цитата:
Изначально опубликовано macklakov
начнем с того, что писать в clicked() неприлично
согласен. но не суть.
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 08.12.2004, 16:03   #4  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,262 / 985 (37) +++++++
Регистрация: 03.04.2002
Спасло вас makeRecord(). Чтобы это значило?
__________________
Isn't it nice when things just work?
Старый 08.12.2004, 16:04   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
А чего ты хочешь добиться?

может так
tmpT.Data(tmpDS);
или так
buf2buf(tmpDS, tmpT);
Старый 08.12.2004, 16:11   #6  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,262 / 985 (37) +++++++
Регистрация: 03.04.2002
2Wamr: нельзя тебя в разведку брать, сразу все секреты выдашь
__________________
Isn't it nice when things just work?
Старый 08.12.2004, 16:11   #7  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Цитата:
Изначально опубликовано macklakov
Спасло вас makeRecord(). Чтобы это значило?
http://www.axforum.info/forums/showt...ghlight=cursor
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 08.12.2004, 16:17   #8  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Цитата:
Изначально опубликовано Wamr
А чего ты хочешь добиться?

может так
tmpT.Data(tmpDS);
или так
buf2buf(tmpDS, tmpT);
Мне нужен был именно курсор, потому что он содержит данные отфильрованные данные, в отличии от ds.
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 08.12.2004, 17:34   #9  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Ладно по поводу копирования буферов - бог с ним.
А вот по поводу падений - комментарии будут?
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 09.12.2004, 06:58   #10  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано bucken
Ладно по поводу копирования буферов - бог с ним.
А вот по поводу падений - комментарии будут?
Привыкайте к тому, что когда что то делаете неправильно в аксапте, вместо вежливого сообщения об ошибке она вылетает.
Старый 09.12.2004, 14:27   #11  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Цитата:
Изначально опубликовано Alks


Привыкайте к тому, что когда что то делаете неправильно в аксапте, вместо вежливого сообщения об ошибке она вылетает.
а что я собсно говоря сдела не правильно?
PHP код:
tmpT.setTmpData(tmpDS_DS.cursor().data()); 
такое люди делали и успешно(только не с временым таблицами:

http://www.axforum.info/forums/showt...ghlight=cursor

Так что тут далеко не ля ля. или я опять не прав?

P.S. Ну на счет привыкайте - мы уже железобетоные...
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 09.12.2004, 14:53   #12  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Для меня вообще те конструкции которые вы привели в начале выглядят странно и извращенно. Какая вообще постановка задачи? Если изложите проблему уровнем выше (т.е. что за форма, что на ней изображаете, чего хотите добится методом), то возможно родится решение близкое к стандартным.
Кстати, а зачем вызывать cursor().data(), если сам cursor() уже имеет тип Common?
Старый 09.12.2004, 17:16   #13  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Цитата:
Изначально опубликовано Alks
Для меня вообще те конструкции которые вы привели в начале выглядят странно и извращенно. Какая вообще постановка задачи? Если изложите проблему уровнем выше (т.е. что за форма, что на ней изображаете, чего хотите добится методом), то возможно родится решение близкое к стандартным.
Кстати, а зачем вызывать cursor().data(), если сам cursor() уже имеет тип Common?
1. Пролема выше уровнем не суть. (Проблема уже решена)
Бизнес-анализы и прочее.
2. Интересует почему не работает конструкция - которая должна работать.
И ЭТО ГЛАВНЫЙ ВОПРОС.
3. А вот поводу cursor().data() а не cursor() была привидена ссылка яствено указываешь зачем это надо.
4. Дальний диалог не целесообразен.
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 09.12.2004, 17:19   #14  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Я считаю это ошибкой программы Axapta.
Вот и все. Но почему то никто не обратил внимание.
Ну да ладно. Всем успехов.
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 09.12.2004, 18:33   #15  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
xRecord::setTmpData

Description
Sets the buffer it is performed on to use the same physical dataset as the buffer passed as parameter. This method is only applicable on a temporary table buffer using a buffer on a temporary table as parameter. The normal behaviour for temporary tables is that instances of the same table are isolated from each other. This method allows several buffer instances to operate on the same temporary data.

Т.е. данное действие предназначено для работы со всей временной таблицей, а не с буфером одной записи.

А вот падение Аксапты без нормальных объяснений, действительно, ошибка.
Старый 10.12.2004, 05:35   #16  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
[QUOTE]Изначально опубликовано bucken
Цитата:
2. Интересует почему не работает конструкция - которая должна работать.
И ЭТО ГЛАВНЫЙ ВОПРОС.
Кажется вам уже ответили почему она не должна работать.

Цитата:
3. А вот поводу cursor().data() а не cursor() была привидена ссылка яствено указываешь зачем это надо.
Я по той ссылке мало того что не нашёл никаких доводов что это надо, более того, любопытства ради набросл у себя форму с временной таблицей TmpItemQty и кнопкой с кодом:
PHP код:
void clicked()
{
    
TmpItemQty ItemQty;
    ;
    
ItemQty.setTmpDataTmpItemQty_ds.cursor() );
    
select sumQty from ItemQty;
    
info"Итог: " real2strItemQty.Qty ) );

Так вот, она РАБОТАЕТ и без всяких побочных эффектов!
И действительно, если написать
PHP код:
...ItemQty.setTmpDataTmpItemQty_ds.cursor().data() );... 
То Аксапта вылетает. И это логично, если присмотреться к описанию метода .data(). (Более того, логично почему он работает для невременных таблиц.) Копия таблицы полученная из метода data() просто обязана "разлинковываться" от своего буфера в памяти, и вообще непонятно что потом с этим data() делать.

Цитата:
4. Дальний диалог не целесообразен.
Зря вы тут занервничали. Правильно вам всё говорят.
Старый 10.12.2004, 10:55   #17  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Ну что ж....

PHP код:
 tmpT.setTmpData(tmpDS_DS.cursor().data()); 
1. Если это приводит к падению аксапты, то не есть ли это ошибка программы, хотя бы потому что падение любого по - считается критической ошибкой?
2. "Вам кажется ответили" - ГДЕ?

3.
Цитата:
Я по той ссылке мало того что не нашёл никаких доводов что это надо, более того, любопытства ради набросл у себя форму с временной таблицей TmpItemQty и кнопкой с кодом:
Потому что надо читать внимательно.
А написано следующее там:
Цитата:
Будьте внимательны, cursor() вернет вам буфер таблицы, который используется для вывода данных в форму. То есть, если вы начнете делать select'ы, указывая в качестве таблицы именно этот cursor(), будет происходить фильтрация данных, выводимых в форму. Лучше создать еще один объект, и делать select'ы по нему.
Цитата:
void method(FormDataSource _formDS)
{
Common common = _formDS.cursor().data();
}--------------------------------------------------------------------------------
Цитата:
Чтобы понять, что я имел в виду, под фильтрацией буфера, проведите маленький эксперимент:


Создайте форму и добавьте к ней DataSource. Например, InventTable.
На форме разместите Grid, в котором выведите какие-нибудь данные DataSource.
Также на форме поставьте кнопку. В методе clicked() у нее напишите что-нибудь вроде:

X++ code:--------------------------------------------------------------------------------
Common common;
;
common = InventTable_ds.cursor();
select common where common.(fieldnum(InventTable, ItemId)) like "С*";--------------------------------------------------------------------------------

Нажмите на кнопку и наблюдайте за содержимым Grid'а.

А теперь представьте, что вы генерируете более сложные запросы. Представьте, что будет видеть пользователь!
4.
Цитата:
То Аксапта вылетает. И это логично, если присмотреться к описанию метода .data(). (Более того, логично почему он работает для невременных таблиц.) Копия таблицы полученная из метода data() просто обязана "разлинковываться" от своего буфера в памяти, и вообще непонятно что потом с этим data() делать.
"не понятно" - смотрите выше.
"описанию метода .data()."
А что присматриваться то?
Создание полной копии буфера без сслылок на буфер источника. Так называемое копирование объектов.
5.

Цитата:
ItemQty.setTmpData( TmpItemQty_ds.cursor()
Это к сожалению не полная копия - это просто новая ссылка.


Лана.. Alks, я и в правду занервничал - чуть злиться даже начал.
Опять же таки не хочу флудить и все такое. Не будем пылить по пусту, ок?





__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 10.12.2004, 11:52   #18  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано bucken
1. Если это приводит к падению аксапты, то не есть ли это ошибка программы, хотя бы потому что падение любого по - считается критической ошибкой?
Абсолютно согласен, это бесспорно. Аксапта очень часто вылетает с сообщением об ошибке, т.к. её создатели в коде (С++) не отработали всех исключительных ситуаций. Радует только то что происходит это как правило только в тех случаях когда действительно возникают исключительные ситуации, в т.ч. и когда программист на X++ пишет не совсем корректный код.

Цитата:
А что присматриваться то?
Создание полной копии буфера без сслылок на буфер источника. Так называемое копирование объектов.
Это для обычных таблиц так и это просто и естественно. А вот временные таблицы более сложные структуры, в них помимо основных данных (data()) хранится еще и ссылка на буфер, где хранятся временные данные. data() не копирует его, и похоже вообще забивает во внутренней структуре аксапты это поле мусорным, либо NULL значением, поэтому попытки делать по этой новой, сгенерированной методом data() структуре селекты вызывают GPF.

Цитата:
Чтобы понять, что я имел в виду, под фильтрацией буфера, проведите маленький эксперимент:...
Я понимаю что вы имеете ввиду - выборки по активным табличным переменным датасоурсов сразу же сказываются самым неожиданным образом на содержимом датасоурса. НО! тут есть более тонкий момент.
Дело в том, что методу setTmpData можно спокойно передавать ссылку на активную табличную переменную датасоурса, т.к. он её не модифицирует и не делает по ней выборки. (Поэтому я и писал в посте выше "...без всяких побочных эффектов.", мой пример совершенно бесследно для датасоурса отображает сумму по всем запиям.) У него вообще принцип действия другой - он напрямую обращается к указателю на временные данные в переданной ему табличной переменной и вытаскивает оттуда все записи. Ввиду сказанного пунктом выше в случае использвоания data() он глючит. Для реальных, а не временных таблиц всё совсем по другому.

Цитата:
Лана.. Alks, я и в правду занервничал - чуть злиться даже начал.
Опять же таки не хочу флудить и все такое. Не будем пылить по пусту, ок?
Солидарен.

P.S.

Кстати, забыл сказать, если вы хотите получить некую выборку, в которую попадают только записи отфильтрованные в датасоурсе, то стандартный способ получить эту выборку: ds.getFirst() и ds.getNext(). Теперь оглядываясь назад мне кажется что это именно то что вам нужно было изначально, т.к. в setTmpData попадут все записи из временной таблицы, даже если они не отвечают фильтрав в datasource.
Старый 10.12.2004, 22:06   #19  
Волчара is offline
Волчара
Участник
 
210 / 29 (1) +++
Регистрация: 08.02.2003
Адрес: Москва
Talking
Цитата:
Изначально опубликовано Wamr
xRecord::setTmpData
А вот падение Аксапты без нормальных объяснений, действительно, ошибка.
При падении вообще всегда положено объясняться . В данном случае перед падением Ахапка должна сказать:

-Ну ты друг, какую то полную фигню написал. Внимание! Падаю
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отчеты,fetch CRASH_505 DAX: Программирование 14 19.09.2008 17:16
Внутренний аудит изменений кода (DAX 4) Qaz Qwerty DAX: Программирование 6 04.08.2008 15:01
tmpTable и Grid fialka DAX: Программирование 39 19.06.2007 00:06
Опять TmpTable Piston DAX: Программирование 3 25.12.2003 13:59
tmpTable Novice DAX: Программирование 2 26.09.2003 11:26

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

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

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