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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.08.2011, 11:03   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (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   #2  
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   #3  
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:40   #4  
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   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от maximka Посмотреть сообщение
И по вашему оно действительно работает как и сказано (для временной и обычной по разному)
На самом деле у меня не получилось найти то действие которое бы изменяло/не изменяло параметр по разному для временных/постоянных таблиц. Так что я тоже в замешательстве. Что именно имелось в виду в книге не понятно
Старый 17.08.2011, 11:52   #6  
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, 12:01   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от maximka Посмотреть сообщение
Создал временную таблицу и вот так работает как надо:
В AX2009 меняю свойство временности таблицы туда и обратно результат вашего примера остаётся прежним
Старый 17.08.2011, 11:59   #8  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,816 / 402 (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:14   #9  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от ice Посмотреть сообщение
этот пример очень хорошо демонстрирует передачу ссылки на временную таблицу, но при передаче с клиента на сервер (или наоборот) лучше использовать метод setTmpData():
X++:
tmpAccountSum.setTmpData(_tmpAccountSum);
Так работает как и должно, ибо никаких ссылок не используется. Вопрос-то в том, что автор книги говорит о разном поведении системы для временной и обычной таблиц при передаче их через параметры. Чего я не смог повторить.
__________________
ѣ
Старый 19.08.2011, 08:27   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2480 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от ice Посмотреть сообщение
этот пример очень хорошо демонстрирует передачу ссылки на временную таблицу, но при передаче с клиента на сервер (или наоборот) лучше использовать метод setTmpData():
X++:
tmpAccountSum.setTmpData(_tmpAccountSum);
Этот пример демонстрирует передачу ссылки на табличную переменную

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

Передать данные из временной таблицы на другую строну можно только последовательным копированием и вставкой.
__________________
Axapta v.3.0 sp5 kr2
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
В Стандартной АХ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, время: 06:38.