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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.09.2003, 16:19   #1  
Pavlo AKA Panok is offline
Pavlo AKA Panok
Участник
 
64 / 10 (1) +
Регистрация: 01.05.2002
Адрес: Москва
SetTmpData vs =
Добрый день!

объясните разницу между использованием оператора присваивания и оператора setTmpData при необходимости передачи данных из одной переменной типа временная таблица в другую такую же.

Спасибо
Старый 26.09.2003, 18:36   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
tmpTable1 = tmpTable2 - это присвоение курсора, так сказать, по ссылке. Обе переменные после такого присвоения ссылаются на один и тот же класс.
Пример:
PHP код:
tmpTable1.Field "";
tmpTable2.Field "Value";
tmpTable1 tmpTable2;
print 
tmpTable1.Field// result -> Value 
После же tmpTable1.setTmpData(tmpTable2) переменная tmpTable1 остается отдельным курсором, но запрашивающим тот же блок данных (по-видимому, тот же файл на диске), что и tmpTable2.
Пример:
PHP код:
tmpTable2.Field "Value";
tmpTable2.insert();
select tmpTable1 where tmpTable1.Field "Value"// result -> none
tmpTable1.setTmpData(tmpTable2);
select tmpTable1 where tmpTable1.Field "Value"// result -> found 
Старый 26.09.2003, 20:39   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано EVGL
После же tmpTable1.setTmpData(tmpTable2) переменная tmpTable1 остается отдельным курсором, но запрашивающим тот же блок данных (по-видимому, тот же файл на диске), что и tmpTable2.
Они будут работать в одной области видимости (scope) временных данных.

См документацию. Ключевое слово "Temporary tables"

Temporary tables are declared just like any other variable, and have the following characteristics:
  • They do not contain any data when they are first created
  • They obey normal scoping rules, that is, their scope is determined by where they are declared
  • They are automatically deleted by MorphX when they go out of scope
  • Temporary tables are not persistent. They are written to local disk storage but not stored in the database
Старый 26.09.2003, 20:57   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
EVGL, а может у тебя правильная терминология...
см. http://technet.navision.com/default....rch=settmpdata
Может скажешь где ты видел насчет курсоров во временных таблицах?

Про временные таблицы полезно поглядеть на том же technet'е
http://technet.navision.com/default....rch=settmpdata
Старый 11.02.2009, 16:23   #5  
Jackally is offline
Jackally
Участник
 
20 / 14 (1) ++
Регистрация: 08.08.2006
Все-таки неясна разница, есть ли какой-нибудь пример из жизни? как ни крути результат один и тот же у этих операторов.....
Старый 11.02.2009, 16:48   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если вкратце, то

setTmpData() создает копию данных. Грубо говоря, вместо одной таблицы, получаем две.

В то время, как присвоение копии не создает. Это просто "переименование" переменной. Не две таблицы, а два "имени" одной и той же таблицы.
Старый 11.02.2009, 16:56   #7  
Jackally is offline
Jackally
Участник
 
20 / 14 (1) ++
Регистрация: 08.08.2006
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если вкратце, то

setTmpData() создает копию данных. Грубо говоря, вместо одной таблицы, получаем две.

В то время, как присвоение копии не создает. Это просто "переименование" переменной. Не две таблицы, а два "имени" одной и той же таблицы.
Нет, я тоже так думал долгое время ) никакой копии setTmpData не создает, после использования setTmpData 2-ая табличная переменная обращается к тому же набору данных что и 1-ая, т.е. теперь если мы что-то обновляем/добавляем/удаляем для 2-ой табличной переменной, эти изменения будут и в 1-ой. Как я понял, чтоб получить 2-ой НАБОР ДАННЫХ нужно заново делать insert();....
Так в чем же разница между = и setTmpData ???
Старый 11.02.2009, 17:13   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Даа, похоже разницы действительно почти нет
Чуть-чуть поэкспериментировал.
Нашел только одно отличие.

= сразу инициализирует переменную и текущими значениями исходной переменной, и ссылкой на ее файл

setTmpData только ссылку на файл делает, то есть дополнительно нужно запрос сделать будет.

Но это оочень несущественное отличие.

Других пока не нашел..
Старый 11.02.2009, 17:23   #9  
Jackally is offline
Jackally
Участник
 
20 / 14 (1) ++
Регистрация: 08.08.2006
это да, просто тогда непонятно, зачем рекомендуется использовать setTmpData()?
Старый 11.02.2009, 17:31   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да, перепутал с методом xRecord.setTmp()

Вообще-то, EVGL уже указал на различия.

При использовании прямого присвоения обе переменные должны быть одного типа. Одна и та же временная таблица. Один объект AOT (один "класс")

А при использовании xRecord.setTmpData() - не обязательно. Это могут быть разные таблицы AOT. Хотя, конечно, должны совпадать по структуре копируемые (синхронизируемые) данные. Т.е. попытка скопировать не существующее поле вызовет ошибку.
Старый 11.02.2009, 17:32   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а вы передайте свою временную таблицу в метод какого-нибудь классика и сделайте из него выборку после = и после setTmpData
За это сообщение автора поблагодарили: ivas (2).
Старый 11.02.2009, 18:11   #12  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Но это оочень несущественное отличие.
Ну, это смотря как к этому относиться.
Это как передача значения по ссылке и по значению: разница, конечно, небольшая, но существенная.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
setTmpData Eldar9x DAX: Программирование 6 27.11.2007 14:08
setTmpData Bars DAX: Функционал 13 19.01.2006 07:51
Дополнительные возможности временных таблиц: метод setTmpData vitk DAX: База знаний и проекты 1 19.06.2002 17:53
Что происходит с переменной табличного типа после выхода из функции? vitk DAX: Программирование 3 10.12.2001 15:34
HB_Tutorial_setTmpData - пример использования метода setTmpData vitk DAX: База знаний и проекты 0 10.12.2001 15:26

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

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

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