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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.10.2011, 14:28   #1  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
update_recordset и конкатенация строк
Всем привет!

Столкнулся с такой проблемой:

X++:
//Работает
update_recordset myTable_1
            setting ErrorTxt = "AAAAA "  + myTable_1.Field_str  /*+ " BBB "*/;
       

//НЕ Работает
update_recordset myTable_1
            setting ErrorTxt = "AAAAA "  + myTable_1.Field_str  + " BBB ";
Выдается ошибка: Описание ошибки SQL: [Microsoft][SQL Native Client][SQL Server]Ошибка при преобразовании типа данных nvarchar к bigint.

Ax2009 kernel 5.0.1500.2116 клиент тот же.
БД SQL 2008

Текст который указывается после поля таблицы, в SQL Profiler воспринимается как bigint.
Кто нибудь сталкивался с подобной проблемой?
За это сообщение автора поблагодарили: lev (5), S.Kuskov (5).
Старый 18.10.2011, 14:37   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
с такой проблемой не сталкивался... но мне кажется в таком виде делать присвоение, как то не красиво что ль... лучше заполнить переменную нужным значением заранее, и потом её присвоить.
Что то, типа:
X++:
ErrorTxt   errorTxt;
;

errorTxt = "AAAAA "  + myTable_1.Field_str  + " BBB ";

update_recordset myTable_1
            setting ErrorTxt = errorTxt;
в таком виде нормально отработает?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2011, 14:40   #3  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
2 lev: тк update_recordset массово обновляет строки, а топикстартеру надо обновить значение одного поля на основании другого, то предложенный вами способ не пойдет
Старый 18.10.2011, 14:41   #4  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
А если вам надо обновить пол миллиарда строк в таблице?

И переменная эта для каждой строки своя!
Старый 18.10.2011, 14:45   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ice Посмотреть сообщение
2 lev: тк update_recordset массово обновляет строки, а топикстартеру надо обновить значение одного поля на основании другого, то предложенный вами способ не пойдет
ааа, да недоглядел название таблицы, сорри
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2011, 15:02   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А если всё выражение или его часть взять в скобки?
Старый 18.10.2011, 15:09   #7  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Да все так же.
P.S. Так не хочется делать циклы.
Старый 18.10.2011, 15:10   #8  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Попробуйте использовать strfmt("AAAAA %1 BBB ", myTable_1.Field_str), возможно поможет
__________________
С уважением,
Вячеслав
Старый 18.10.2011, 15:13   #9  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от pitersky Посмотреть сообщение
Попробуйте использовать strfmt("AAAAA %1 BBB ", myTable_1.Field_str), возможно поможет
в sql нет такой функции
Старый 18.10.2011, 15:13   #10  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Пробовал, компилятор ругается.
Старый 18.10.2011, 15:13   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
а если выполнить этот апдейт в самом SQL в таком виде, тоже обругается?

Я клоню к тому, что может сформировать текст запроса в аксапте и отправить его на исполнение через Statement.executeUpdate(sqlTxt)?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2011, 15:15   #12  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от lev Посмотреть сообщение
а если выполнить этот апдейт в самом SQL в таком виде, тоже обругается?

Я клоню к тому, что может сформировать текст запроса в аксапте и отправить его на исполнение через Statement.executeUpdate(sqlTxt)?
зачем такие сложности, можно в менеджментстудио
Старый 18.10.2011, 15:16   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от pitersky Посмотреть сообщение
Попробуйте использовать strfmt("AAAAA %1 BBB ", myTable_1.Field_str), возможно поможет
Нет такое в update_recordset делать нельзя. Групповая операция выполняется на SQL сервере, а strfmt это функция приложения аксапты.

Цитата:
Сообщение от Dreadlock Посмотреть сообщение
P.S. Так не хочется делать циклы.
Если условия позволяют, то обновляйте в два этапа
сначала
X++:
update_recordset myTable_1
            setting ErrorTxt = "AAAAA "  + myTable_1.Field_str;
а потом
X++:
update_recordset myTable_1
            setting ErrorTxt = myTable_1.Field_str  + " BBB ";
Старый 18.10.2011, 15:18   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ice Посмотреть сообщение
зачем такие сложности, можно в менеджментстудио
Не очень понял про сложности...

Человеку нужно из аксапты обновить много записей в таблице. использовать существующий синтаксис аксапты не получается из-за бага, поэтому я предлагаю обойти существующий синтаксис и отправить выполнение запроса на SQL.

Причем тут менеджмент студио? Не будет же человек каждый раз в ручную запускать этот запрос из менеджмент студио?

Для проверки конечно же надо использовать её (если Вы про это)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2011, 15:20   #15  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если условия позволяют, то обновляйте в два этапа
сначала
X++:
update_recordset myTable_1
            setting ErrorTxt = "AAAAA "  + myTable_1.Field_str;
а потом
X++:
update_recordset myTable_1
            setting ErrorTxt = myTable_1.Field_str  + " BBB ";
кстати да, попробуйте в два этапа
только на втором этапе надо будет прибавлять к ErrorTxt, а не к Field_str
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 18.10.2011, 15:22   #16  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от lev Посмотреть сообщение
Не очень понял про сложности...

Человеку нужно из аксапты обновить много записей в таблице. использовать существующий синтаксис аксапты не получается из-за бага, поэтому я предлагаю обойти существующий синтаксис и отправить выполнение запроса на SQL.

Причем тут менеджмент студио? Не будет же человек каждый раз в ручную запускать этот запрос из менеджмент студио?

Для проверки конечно же надо использовать её (если Вы про это)
по простоте душевной, я подумал что операция апдейта в полмиллиарда записей разовая и ее лучше сделать, чтоб обойти все сложности, напрямую в менеджментстудио. если же эта операция частая, то чтото не правильно в архитектуре

Последний раз редактировалось ice; 18.10.2011 в 15:25.
Старый 18.10.2011, 15:31   #17  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
В общем я бы пошел по следующему пути (если бизнес логика из метода update() таблицы не нужна) :
1. Если нужно разово выполнить обновление какого то поля, во всей таблице, то выполнил был это обновление напрямую в SQL.
2. Если это какая то периодическая операция, которая раз в месяц (неделю, квартал, год) должна выполняться кем то из аксапты, то сформировал бы SQL запрос и выполнил его напрямую в SQL из аксапты (как это сделать я писал в предыдущих сообщениях).

P.S. если конечно сам SQL нормально переваривает такого вида запрос
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 18.10.2011 в 15:49. Причина: добавил P.S.
Старый 18.10.2011, 15:35   #18  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
X++:
update_recordset myTable_1
            setting ErrorTxt = myTable_1.Field_str  + " BBB ";
В общем задача такая, в поле ошибки надо записать последовательно несколько ошибок, т.е. потом, после первого обновления строк пойдет:
X++:
update_recordset myTable_1
            setting ErrorTxt = myTable_1.ErrorTxt + "CCC" + myTable_1.Field10_str  + " DDD ";
Цитата:
зачем такие сложности, можно в менеджментстудио
Так от этого и хотим уйти. Был код который из промежуточной базы читал последовательно строки, делал кучу проверок и качал в Ах данные. Оказалось медленно. Решили качать по блочно, 100000 и сразу весь массив обновлять. Все хорошо, только бага вылезла.
Хотелось бы избежать SQLStatement'ов и с Аксаптовой таблицей работать приятнее и проще.

З.Ы. Пол миллиарда как пример привел.
Старый 18.10.2011, 15:36   #19  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Цитата:
Сообщение от lev Посмотреть сообщение
В общем я бы пошел по следующему пути:
2. Если это какая то периодическая операция, которая раз в месяц (неделю, квартал, год) должна выполняться кем то из аксапты, то сформировал бы SQL запрос и выполнил его напрямую в SQL из аксапты (как это сделать я писал в предыдущих сообщениях).

P.S. если конечно сам SQL нормально переваривает такого вида запрос
Операция периодическая, пакетная, запускается раз в пол часа.
Старый 18.10.2011, 15:40   #20  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Dreadlock Посмотреть сообщение
Операция периодическая, пакетная, запускается раз в пол часа.
По хорошему сообщить бы в Майкрософт об этом баге...
Может они его исправят или хотя бы как то прокомментируют...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
update_recordset не работает с системными полями и таблицами? Alexx7 DAX: Программирование 42 19.10.2009 09:39
update_recordset и мемо-поля Lucky13 DAX: Программирование 5 28.08.2009 14:10
update_recordset. Бага или фича? Lucky13 DAX: Программирование 7 08.04.2009 17:33
Почему не отрабатывает update_recordset? breakpoint DAX: Программирование 17 25.06.2008 18:27
Вопрос по update_recordset cherv DAX: Программирование 5 14.07.2006 14:28
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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