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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.03.2019, 11:39   #1  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 23.10.2012
Ошибка БД при обновлении контейнерного поля
Добрый день.
Возникает ошибка обновления записи после проставления нового значения в контейнерное поле. При условии, что выбирается запись вместе с приджоиниными таблицами.
Пример:
Table1 у которой есть поле Field1 типа Container.

X++:
    Table1  table1, 
            table1join; // может быть любая другая таблица
    ;

    ttsBegin;
    select firstOnly forUpdate table1
    join TableId from table1join; //exists join, выборка полей ограничена или нет - не важно
    // where может быть или отсутствовать - не важно
    table1.Field1 = [123];
    table1.update();

    ttsCommit;
Запрос:
Оператор SQL: UPDATE TABLE1 SET FIELD1=<n/a>,RECVERSION=идентификатор WHERE (((DATAAREAID=N'тут компания') AND (RECID=идентификатор)) AND (RECVERSION=идентификатор))

Ошибка:
Описание ошибки SQL: [Microsoft][SQL Native Client][SQL Server]Неправильный синтаксис около конструкции "<".

Помогает выбор записи без джоина.
Этому есть объяснение? Почему <n/a>?

Последний раз редактировалось Товарищ ♂uatr; 28.03.2019 в 11:44.
Старый 29.03.2019, 09:58   #2  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
Добрый день.
Возникает ошибка обновления записи после проставления нового значения в контейнерное поле. При условии, что выбирается запись вместе с приджоиниными таблицами.
Пример:
Table1 у которой есть поле Field1 типа Container.

X++:
    Table1  table1, 
            table1join; // может быть любая другая таблица
    ;

    ttsBegin;
    select firstOnly forUpdate table1
    join TableId from table1join; //exists join, выборка полей ограничена или нет - не важно
    // where может быть или отсутствовать - не важно
    table1.Field1 = [123];
    table1.update();

    ttsCommit;
Запрос:
Оператор SQL: UPDATE TABLE1 SET FIELD1=<n/a>,RECVERSION=идентификатор WHERE (((DATAAREAID=N'тут компания') AND (RECID=идентификатор)) AND (RECVERSION=идентификатор))

Ошибка:
Описание ошибки SQL: [Microsoft][SQL Native Client][SQL Server]Неправильный синтаксис около конструкции "<".

Помогает выбор записи без джоина.
Этому есть объяснение? Почему <n/a>?
Тот запрос, что вы прислали не работает, т.к. не указано условие, по которому table1join присоединяется к table1
Старый 29.03.2019, 21:19   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 23.10.2012
Цитата:
Сообщение от mikki_messer Посмотреть сообщение
Тот запрос, что вы прислали не работает, т.к. не указано условие, по которому table1join присоединяется к table1
Добрый вечер.
Запрос имеет исключительно демонстративный характер - описывает суть проблемы.
В комментариях к нему сказано, что добавление where условия на результат не влияет.
Можете сами проверить where table1.RecId == table1join.RecId, например.
Старый 29.03.2019, 23:25   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Смущает table1.Field1 = [123];

Я бы сделал

container con = [123];
table1.Field1 = con;
Старый 30.03.2019, 10:30   #5  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А что за окружение (версия DAX, SQL)?
X++:
static void Job4(Args _args)
{
    Table2 table2, table2join;
    ;

    ttsBegin;
    
    select firstOnly forUpdate table2
        join TableId from table2join;
    
    table2.Field1   = [123];
    table2.update();
    
    ttsCommit;
}
В DAX2009 5.0.1500.6491 с MS SQL 2008R2 не повторяется
Старый 30.03.2019, 21:10   #6  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 23.10.2012
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Смущает table1.Field1 = [123];

Я бы сделал

container con = [123];
table1.Field1 = con;
Так абсолютно аналогичная ситуация.
Проблема была выявлена в ходе копирования значения поля одного рекорда в другой.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
А что за окружение (версия DAX, SQL)?
X++:
static void Job4(Args _args)
{
    Table2 table2, table2join;
    ;

    ttsBegin;
    
    select firstOnly forUpdate table2
        join TableId from table2join;
    
    table2.Field1   = [123];
    table2.update();
    
    ttsCommit;
}
В DAX2009 5.0.1500.6491 с MS SQL 2008R2 не повторяется
Не воспроизводится? Интересно... Если запись выбираемая уже имеет присваиваемое значение, то разумеется ошибка не возникает. UPDATE на самом деле до БД доходит?
В моем случае идентичная среда: DAX2009 5.0.1500.6491 и Microsoft SQL Server 2008 R2(SP3).

Последний раз редактировалось Товарищ ♂uatr; 30.03.2019 в 21:14.
Старый 31.03.2019, 01:15   #7  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
Так абсолютно аналогичная ситуация.
Не соглашусь. Здесь нельзя полагаться на логику.
table1.Field1 += [123] уже может работать не так как table1.Field1 = [123]

В любом случае что с присвоением контейнера что присвоением .NET типов сразу надо пробовать через обьявление переменной при возникновении ошибок. Как там работает интерпретатор только одному ему известно. Понятно что по логике раз без join работает то типа можно но там тоже человеки на сях писали и могли отчебучить все что угодно.
Старый 31.03.2019, 09:09   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
ТЕсли запись выбираемая уже имеет присваиваемое значение, то разумеется ошибка не возникает. UPDATE на самом деле до БД доходит?
В первом варианте значение уже было. Для чистоты эксперимента в начале сделал
X++:
delete_from table2;
table2.clear();
table2.insert();
table2.insert();
table2.insert();
А потом уже update. При этом insert пробовал и один и несколько, результат тот же - ошибки нет.
Профайлер MS SQL все команды поймал, только что именно пришло не знаю - там были плейсхолдеры (@P1...), а не литералы.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибки в отчете о статусе БД Poleax DAX: Администрирование 4 20.08.2007 14:39
Denis Fedotenko: Новые поля в складских проводках Blog bot DAX: База знаний и проекты 10 24.05.2007 11:57
Ошибка: Недопустимая комбинация поля / поля ссылки kurekov DAX: Программирование 1 21.02.2007 16:36
KR3: Ошибка или crash при попытке получить tooltip поля belugin DAX: Программирование 3 01.02.2007 13:27
Ошибка при обновлении перекресных ссылок msav DAX: Администрирование 3 02.04.2004 13:49
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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