Posted: Mon May 12, 2008 4:07 pm Post subject: Синтаксис SQL в ABAP
Как правильно оформляются SQL выражения в ABAP?
Для примера: мне нужно такую SQL конструкцию прекрасно работающую в SQL Studio при SAP реализовать в ABAP - "SELECT MAX(NUM(NUMBERSF)) FROM YNUNB". С "Max" вроде разобрался. Ставлю пробелы "MAX( NUMBERSF )" и всё работает. А вот как вставить функцию NUM? Вылазит ошибка - "NUM(NUMBERSF) - нет такого столбца". Тут толи игра с пробелами, толи ещё как...
И ещё, как преобразовать integer в char? Считал char из таблицы, перевёл в integer, провёл математические преобразования. Теперь надо обратно в char перевести. Искал по англоязычным форумам, подходящего не на шёл. По идее ФМ должен быть на этот случай, но среди списка тоже не наткнулся на подходящий.
А как теперь реализовать MAX( NUM(BELRN) )? NUM(BELRN) воспринимается как имя столбца, а не как преобразование типа данных из char в num столбца BELRN. Ставлю пробелы MAX( NUM( BELRN ) ), тоже не помогает. Вот в чём проблема.
А как теперь реализовать MAX( NUM(BELRN) )? NUM(BELRN) воспринимается как имя столбца, а не как преобразование типа данных из char в num столбца BELRN. Ставлю пробелы MAX( NUM( BELRN ) ), тоже не помогает. Вот в чём проблема.
На лету у вас не получится преобразовать, но это не проблема. Текстовое поле, в котором содержится число, САП без особых проблем воспринимает как цифровое, т.е. MAX( BELNR ) будет работать так как вы хотите.
И например случаи:
add 1 to itab-belnr.
itab-belnr = itab1-belnr - itab2-belnr.
также будут адекватно работать, естессно при наличии в полях belnr числового значения, иначе получите дамп
Вот как SAP указать, что это поле цифровое, а не текстовое? В таблице то оно прописано как char. Пример: в таблице две записи для BELRN: "2" и "10". При select MAX( BELRN ) выдаётся максимальным звачение "2". А при select MAX(NUM(BELRN)) в SQL Studio максимальное значение уже 10.
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Mon May 12, 2008 5:17 pm Post subject:
Можно в исключительных случаях использовать Native SQL.
Поищите по слову Native.
Что касается поля belnr. Если оно создано на основе домена BELNR, то при вводе с экрана отработает ФМ CONVERSION_EXIT_ALPHA_INPUT,
дополняющее его лидирующими нулями. Поэтому в базе номера будут храниться в виде
0000000002
0000000010
Хорошо, посмотрю. belnr - это просто, для примера. Проблема в том, как на лету CHAR-поле в SQL запросе преобразовать в integer, не залезая в CONVERSION_EXIT_ALPHA_INPUT и т.д. В самом SQL это возможно. SQL Studio из таблицы в базе SAP это делает без проблем. Вот только как это в ABAP вставить?
IF bkpf-belnr > *bkpf-belnr.
*bkpf-belnr = bkpf-belnr.
ENDIF.
ENDSELECT.
WRITE: / 'Max value = ', *bkpf-belnr.
1) Только следует учитывать, что CONVERSION_EXIT_ALPHA_INPUT
не добавляет лидирующие нули, если в строке присутствует хотя бы один нецифровой символ.
2) Для повышения производительности в вышеприведенном примере лучше использовать получение данных пакетом.
Спасибо! Попробовал двумя вариантами, вышеописаным и ещё одним, найденным на форуме. Переделал под себя. Работают оба. Вот код второго:
Считывание с таблицы значений строкового типа, преобразование в числовой и поиск максимального.
Code:
TABLES: MYTABLE, *MYTABLE.
SELECT MYCOLUMN FROM MYTABLE INTO input_string.
IF sy-subrc = 0.
IF output_integer > *MYTABLE-MYCOLUMN.
*MYTABLE-MYCOLUMN = output_integer.
ENDIF.
ELSE.
MESSAGE 'Not a number' TYPE 'E'.
ENDIF.
ENDSELECT.
В *MYTABLE-MYCOLUMN получаем то, что надо.
Какой из вариантов выбрать, даже и не знаю. Значения будут только как простые integer, т.е. никаких ".,-+". Первый вариант проще и кода меньше, но там вызов CONVERSION_EXIT_ALPHA_INPUT. Сильно ли влияет вызов ФМ на скорость обработки? Вобщем с вашей помощью сделал что хотел. И напоследок: есть ли стандартные функции проверки вводимых значений в поля ввода на форме? Или надо считывать, определять длину и вручную посимвольно проверять? Интересует проверка на ввод только цифр 0...9.
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Wed May 14, 2008 11:42 am Post subject:
Quote:
И напоследок: есть ли стандартные функции проверки вводимых значений в поля ввода на форме? Или надо считывать, определять длину и вручную посимвольно проверять? Интересует проверка на ввод только цифр 0...9.
Если подобрать соотвествующий элемент данных, то на экране не даст ввести неправильное значение. Или использовать собственный Conv. Exit (свойство поля в Screen Painter)
Вручную так можно проверить.
Code:
IF number CO '0987654321'.
*number содержит только цифры.
ENDIF.
Хм... А работает однако. Функция эта ко всем БД подходит? На MaxDB работает, в MS SQL не проверял пока. Хотя что самое интересное, в help по MaxDB о ней кажется ни слова. Для MS SQL - Convert(int, "значение из столбца"), для MaxDB NUM("значение из столбца"). Вчера специально на обеих базах проверял, работают каждая в своей БД. Но ни та ни другая в самом ABAP не сработали(В Enterprise Manager
(MS SQL) и SQL Studio(MaxDB)), а вот в ABAP только TO_NUMBER... Хотя вставляю всё в тот же Native SQL. Надо это обдумать
По второму вопросу на проверку 0...9 по Conv. Exit: есть у кого список функций? Я пока нашёл только CONVERSION_EXIT_ALPHA_OUTPUT. Сам шаблон: CONVERSION_EXIT_ <name> _OUTPUT. При создании самописной функции сразу спрашивает ключ разработчика. Думаю или уже не мучиться и просто программно прописать проверку на вводимые значения.
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Wed May 14, 2008 3:05 pm Post subject:
Dmitry wrote:
Сам шаблон: CONVERSION_EXIT_ <name> _OUTPUT. При создании самописной функции сразу спрашивает ключ разработчика. Думаю или уже не мучиться и просто программно прописать проверку на вводимые значения.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.