SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Синтаксис SQL в ABAP


Goto page 1, 2  Next
 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Mon May 12, 2008 4:07 pm    Post subject: Синтаксис SQL в ABAP Reply with quote

Как правильно оформляются SQL выражения в ABAP?
Для примера: мне нужно такую SQL конструкцию прекрасно работающую в SQL Studio при SAP реализовать в ABAP - "SELECT MAX(NUM(NUMBERSF)) FROM YNUNB". С "Max" вроде разобрался. Ставлю пробелы "MAX( NUMBERSF )" и всё работает. А вот как вставить функцию NUM? Вылазит ошибка - "NUM(NUMBERSF) - нет такого столбца". Тут толи игра с пробелами, толи ещё как...

И ещё, как преобразовать integer в char? Считал char из таблицы, перевёл в integer, провёл математические преобразования. Теперь надо обратно в char перевести. Искал по англоязычным форумам, подходящего не на шёл. По идее ФМ должен быть на этот случай, но среди списка тоже не наткнулся на подходящий.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon May 12, 2008 4:22 pm    Post subject: Reply with quote

В sql выражениях основная ошибка в расположении скобок и пробелов между ними и полями

Code:
    SELECT MAX( BELNR ) FROM BKPF INTO WA_BKPF-BELNR.



Code:
DATA: c(20), i TYPE i.
i = 12345.
c = i.
WRITE: / c.

* или с форматированием
WRITE i TO c.
WRITE: / c.
Back to top
View user's profile Send private message Blog Visit poster's website
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Mon May 12, 2008 4:44 pm    Post subject: Reply with quote

А как теперь реализовать MAX( NUM(BELRN) )? NUM(BELRN) воспринимается как имя столбца, а не как преобразование типа данных из char в num столбца BELRN. Ставлю пробелы MAX( NUM( BELRN ) ), тоже не помогает. Вот в чём проблема.

С преобразованием попробую сейчас.
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Mon May 12, 2008 4:50 pm    Post subject: Reply with quote

Dmitry wrote:
А как теперь реализовать 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 числового значения, иначе получите дамп
Back to top
View user's profile Send private message Blog
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Mon May 12, 2008 4:58 pm    Post subject: Reply with quote

Вот как SAP указать, что это поле цифровое, а не текстовое? В таблице то оно прописано как char. Пример: в таблице две записи для BELRN: "2" и "10". При select MAX( BELRN ) выдаётся максимальным звачение "2". А при select MAX(NUM(BELRN)) в SQL Studio максимальное значение уже 10.
Back to top
View user's profile Send private message
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Mon May 12, 2008 5:10 pm    Post subject: Reply with quote

А вообще в ABAP в SQL запросах можно использовать стандартные и собственноручно написанные функции? Может их вызывать можно как?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon May 12, 2008 5:17 pm    Post subject: Reply with quote

Можно в исключительных случаях использовать Native SQL.
Поищите по слову Native.

Что касается поля belnr. Если оно создано на основе домена BELNR, то при вводе с экрана отработает ФМ CONVERSION_EXIT_ALPHA_INPUT,
дополняющее его лидирующими нулями. Поэтому в базе номера будут храниться в виде
0000000002
0000000010

и MAX( BELNR ) отработает правильно.
Back to top
View user's profile Send private message Blog Visit poster's website
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Mon May 12, 2008 5:31 pm    Post subject: Reply with quote

Хорошо, посмотрю. belnr - это просто, для примера. Проблема в том, как на лету CHAR-поле в SQL запросе преобразовать в integer, не залезая в CONVERSION_EXIT_ALPHA_INPUT и т.д. В самом SQL это возможно. SQL Studio из таблицы в базе SAP это делает без проблем. Вот только как это в ABAP вставить?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon May 12, 2008 5:39 pm    Post subject: Reply with quote

Dmitry wrote:
В самом SQL это возможно. SQL Studio из таблицы в базе SAP это делает без проблем. Вот только как это в ABAP вставить?


Наверно никак. Только через преобразования на ABAP.
Например:

Code:
TABLES: bkpf, *bkpf.
SELECT belnr FROM BKPF INTO bkpf-belnr.

  call function 'CONVERSION_EXIT_ALPHA_INPUT'
       exporting
            INPUT   = bkpf-belnr
      importing
           OUTPUT  = bkpf-belnr
       exceptions
            others  = 1.

  IF bkpf-belnr > *bkpf-belnr.
    *bkpf-belnr = bkpf-belnr.
  ENDIF.
ENDSELECT.
WRITE: / 'Max value = ', *bkpf-belnr.


1) Только следует учитывать, что CONVERSION_EXIT_ALPHA_INPUT
не добавляет лидирующие нули, если в строке присутствует хотя бы один нецифровой символ.
2) Для повышения производительности в вышеприведенном примере лучше использовать получение данных пакетом.
Back to top
View user's profile Send private message Blog Visit poster's website
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Wed May 14, 2008 11:07 am    Post subject: Reply with quote

Спасибо! Попробовал двумя вариантами, вышеописаным и ещё одним, найденным на форуме. Переделал под себя. Работают оба. Вот код второго:
Считывание с таблицы значений строкового типа, преобразование в числовой и поиск максимального.
Code:

TABLES: MYTABLE, *MYTABLE.
SELECT MYCOLUMN FROM MYTABLE INTO input_string.

CATCH SYSTEM-EXCEPTIONS
arithmetic_errors = 1
conversion_errors = 2.
TRANSLATE input_string USING ', '.
CONDENSE input_string NO-GAPS.
output_integer = input_string.
ENDCATCH.

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.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Wed May 14, 2008 11:42 am    Post subject: Reply with quote

Quote:
И напоследок: есть ли стандартные функции проверки вводимых значений в поля ввода на форме? Или надо считывать, определять длину и вручную посимвольно проверять? Интересует проверка на ввод только цифр 0...9.


Если подобрать соотвествующий элемент данных, то на экране не даст ввести неправильное значение. Или использовать собственный Conv. Exit (свойство поля в Screen Painter)

Вручную так можно проверить.
Code:
IF number CO '0987654321'.
*number содержит только цифры.
ENDIF.
Back to top
View user's profile Send private message Blog Visit poster's website
Alex80
Старший специалист
Старший специалист


Age: 44
Joined: 24 Jan 2008
Posts: 129

PostPosted: Wed May 14, 2008 1:08 pm    Post subject: Reply with quote

А так нельзя?
Code:
DATA gv_field TYPE YNUNB-NUMBERSF.

EXEC SQL.
  SELECT MAX(TO_NUMBER(NUMBERSF)) FROM YNUNB INTO :gv_field
ENDEXEC.
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed May 14, 2008 1:31 pm    Post subject: Reply with quote

Alex80 wrote:
А так нельзя?
Code:
DATA gv_field TYPE YNUNB-NUMBERSF.

EXEC SQL.
  SELECT MAX(TO_NUMBER(NUMBERSF)) FROM YNUNB INTO :gv_field
ENDEXEC.

боюсь тогда нужно заготавливать разные варианты для разных СУБД - в ms sql например насколько я помню вместо TO_NUMBER используется convert
Back to top
View user's profile Send private message Blog
Dmitry
Участник
Участник



Joined: 12 May 2008
Posts: 14

PostPosted: Wed May 14, 2008 2:58 pm    Post subject: Reply with quote

Хм... А работает однако. Функция эта ко всем БД подходит? На MaxDB работает, в MS SQL не проверял пока. Хотя что самое интересное, в help по MaxDB о ней кажется ни слова. Для MS SQL - Convert(int, "значение из столбца"), для MaxDB NUM("значение из столбца"). Вчера специально на обеих базах проверял, работают каждая в своей БД. Но ни та ни другая в самом ABAP не сработали(В Enterprise Manager
(MS SQL) и SQL Studio(MaxDB)), а вот в ABAP только TO_NUMBER... Хотя вставляю всё в тот же Native SQL. Надо это обдумать Smile
По второму вопросу на проверку 0...9 по Conv. Exit: есть у кого список функций? Я пока нашёл только CONVERSION_EXIT_ALPHA_OUTPUT. Сам шаблон: CONVERSION_EXIT_ <name> _OUTPUT. При создании самописной функции сразу спрашивает ключ разработчика. Думаю или уже не мучиться и просто программно прописать проверку на вводимые значения.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Wed May 14, 2008 3:05 pm    Post subject: Reply with quote

Dmitry wrote:
Сам шаблон: CONVERSION_EXIT_ <name> _OUTPUT. При создании самописной функции сразу спрашивает ключ разработчика. Думаю или уже не мучиться и просто программно прописать проверку на вводимые значения.


На Z назвали CONVERSION_EXIT_Z<name> _OUTPUT ?
Back to top
View user's profile Send private message Blog Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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.