SAPфорум.RU https://sapboard.ru/forum/ |
|
Полезные трюки ABAP https://sapboard.ru/forum/viewtopic.php?f=13&t=87197 |
Страница 1 из 8 |
Автор: | UKY [ Пт, июн 20 2014, 10:15 ] |
Заголовок сообщения: | Полезные трюки ABAP |
Ребята, давайте делиться интересными фичами абапа. Вот небольшой список интересных особенностей:
Надеюсь, получится полезная тема |
Автор: | Orgazm [ Пт, июн 20 2014, 10:48 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
UKY написал(а): Ребята, давайте делиться интересными фичами абапа. [*]Чтобы вставить шаблон метода/функции, в редакторе кода выбираете метод/функцию через CTRL+<пробел> (можно даже НЕ дописать его имя до конца), а затем нажать SHIFT+ENTER и автоматически вставится метод, его параметры и даже комментарии к ним. необязательные параметры не подставляются, а жаль. Было бы неплохо видеть полный список UPD: странно, попробовал grid->set_table_for_first_display, сработало нормально, выдало и необязательные параметры. А на другом методе выдало такое, хотя у него параметр statement Code: lo_statement->execute_update( ).
* catch cx_sql_exception. " Exception Class for SQL Error * catch cx_parameter_invalid. " Superclass for Parameter Error call method lo_statement->execute_update exporting statement = lv_sql_insert. |
Автор: | UKY [ Вт, июн 24 2014, 03:02 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Чтобы получить текст селекционного экрана можно делать так: Code: SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE aaa.
SELECT-OPTIONS: s_carrid FOR w_carrid. SELECTION-SCREEN: END OF BLOCK blk1. * INITIALIZATION. * Description for the parameter IF sy-uname = 'TEST'. %_s_carrid_%_app_%-text = 'Carrier ID'. ELSE. %_s_carrid_%_app_%-text = 'Flight ID'. ENDIF. |
Автор: | Orgazm [ Ср, июн 25 2014, 11:53 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Недавно обнаружил забавную штуку. Нужно правильно вставить запись в сортированную таблицу Code: read table itab with key f1 = wa-f1 BINARY SEARCH. save_tabix = sy-tabix. if save_tabix <> 0. INSERT ... index save_tabix endif. в данном случае READ возвращает то место где она ДОЛЖНА БЫЛА БЫ БЫТЬ, и вставка происходит в необходимое место. Не знаю насколько это необычно, но показалось интересным. |
Автор: | Человек [ Пт, июн 27 2014, 18:33 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Если в свободной от данных области ALV Gridа, зажав предварительно cntl+shift, клацнуть два раза правой кнопкой мыши - то открывается полезная утилита для этого самого ALV Grid а |
Автор: | UKY [ Ср, июл 16 2014, 05:36 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Можно узнать количество записей или есть ли запись в БД без использования промежуточной переменной: Code: SELECT COUNT(*) FROM mara WHERE matnr = '000000001000000000'. После этого кода SY-SUBRC покажет есть ли запись, а в SY-DBCNT будет количество найденных записей. |
Автор: | Crystal_Ra [ Ср, июл 16 2014, 08:37 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Ваш вариант грешит большим временем работы , так как БД придется посчитать все записи прочитав весь индекс(если таковой есть, или его создать) - не факт что их мало. Он не подойдет для считывания существования записи. |
Автор: | ArmAnn [ Ср, июл 16 2014, 15:48 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Также вариант чреват членовредительством со стороны базиса, которым будут прилетать плюхи за плохую производительность системы. Один этот запрос конечно заметно производительность не просадит, но если такой стиль у вас используется повсеместно - то ожидайте |
Автор: | NeMurometz [ Чт, июл 17 2014, 08:21 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
UKY написал(а): Можно узнать количество записей или есть ли запись в БД без использования промежуточной переменной: Для есть ли запись в БД Code: SELECT SINGLE mandt
INTO sy-mandt FROM mara WHERE matnr = '000000001000000000'. |
Автор: | LKU [ Чт, июл 17 2014, 16:48 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Crystal_Ra написал(а): Ваш вариант грешит большим временем работы , так как БД придется посчитать все записи прочитав весь индекс(если таковой есть, или его создать) - не факт что их мало. Он не подойдет для считывания существования записи. Вот интересно: в общем случае считать count(*) - не самый быстрый способ проверить наличие записи. Но в данном конкретном примере, matnr - единственное поле первичного ключа таблицы, больше одного значения с кодом товара в mara быть не может. Неужели и в этом случае конструкция select count(*) медленнее select mandt into sy-mandt? |
Автор: | UKY [ Пт, июл 18 2014, 04:06 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Crystal_Ra написал(а): Ваш вариант грешит большим временем работы , так как БД придется посчитать все записи прочитав весь индекс(если таковой есть, или его создать) - не факт что их мало. А как тогда узнать кол-во записей, не прочитав индекс или таблицу? ArmAnn написал: Также вариант чреват членовредительством со стороны базиса, которым будут прилетать плюхи за плохую производительность системы. Не вижу ничего в этом страшного, за исключением игнорирования SAP-буфера для буферных таблиц. Особенно если делать условие по ключевым или индексным полям. Но, в циклах, конечно, так не стоит делать NeMurometz написал(а): Для есть ли запись в БД Code: SELECT SINGLE mandt INTO sy-mandt FROM mara WHERE matnr = '000000001000000000'. О! Этот подход просто для определения есть ли запись в БД мне определённо больше нравится, т.к. есть LIMIT Спасибо! LKU написал: Вот интересно: в общем случае считать count(*) - не самый быстрый способ проверить наличие записи. Но в данном конкретном примере, matnr - единственное поле первичного ключа таблицы, больше одного значения с кодом товара в mara быть не может. Неужели и в этом случае конструкция select count(*) медленнее select mandt into sy-mandt? Да даже быстрее будет! Ведь не нужно будет переносить значение MARA-MANDT в переменную SY-MANDT! %) Предлагаю противникам COUNT(*) сделать тесты и сравнить, если у кого есть время |
Автор: | nicky555 [ Пт, июл 18 2014, 07:38 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки. В качестве элементарного примера: Code: TYPES: BEGIN OF ty_bkpf_selection,
bukrs TYPE bkpf-bukrs, belnr TYPE bkpf-belnr, gjahr TYPE bkpf-gjahr, * + поля, котрые 'добираем' из BKPF END OF ty_bkpf_selection. DATA: lt_bkpf TYPE SORTED TABLE OF ty_bkpf_selection WITH UNIQUE KEY bukrs belnr gjahr. * Здесь выбираем ключ BKPF из произвольной таблицы SELECT bukrs belnr gjahr INTO TABLE lt_bkpf FROM bsid WHERE bukrs IN so_bukrs AND kunnr IN so_kunnr. * Используем таблицу как вход + выход для выборки SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bkpf FROM bkpf FOR ALL ENTRIES IN lt_bkpf WHERE bukrs = lt_bkpf-bukrs AND belnr = lt_bkpf-belnr AND gjahr = lt_bkpf-gjahr. |
Автор: | ArmAnn [ Пт, июл 18 2014, 08:48 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
nicky555 написал: Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки. Боюсь, такие вещи могут меняться от версии к версии, и при апгрейде можно получить массу эмоций от таких трюков
|
Автор: | troy [ Пт, июл 18 2014, 10:37 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
ArmAnn написал: Боюсь, такие вещи могут меняться от версии к версии, и при апгрейде можно получить массу эмоций от таких трюков Давно использую данный метод, для удобства чтения кода и сокращения кол-ва переменных )) Не думаю, что SAP это когда-либо поменяет, т.к. это серьезно нарушит обратную совместимость. |
Автор: | troy [ Пт, июл 18 2014, 10:44 ] |
Заголовок сообщения: | Re: Полезные трюки ABAP |
UKY написал(а): Да даже быстрее будет! Ведь не нужно будет переносить значение MARA-MANDT в переменную SY-MANDT! %) Предлагаю противникам COUNT(*) сделать тесты и сравнить, если у кого есть время Эта тема не раз уже обсуждалась. Если вкратце, для проверки наличия записи, SINGLE MANDT быстрее всего, COUNT(*) UP TO 1 ROWS отстает на пару мсек ))) Хотя допускаю, что на разных БД и серваках может быть и наоборот. |
Страница 1 из 8 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |