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:41   #3  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
А если вам надо обновить пол миллиарда строк в таблице?

И переменная эта для каждой строки своя!
Старый 18.10.2011, 14:40   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
2 lev: тк update_recordset массово обновляет строки, а топикстартеру надо обновить значение одного поля на основании другого, то предложенный вами способ не пойдет
Старый 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,440 / 1775 (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:13   #8  
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   #9  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от lev Посмотреть сообщение
а если выполнить этот апдейт в самом SQL в таком виде, тоже обругается?

Я клоню к тому, что может сформировать текст запроса в аксапте и отправить его на исполнение через Statement.executeUpdate(sqlTxt)?
зачем такие сложности, можно в менеджментстудио
Старый 18.10.2011, 15:18   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ice Посмотреть сообщение
зачем такие сложности, можно в менеджментстудио
Не очень понял про сложности...

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

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

Для проверки конечно же надо использовать её (если Вы про это)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.10.2011, 15:16   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (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:20   #12  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 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:35   #13  
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:56   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Dreadlock Посмотреть сообщение
В общем задача такая, в поле ошибки надо записать последовательно несколько ошибок, т.е. потом, после первого обновления строк пойдет:
X++:
update_recordset myTable_1
            setting ErrorTxt = myTable_1.ErrorTxt + "CCC" + myTable_1.Field10_str  + " DDD ";
.
Экспериментальным путём удалось выполнить следующий код:
X++:
update_recordset myTable_1
            setting ErrorTxt = myTable_1.ErrorTxt + "CCC" + (myTable_1.Field10_str + " DDD ") + (myTable_1.Field11_str + " EEE ") + (myTable_1.Field12_str + " FFF");
и такой:
X++:
update_recordset myTable_1
            setting ErrorTxt = ("BBB " + myTable_1.ErrorTxt) + (" CCC " + myTable_1.Field10_str) + (" DDD " + myTable_1.Field11_str) + (" EEE " + myTable_1.Field12_str);

Последний раз редактировалось S.Kuskov; 18.10.2011 в 16:05.
За это сообщение автора поблагодарили: Logger (3), Dreadlock (1).
Старый 18.10.2011, 15:10   #15  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Попробуйте использовать strfmt("AAAAA %1 BBB ", myTable_1.Field_str), возможно поможет
__________________
С уважением,
Вячеслав
Старый 18.10.2011, 15:13   #16  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от pitersky Посмотреть сообщение
Попробуйте использовать strfmt("AAAAA %1 BBB ", myTable_1.Field_str), возможно поможет
в sql нет такой функции
Старый 18.10.2011, 15:13   #17  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Пробовал, компилятор ругается.
Старый 18.10.2011, 17:26   #18  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
а ведь потом кому-то все это разгребать
Старый 19.10.2011, 10:21   #19  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Сегодня обнаружил, что строки непонятным образом обрезаются.

Т.е. если апдэйтить поле фразой "Привет ААА, как дела?", при этом выполнить сделав это так:
X++:
update_recordset myTable
      setting myTable.myField_1 = (myTable.myField_1 + "Привет ") + (myTable.myField_2 + " , как дела?")
Получим примерно следующее: "ПриветААА,ка"

Будьте бдительны
За это сообщение автора поблагодарили: Veter (1).
Старый 19.10.2011, 15:56   #20  
Veter is offline
Veter
Участник
Аватар для Veter
 
18 / 35 (2) +++
Регистрация: 23.06.2011
Адрес: Минск
здравствуйте ,
проявилась зависимость образания строки от длинны поля :
(myTable.myField_2 + " , как дела?") - myField_2 + 1 символ
__________________
Все в порядке - идем ко дну! (к/ф Экипаж счастливой "Щуки")
 

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