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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.08.2011, 10:35   #1  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Параметры и табличные переменные
В книге MorphX IT (в русском варианте, стр.стр.133,136) написано:
Цитата:
Если передается временная таблица в качестве параметра в метод и параметр изменяется в методе, то значение параметра тоже меняется... Отметьте, что только временные таблицы передаются по ссылке. Обычная таблица, как CustTable, будет передаваться по значению
Решил проверить на 4-ке - одинаково передаются по ссылке как временные, так и обычные, т.е. переменные изменяются. Просто ради интереса: это особенности только 4-ки?
__________________
ѣ
За это сообщение автора поблагодарили: S.Kuskov (3).
Старый 17.08.2011, 11:03   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вопрос в том что понимать под "... и параметр изменяется в методе".

X++:
static void JobTestCommonParameter(Args _args)
{
    CustTable CustTable;

    void testMethod(CustTable _CustTable)
    {
        CustTable CustTable2;
        ;
        
        CustTable2.clear();
        _CustTable = CustTable2;
    }
    ;
    
    select CustTable;
    info(CustTable.AccountNum);
    testMethod(CustTable);
    info(CustTable.AccountNum);
}
Что такое табличная переменная? Это ссылка на объект Common.
В книге написано, что если передавать в метод ссылку на "временный" common, то ссылка (табличная переменная) будет передана по ссылке
Что такое изменение табличной переменной? Это присваивание ссылки на другой объект или обнуление ссылки

Последний раз редактировалось S.Kuskov; 17.08.2011 в 11:10.
Старый 17.08.2011, 11:18   #3  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вопрос в том что понимать под "... и параметр изменяется в методе". Что такое табличная переменная? Это ссылка на объект Common.
В книге написано, что если передавать в метод ссылку на "временный" common, то ссылка (табличная переменная) будет передана по ссылке
Ссылаясь на вас и немного подправив получается как раз то как я себе это понимаю:
X++:
static void JobTestCommonParameter(Args _args)
{
    CustTable custTable;

    void testMethod(CustTable _custTable)
    {
        _custTable.clear();
    }
 
    select custTable;
    info(custTable.AccountNum);
    testMethod(custTable);
    info(custTable.AccountNum);
}
Т.е. при изменении параметра, изменяется и исходная переменная.
Может, все-таки, я чего-то не догоняю?
__________________
ѣ
Старый 17.08.2011, 11:25   #4  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Изменив первый джоб еще немного:
X++:
    void testMethod(CustTable _custTable)
    {
        CustTable custTable2;
    
        custTable2 = _custTable;
        custTable2.clear();
    }
Тот же результат...
__________________
ѣ
Старый 17.08.2011, 11:39   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
"немного поменяв код" вы меняете порядок присвоения значений, а значит и результат
Старый 17.08.2011, 11:40   #6  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
В общем, смысл я понял И по вашему оно действительно работает как и сказано (для временной и обычной по разному), но я ориентировался на пример из книги:
X++:
void callByReference(TmpAccountSum _tmpAccountSum)
{
TmpAccountSum tmpAccountSum;
;
tmpAccountSum = _tmpAccountSum;
select firstonly tmpAccountSum order by accountNum desc;
{
info(tmpAccountSum.accountNum);
}
}
__________________
ѣ
Старый 17.08.2011, 11:43   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от maximka Посмотреть сообщение
И по вашему оно действительно работает как и сказано (для временной и обычной по разному)
На самом деле у меня не получилось найти то действие которое бы изменяло/не изменяло параметр по разному для временных/постоянных таблиц. Так что я тоже в замешательстве. Что именно имелось в виду в книге не понятно
Старый 17.08.2011, 11:52   #8  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
На самом деле у меня не получилось найти то действие которое бы изменяло/не изменяло параметр по разному для временных/постоянных таблиц. Так что я тоже в замешательстве. Что именно имелось в виду в книге не понятно
Создал временную таблицу и вот так работает как надо:
X++:
static void JobTestCommonParameter(Args _args)
{
    _TmpTable tmpTable;

    void testMethod(_TmpTable _tmpTableParm)
    {
        _tmpTableParm = null;
    }

    ttsbegin;
    tmpTable.selectForUpdate();
    tmpTable.NumberOf = 1;
    tmpTable.insert();
    ttscommit;
    select tmpTable;
    info(strfmt("%1",tmpTable.NumberOf));
    testMethod(tmpTable);
    info(strfmt("%1",tmpTable.NumberOf));
}
__________________
ѣ
Старый 17.08.2011, 11:59   #9  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от maximka Посмотреть сообщение
В общем, смысл я понял И по вашему оно действительно работает как и сказано (для временной и обычной по разному), но я ориентировался на пример из книги:
X++:
void callByReference(TmpAccountSum _tmpAccountSum)
{
TmpAccountSum tmpAccountSum;
;
tmpAccountSum = _tmpAccountSum;
select firstonly tmpAccountSum order by accountNum desc;
{
info(tmpAccountSum.accountNum);
}
}
этот пример очень хорошо демонстрирует передачу ссылки на временную таблицу, но при передаче с клиента на сервер (или наоборот) лучше использовать метод setTmpData():
X++:
tmpAccountSum.setTmpData(_tmpAccountSum);

Последний раз редактировалось ice; 17.08.2011 в 12:02.
Старый 17.08.2011, 12:01   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от maximka Посмотреть сообщение
Создал временную таблицу и вот так работает как надо:
В AX2009 меняю свойство временности таблицы туда и обратно результат вашего примера остаётся прежним
Старый 17.08.2011, 12:11   #11  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В AX2009 меняю свойство временности таблицы туда и обратно результат вашего примера остаётся прежним
Сорри. Лажанулся (прогнал другой пример ). Пора в отпуск.
__________________
ѣ

Последний раз редактировалось maximka; 17.08.2011 в 12:15.
Старый 17.08.2011, 12:14   #12  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от ice Посмотреть сообщение
этот пример очень хорошо демонстрирует передачу ссылки на временную таблицу, но при передаче с клиента на сервер (или наоборот) лучше использовать метод setTmpData():
X++:
tmpAccountSum.setTmpData(_tmpAccountSum);
Так работает как и должно, ибо никаких ссылок не используется. Вопрос-то в том, что автор книги говорит о разном поведении системы для временной и обычной таблиц при передаче их через параметры. Чего я не смог повторить.
__________________
ѣ
Старый 19.08.2011, 08:27   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от ice Посмотреть сообщение
этот пример очень хорошо демонстрирует передачу ссылки на временную таблицу, но при передаче с клиента на сервер (или наоборот) лучше использовать метод setTmpData():
X++:
tmpAccountSum.setTmpData(_tmpAccountSum);
Этот пример демонстрирует передачу ссылки на табличную переменную

А вот использование setTmpData() - это как раз таки передача ссылки на временную таблицу. Причем, tmpAccountSum окажется на той же строне, что и _tmpAccountSum, но значения в этих переменных будут независимы (с привязкой к одной и той же временной таблице, естественно).

Передать данные из временной таблицы на другую строну можно только последовательным копированием и вставкой.
__________________
Axapta v.3.0 sp5 kr2
Старый 19.08.2011, 09:37   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Мне кажется, что всё станет на свои места если до конца разобраться, в том что всётаки представляет из себя табличная переменная в аксапте?

Табличная переменная содержит либо ссылается на
  • табличный буфер (временный либо постоянный)
  • запрос который был применён к этому табличному буферу
  • текущую строку (текущую позицию курсора в этом запросе)
  • текущие значения полей текущей строки
  • оригинальные значения полей текущей строки (common.orig())
  • флаги-параметры, влияющие на работу с курсором
  • возможно ещё что-то

Если обсуждать вопрос копирования табличной переменной, то нужно разобраться в том, что из вышеперечисленного является ссылкой, а что значением. Ведь
Цитата:
Часто некоторые на форумах повторяют миф:
Миф: Объекты передаются по ссылке, а примитивы по значению.
...
Истина же...:
Истина 1: Всё в Java передается по значению. Объекты, же, вообще никогда не передаются
Истина 2: Значениями переменных могут быть только примитивы или ссылки, но не объекты.
Что передается функциям, ссылки или значения?


Если говорить о том, что в Axapta как и Java всё передается по значению, то тогда, что имел в виду автор MorphX IT, когда писал
Цитата:
Отметьте, что только временные таблицы передаются по ссылке. Обычная таблица, как CustTable, будет передаваться по значению
? или это неправильный перевод. Может ли кто-нибудь привести оригинал?

P.S.: некоторые известные мне проблемы/ньюансы при работе с табличными переменными
Старый 19.08.2011, 12:24   #15  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
? или это неправильный перевод. Может ли кто-нибудь привести оригинал?
"If a temporary table is passed as a parameter to a method, and the temporary table parameter is modified in the method, the calling variable will also be changed... Note that only temporary tables are called by reference. A normal table like CustTable would be called by value"
__________________
ѣ
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
В Стандартной АХ2009 не работает кнопка <Параметры> на диалоге класса унаследованного от RunBaseReport Pustik DAX: Программирование 3 11.05.2011 19:47
Как правильно связать таблицы в форме? Как показать параметры партии? mazzy DAX: Программирование 10 27.10.2010 15:56
WebActionMenuFunction - получить параметры Alex05507 DAX: Программирование 0 18.06.2010 13:12
Связываемые переменные при работе с Oracle axbegin DAX: Программирование 8 04.08.2009 09:42
Система не видит новые параметры методов при работе Anais DAX: Программирование 28 20.01.2005 22:38

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

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

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