Текущее время: Вс, сен 23 2018, 14:59

Часовой пояс: UTC + 4 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Полезные трюки ABAP
СообщениеДобавлено: Пт, июн 20 2014, 11:15 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 148
Ребята, давайте делиться интересными фичами абапа.


Вот небольшой список интересных особенностей:
  • Если кому-то хотелось делать пометки в коде для доработок (TODO), то можно извратиться так:
    В коде добавить несуществующую прагму, например:
    ##TODO'Переписать_этот_ужасный_код'
    И теперь когда вы будете проверять синтаксис (через CTRL+F2) – будет выведено предупреждение с этим текстом и можно даже будет перейти к строчке с этим кодом.
  • Чтобы вставить шаблон метода/функции, в редакторе кода выбираете метод/функцию через CTRL+<пробел> (можно даже НЕ дописать его имя до конца), а затем нажать SHIFT+ENTER и автоматически вставится метод, его параметры и даже комментарии к ним.
  • Если меняется глобальный интерфейс класса (добавляются/удаляются/переименовываются глобальные методы или у них меняются параметры) то все программы, использующие этот класс перегенерируются.
    Если же менять только внутреннюю логику класса (приватные, защищённые данные/методы, код публичных методов) то перегенерации всех программ, использующих этот класс не происходит.
  • Чтобы добавить локального друга к глобальном классу нужно в SE24 в меню "Перейти к"->"Локальные определения/реализации"->"Релевантные для классов лок. определения" написать такой код:
    CLASS lcl_test DEFINITION DEFERRED.
    CLASS zcl_global DEFINITION LOCAL FRIENDS lcl_test.
  • При таком коде:
    Code:
      DATA:
        BEGIN OF lt_mkpf OCCURS 0,
          mblnr TYPE mkpf-mblnr,
          mjahr TYPE mkpf-mjahr,
          budat TYPE mkpf-budat,
        END OF lt_mkpf.

      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE lt_mkpf
        FROM mkpf.


    Получается такой запрос к БД:
    Code:
      SELECT "MBLNR", "MJAHR", "BUDAT"
      FROM "MKPF"
      WHERE "MANDT"=:A0

    Т.е., * выбирает НЕ ВСЕ поля из MKPF, а только необходимые…
  • From Release 7.0, EhP2 можно в условиях делать простые математические выражения с внутренними функциями:
    Code:
      IF sy-tabix + 1 = 3 + lines( lt_tab ).
      ENDIF.
  • Так же можно создавать цепочки вызовов методов:
    Code:
    i1 = lcl=>mref( 1 + 2 )->imref( in = 3 )->imi( 4 ).
    CREATE OBJECT o EXPORTING in = lcl=>mref( 1 )->imi( 2 ).
  • Можно создавать вторичные ключи ко внутренним таблицам:
    Code:
        DATA spfli_tab TYPE HASHED TABLE
                       OF spfli
                       WITH UNIQUE KEY primary_key
                         COMPONENTS carrid connid
                       WITH NON-UNIQUE SORTED KEY city_from_to
                         COMPONENTS cityfrom cityto
                       WITH NON-UNIQUE SORTED KEY city_to_from
                         COMPONENTS cityto cityfrom.
        LOOP AT spfli_tab ASSIGNING <spfli> USING KEY city_from_to.
          WRITE: / <spfli>-carrid,
                   <spfli>-connid,
                   <spfli>-cityfrom COLOR = 3,
                   <spfli>-cityto   COLOR = 3 INTENSIFIED off.
        ENDLOOP.
  • Есть встроенная функция concat_lines_of:
    Code:
    TYPES c80 TYPE c LENGTH 80.
    DATA: itab  TYPE TABLE OF c80,
          result TYPE string.

    APPEND 'ABAP'    TO itab.
    APPEND 'Objects' TO itab.

    result = concat_lines_of( table = itab sep = ` ` ).
  • Можно копировать одну таблицу в другую, если у них первые компоненты одинаковые:
    Code:
      TYPES:
        BEGIN OF ts_bkpf,
          belnr TYPE bkpf-belnr,
          gjahr TYPE bkpf-gjahr,
          bukrs TYPE bkpf-bukrs,
        END OF ts_bkpf,
        BEGIN OF ts_bseg,
          belnr TYPE bseg-belnr,
          gjahr TYPE bseg-gjahr,
          bukrs TYPE bseg-bukrs,
          buzei TYPE bseg-buzei,
        END OF ts_bseg.
      DATA:
        lt_bkpf TYPE STANDARD TABLE OF ts_bkpf,
        lt_bseg TYPE STANDARD TABLE OF ts_bseg.
      APPEND '123456789020132101001' TO lt_bseg.
      APPEND '123456789020132101002' TO lt_bseg.

      lt_bkpf[] = lt_bseg[].
      lt_bseg[] = lt_bkpf[].


    После этого в LT_BKPF будет
    № BELNR GJAHR BUKRS
    1 1234567890 2013 2101
    2 1234567890 2013 2101

    А в LT_BSEG будет
    № BELNR GJAHR BUKRS BUZEI
    1 1234567890 2013 2101
    2 1234567890 2013 2101
  • В SAP GUI 7.3 в редакторе появился "многострочный курсор".
    Например, если выделить несколько строк с ALT (ALT+мышкой выделить текст или SHIFT+ALT+<стрелка лево/право>, и потом <стрелка вверх/вниз>), а потом начать на клавиатуре набирать текст, то вместо выделенного текста по всем строчкам будет печататься новый текст.

Надеюсь, получится полезная тема :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июн 20 2014, 11:48 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 19 2012, 09:33
Сообщения: 174
Пол: Мужской
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.

_________________
crusty написал(а):
Логистика - понятие растяжимое


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вт, июн 24 2014, 04:02 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 148
Чтобы получить текст селекционного экрана можно делать так:

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.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Ср, июн 25 2014, 12:53 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 19 2012, 09:33
Сообщения: 174
Пол: Мужской
Недавно обнаружил забавную штуку.
Нужно правильно вставить запись в сортированную таблицу

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 возвращает то место где она ДОЛЖНА БЫЛА БЫ БЫТЬ, и вставка происходит в необходимое место.
Не знаю насколько это необычно, но показалось интересным.

_________________
crusty написал(а):
Логистика - понятие растяжимое


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июн 27 2014, 19:33 
Ассистент
Ассистент

Зарегистрирован:
Чт, июл 22 2010, 20:53
Сообщения: 34
Если в свободной от данных области ALV Gridа, зажав предварительно cntl+shift, клацнуть два раза правой кнопкой мыши - то открывается полезная утилита для этого самого ALV Grid а


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Ср, июл 16 2014, 06:36 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 148
Можно узнать количество записей или есть ли запись в БД без использования промежуточной переменной:
Code:
SELECT COUNT(*)
FROM mara
WHERE matnr = '000000001000000000'.

После этого кода SY-SUBRC покажет есть ли запись, а в SY-DBCNT будет количество найденных записей.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Ср, июл 16 2014, 09:37 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 29 2012, 17:47
Сообщения: 85
Ваш вариант грешит большим временем работы , так как БД придется посчитать все записи прочитав весь индекс(если таковой есть, или его создать) - не факт что их мало.
Он не подойдет для считывания существования записи.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Ср, июл 16 2014, 16:48 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 21:32
Сообщения: 2453
Пол: Мужской
Также вариант чреват членовредительством со стороны базиса, которым будут прилетать плюхи за плохую производительность системы. Один этот запрос конечно заметно производительность не просадит, но если такой стиль у вас используется повсеместно - то ожидайте

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, июл 17 2014, 09:21 
Специалист
Специалист

Зарегистрирован:
Ср, дек 22 2010, 20:49
Сообщения: 108
UKY написал(а):
Можно узнать количество записей или есть ли запись в БД без использования промежуточной переменной:

Для есть ли запись в БД
Code:
SELECT SINGLE mandt
INTO sy-mandt
FROM mara
WHERE matnr = '000000001000000000'.

_________________
Человек готов работать 24 часа в сутки, лишь бы ничего не делать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, июл 17 2014, 17:48 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 14:35
Сообщения: 4419
Откуда: Москва
Crystal_Ra написал(а):
Ваш вариант грешит большим временем работы , так как БД придется посчитать все записи прочитав весь индекс(если таковой есть, или его создать) - не факт что их мало.
Он не подойдет для считывания существования записи.



Вот интересно: в общем случае считать count(*) - не самый быстрый способ проверить наличие записи.
Но в данном конкретном примере, matnr - единственное поле первичного ключа таблицы, больше одного значения с кодом товара в mara быть не может.
Неужели и в этом случае конструкция select count(*) медленнее select mandt into sy-mandt?

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 05:06 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 148
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(*) сделать тесты и сравнить, если у кого есть время ;)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 08:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 08:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки.
В качестве элементарного примера:
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.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 09:48 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 21:32
Сообщения: 2453
Пол: Мужской
nicky555 написал:
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки.
Боюсь, такие вещи могут меняться от версии к версии, и при апгрейде можно получить массу эмоций от таких трюков

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 11:37 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
ArmAnn написал:
Боюсь, такие вещи могут меняться от версии к версии, и при апгрейде можно получить массу эмоций от таких трюков

Давно использую данный метод, для удобства чтения кода и сокращения кол-ва переменных ))
Не думаю, что SAP это когда-либо поменяет, т.к. это серьезно нарушит обратную совместимость.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 11:44 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1402
UKY написал(а):
Да даже быстрее будет! Ведь не нужно будет переносить значение MARA-MANDT в переменную SY-MANDT! %) Предлагаю противникам COUNT(*) сделать тесты и сравнить, если у кого есть время ;)

Эта тема не раз уже обсуждалась. Если вкратце, для проверки наличия записи, SINGLE MANDT быстрее всего, COUNT(*) UP TO 1 ROWS отстает на пару мсек ))) Хотя допускаю, что на разных БД и серваках может быть и наоборот.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB