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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.06.2007, 17:32   #1  
PavelSR is offline
PavelSR
Участник
 
97 / 10 (1) +
Регистрация: 25.05.2006
Курсор перешел к следующей записи на клиенте, на сервере этого сделать уже нельзя
Добрый день!

При попытке разноски авансового отчета выскакивает ошибка:

"Невозможно выбрать запись в Временные операции по налогам (рабочая таблица) (TmpTaxWorkTrans).
Курсор перешел к следующей записи на клиенте, на сервере этого сделать уже нельзя."


Не могу понять из за чего она может проявиться.
Кто нибудь сталкивался с таким сообщением?
Из за чего происходит такая ошибка
Старый 02.07.2007, 08:57   #2  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
(пусть поправят меня местные гуру программирования)
Временная таблица заполняется на клиенте. Если класс обработки имеет модификатор server, то обращаться к клиентским данным он не сможет. На двухуровневой конфигурации такую ошибку вы не получите, а вот на трехуровневой очень легко наступить на грабли
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 02.07.2007, 11:56   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от KiselevSA Посмотреть сообщение
(пусть поправят меня местные гуру программирования)
Временная таблица заполняется на клиенте.
Временная таблица "живет" там, где была добавлена первая запись.
Заполняться временная таблица может и на клиенте, и на сервере.

Заполненная на сервере таблица не передается автоматически на клиента (нужны шаманские действия в коде).
Заполненная на клиенте таблица не передается автоматически на сервер (нужны шаманские действия в коде).
__________________
полезное на axForum, github, vk, coub.
Старый 02.07.2007, 12:09   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Не совсем так.
Обрабатывать временную таблицу, заполненную на клиенте, на сервере можно (мда, коряво звучит).
Сергей, обрати внимание, речь идет не о передаче таблицы (т.е. самих данных) на серверную сторону, а о передаче табличной переменной, которая вполне может быть обработана на сервере (т.е. можно вызвать селект и получить данные на вызывающей стороне). Я ничего не говорю о трафике при этом

А ошибка такая возникает при "вложенном" селекте по временной таблице. Таблица может заполняться как на клиенте, так и на сервере. Затем, на стороне, где она заполнялась, идет селект. Далее, табличная переменная передается в метод на другую сторону, где по этой же переменной делается выборка. При возврате из метода при попытке вызова next или при следущем шаге итерации и возникает ошибка.
Вот небольшой пример, приводящий к ошибке
X++:
InventTable it;
;
it.SetTmp();
...
// it каким-либо образом заполняем на клиенте
while select from it //на втором шаге итерации возникнет ошибка
{
    info(it.itemId);
    classX::staticServerMethod(it);
}
X++:
static server void classX::staticServerMethod(InventTable _it)
{
    ;
    while select _it
    {
        info(_it.itemId);
    }
}
__________________
Axapta v.3.0 sp5 kr2
Старый 02.07.2007, 13:25   #5  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
Временная таблица "живет" там, где была добавлена первая запись.
Заполняться временная таблица может и на клиенте, и на сервере.

Заполненная на сервере таблица не передается автоматически на клиента (нужны шаманские действия в коде).
Заполненная на клиенте таблица не передается автоматически на сервер (нужны шаманские действия в коде).
Я про конкретный источник, а не про общее правило
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 30.10.2012, 07:38   #6  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Подниму тему
Как все-таки бороться с такой ошибкой? У меня она возникает при программном создании заказа в SalesAutoCreate.create().
Таблица с предварительными данными для будущего заказа уже заполнена.
Старый 30.10.2012, 07:59   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Fizik Посмотреть сообщение
Как все-таки бороться с такой ошибкой?
Это ограничение ядра. С ним нельзя бороться, его можно только избегать.

У вас ошибка возникает при работе со стандарным функционалом или это ваша модификация? Приведите стек вызовов, который приводит к данной ошибке.
Старый 30.10.2012, 08:12   #8  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Ошибка выглядит так:
Невозможно выбрать запись в 'Строки заказов из Cache ИСТУ' ('FromCacheSalesLine')
Курсор перешел к следующей записи на клиенте, и на сервере сделать этого уже нельзя.
(S) \Classes\SalesAutoCreate_ISTU\nextRecord - line 3
(S) \Classes\SalesAutoCreate_ISTU\create - line 22
(C) \Jobs\Job152 - line 9

На самом деле я в самом начале создания создания заказаю Создала таблицу с данными и класс SalesAutoCreate_ISTU, унаследованный от SalesAutoCreate.
Выполнение инициирую с job вот так:
SalesAutoCreate = SalesAutoCreate::construct(fromCacheSalesLine);
SalesAutoCreate.create();

Все методы классов для одной записи выполняются корректно, но переход на следующую запись не выполняется.
Старый 30.10.2012, 08:59   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А вы в джобе случайно записи таблицы fromCacheSalesLine не перебираете? Можете привести код джоба?
Старый 30.10.2012, 09:12   #10  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
вот job:
FromCacheSalesLine fromCacheSalesLine;
SalesAutoCreate SalesAutoCreate = new SalesAutoCreate();

select forupdate fromCacheSalesLine;

SalesAutoCreate = SalesAutoCreate::construct(fromCacheSalesLine);
SalesAutoCreate.create();
Старый 30.10.2012, 09:52   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Перенесите строчку
X++:
select forupdate fromCacheSalesLine;
из джоба в метод SalesAutoCreate_ISTU.new(). Например, как в SalesAutoCreate_Basket.new()
Старый 30.10.2012, 09:52   #12  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Для чистоты эксперимента сделала все так, как указано в примере http://microsoft-dynamics-ax-erp.blo...ders-with.html

Здесь обрабатывается подобная ошибка, но у меня нет макроса #OCCRetryCount, который используется в последнем методе, нет значения Exception::UpdateConflict
Видимо наша система более старой версии.
Подскажите, как можно эту обработки подредактировать.
Старый 30.10.2012, 09:56   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Fizik Посмотреть сообщение
Для чистоты эксперимента сделала все так, как указано в примере http://microsoft-dynamics-ax-erp.blo...ders-with.html
по ссылке, приведённой вами:
Цитата:
the final step is to call the logic from a job or a RunBaseBatch class, make sure that you select records on the same tier as the nextRecord will run or else it will fail. Preferably on the server tier.
Вы же делаете вызов серверного метода из джоба, который выполняется на клиенте.

Последний раз редактировалось S.Kuskov; 30.10.2012 в 09:58.
Старый 30.10.2012, 10:06   #14  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
по ссылке, приведённой вами:

Вы же делаете вызов серверного метода из джоба, который выполняется на клиенте.
Логично. Если я в job напишу такую строку
ClassRunMode runOn = ClassRunMode::Server;
это что-то изменит?

похоже, в голове уже случилась каша.
Старый 30.10.2012, 10:17   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Fizik Посмотреть сообщение
Логично. Если я в job напишу такую строку
ClassRunMode runOn = ClassRunMode::Server;
это что-то изменит?
В случае с джобом - нет. Как проще всего запустить JOB на сервере (в 3-Tier)

Воспользуйтесь советом из поста #11 и перенесите select в new().
Тогда будет не важно откуда запускать класс, ведь и команда select и команда next будут на одной и той же стороне.

Последний раз редактировалось S.Kuskov; 30.10.2012 в 10:28.
Старый 01.11.2012, 04:33   #16  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Я перенесла строку, как вы посоветовали. Тогда в методе SalesAutoCreate.create() метод не находит ни одной записи в таблице данных (строка while (this.recordExist()) ).
Цикл не выполняется, процедура заканчивается
Старый 01.11.2012, 04:58   #17  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,129 / 916 (35) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Fizik Посмотреть сообщение
FromCacheSalesLine fromCacheSalesLine;
SalesAutoCreate SalesAutoCreate = new SalesAutoCreate();

select forupdate fromCacheSalesLine;

SalesAutoCreate = SalesAutoCreate::construct(fromCacheSalesLine);
SalesAutoCreate.create();
Давайте, чтоб глаз не замыливался и в голове кашу разгрести, код немножко в порядок приведем? (Каждый раз удивляюсь, насколько эффективен такой простой прием)
У вас, в начале, объект создается через new, а потом через construct. Надо оставить что-то одно.
fromCacheSalesLine это и есть та самая временная таблица? Тогда надо ее чем-то наполнить, наверное? А то у меня складывается впечатление, что в качестве параметра в SalesAutoCreate::construct идет пустая табличная переменная.
__________________
Isn't it nice when things just work?
Старый 01.11.2012, 05:08   #18  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
код с удовольствием приведу в порядок.
Таблица fromCacheSalesLine не совсем временная, но она содержит промежуточные данные. Я лично добавила туда 2 строки. И до переноса select forupdate fromCacheSalesLine; в метод new() первая строка обрабатывалась. Ошибка возникала при переходе ко второй строке.

Спасибо на указание первой ошибки. job поправила:
FromCacheSalesLine fromCacheSalesLine;
SalesAutoCreate SalesAutoCreate;
;

SalesAutoCreate = SalesAutoCreate::construct(fromCacheSalesLine);
SalesAutoCreate.create();
Старый 01.11.2012, 05:18   #19  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,129 / 916 (35) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Fizik Посмотреть сообщение
Таблица fromCacheSalesLine не совсем временная
Т.е. это физичкская таблица в 2 строки, которую вы хотите перебирать внутри SalesAutoCreate.create(); ?
а зачем тогда в job-е переменная fromCacheSalesLine объявляется? Наверное эту строчку тоже можно убрать. Равно как и параметр из construct.
Ну и, по мере вырождения job-а, становится все более очевидным следующий вопрос: "Что происходит в construct, new и create?"
__________________
Isn't it nice when things just work?
Старый 01.11.2012, 06:19   #20  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Все происходит ровно так, как в примере http://microsoft-dynamics-ax-erp.blo...ders-with.html , только имя класса и таблицы другое.
Да, перебирать собираюсь именно эти 2 строки.
Вот методы:
SalesAutoCreate.construct такой:
static SalesAutoCreate construct(Common buffer = null,
Object object = null)
{
switch (buffer.tableId)
{
case tablenum(tmpsalesline) : return new SalesAutoCreate_TmpsalesLine(buffer,object);
case tablenum(PurchLine) : return new SalesAutoCreate_ProjPurchLine(buffer,object);
case tablenum(TmpSalesItemReq) : return new SalesAutoCreate_TmpSalesItemReq(buffer,object);
case tablenum(SalesBasketLine) : return new SalesAutoCreate_Basket(buffer,object);
case tablenum(TmpFrmVirtual) : return SalesAutoCreate_Purch::construct(buffer,object);
//BUOV 30.10.12 ZNO002 --->
case tablenum(FromCacheSalesLine) : return new SalesAutoCreate_ISTU(buffer,object);
//BUOV 30.10.12 ZNO002 --->
default : throw error(strFmt("@SYS23419",tableId2Name(buffer.tableId)));
}
}

SalesAutoCreate_ISTU.new :
void new(Common _initFromBuffer, Object _callBackClass)
{
;
select forupdate fromCacheSalesLine
where fromCacheSalesLine.RecId == _initFromBuffer.recId;

super(_initFromBuffer,_callBackClass);
FromCacheSalesLine = _initFromBuffer;
}

SalesAutoCreate.create() стандартный:
void create()
{
;
try
{
setPrefix("@SYS55110");

ttsbegin;

while (this.recordExist())
{

this.setCust();

setPrefix(#PreFixField(CustTable,AccountNum));

this.setSalesTable();

this.setSalesLine();

setPrefix(#PreFixField(SalesLine,ItemId));

this.nextRecord();
}

this.endUpdate();

ttscommit;
}

catch (Exception:eadlock)
{
retry;
}
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сделать фильтр по группе пользователей? Zabr DAX: Программирование 12 08.04.2009 11:40
Как лучше сделать? Smith DAX: Программирование 7 12.10.2004 13:57
Разграничение доступа на записи Роман Кошелев DAX: Функционал 11 26.07.2004 10:56
Как решить проблему с правами на вновь создаваемые записи таблицы. AY DAX: Прочие вопросы 4 02.10.2003 12:44
дизайн отчета (как сделать его с разделителями между столбцами?) puz DAX: Программирование 7 02.09.2003 08:50
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:54.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.