Показать сообщение отдельно
Старый 25.07.2012, 10:06   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
А о какой версии Аксаты идет речь?

Помнится, при попытке передать серверную временную таблицу на клиентский курсор с помощью вызова setTmpData() в трешке, валилась клиентская сессия.

Вообще, setTmpData() ничего не копирует, а устанавливает указатель на тотже временный файл, что и у передаваемого аргумента. При этом табличная переменная, вызывающая метод, так же оказывается на той стороне, что и аргумент.

При этом есть большой ньюанс.
Если табличная переменная находится на противоположной стороне от агргумента, в табличной переменной аргумента не было вставлено данных и в момент вызова функции счетчик ссылок аргумента равен 1, то вызывающая табличная перенная не поменяет своего положения, но файл временной таблицы будет пересоздан.
X++:
server class MyTable MyClass // Экземпляр класса будет создан на сервере
{
    MyTable myTable; 
}
public MyTable MyClass.getMyTableTmp()
{
    ;

    myTable.setTmp(); //табличная переменная создана на сервере
    //Здесь не важно заполнение. Клиентский курсор всегда переезжает на сервер
    return myTable;    
}
static server MyTable MyClass::getMyTableTmpStatic()
{
    MyTable myTable;
    ;

    myTable.setTmp(); //табличная переменная создана на сервере
    //Не заполняем myTable, если будет вставка, то клиентский курсор переедет на сервер
    return myTable;    
}
static client void processMyTable()
{
    MyTable myTable;
    MyClass myClass = new MyClass();
    ;

    myTable.setTmp(); //Таблиная переменная создана на клиенте
    myTable.setTmpData(MyClass::getMyTableTmpStatic()); //табличная переменная указывает на клиентский временный файл

    myTable = null;
    myTable.setTmp(); //Таблиная переменная создана на клиенте
    myTable.setTmpData(myClass.getMyTableTmp()); // табличная переменная будет указывать на серверный временный файл, копирования на клиент не будет
}
Последнее утверждение верно для DAX2009RU7 и выше.
Для более ранних версий, скорее всего, так же верно, но я не проверял

Замечу еще, что setTmpData() не сбрасывае и не устанавливает данные в самой табличной переменной. Т.е. если до вызова функции установить значения каких-либо полей, то они останутся уставновленными и после вызова функции. Но в файле временной таблицы этих данных не окажется (если не были вставлены в передаваемом курсоре, естественно) - select их не вернет
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 25.07.2012 в 10:10.
За это сообщение автора поблагодарили: sukhanchik (2), lev (5), Eldar9x (3).