Текущее время: Сб, окт 21 2017, 05:03

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


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


ВНИМАНИЕ!

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



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

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


Вот небольшой список интересных особенностей:
  • Если кому-то хотелось делать пометки в коде для доработок (TODO), то можно извратиться так:
    В коде добавить несуществующую прагму, например:
    ##TODO'Переписать_этот_ужасный_код'
    И теперь когда вы будете проверять синтаксис (через CTRL+F2) – будет выведено предупреждение с этим текстом и можно даже будет перейти к строчке с этим кодом.
  • Чтобы вставить шаблон метода/функции, в редакторе кода выбираете метод/функцию через CTRL+<пробел> (можно даже НЕ дописать его имя до конца), а затем нажать SHIFT+ENTER и автоматически вставится метод, его параметры и даже комментарии к ним.
  • Если меняется глобальный интерфейс класса (добавляются/удаляются/переименовываются глобальные методы или у них меняются параметры) то все программы, использующие этот класс перегенерируются.
    Если же менять только внутреннюю логику класса (приватные, защищённые данные/методы, код публичных методов) то перегенерации всех программ, использующих этот класс не происходит.
  • Чтобы добавить локального друга к глобальном классу нужно в SE24 в меню "Перейти к"->"Локальные определения/реализации"->"Релевантные для классов лок. определения" написать такой код:
    CLASS lcl_test DEFINITION DEFERRED.
    CLASS zcl_global DEFINITION LOCAL FRIENDS lcl_test.
  • При таком коде:
    Код:
      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.


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

    Т.е., * выбирает НЕ ВСЕ поля из MKPF, а только необходимые…
  • From Release 7.0, EhP2 можно в условиях делать простые математические выражения с внутренними функциями:
    Код:
      IF sy-tabix + 1 = 3 + lines( lt_tab ).
      ENDIF.
  • Так же можно создавать цепочки вызовов методов:
    Код:
    i1 = lcl=>mref( 1 + 2 )->imref( in = 3 )->imi( 4 ).
    CREATE OBJECT o EXPORTING in = lcl=>mref( 1 )->imi( 2 ).
  • Можно создавать вторичные ключи ко внутренним таблицам:
    Код:
        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:
    Код:
    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 = ` ` ).
  • Можно копировать одну таблицу в другую, если у них первые компоненты одинаковые:
    Код:
      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
Сообщения: 171
Пол: Мужской
UKY писал(а):
Ребята, давайте делиться интересными фичами абапа.
[*]Чтобы вставить шаблон метода/функции, в редакторе кода выбираете метод/функцию через CTRL+<пробел> (можно даже НЕ дописать его имя до конца), а затем нажать SHIFT+ENTER и автоматически вставится метод, его параметры и даже комментарии к ним.

необязательные параметры не подставляются, а жаль. Было бы неплохо видеть полный список

UPD: странно, попробовал grid->set_table_for_first_display, сработало нормально, выдало и необязательные параметры.
А на другом методе выдало такое, хотя у него параметр statement
Код:
      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
Сообщения: 137
Чтобы получить текст селекционного экрана можно делать так:

Код:
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
Сообщения: 171
Пол: Мужской
Недавно обнаружил забавную штуку.
Нужно правильно вставить запись в сортированную таблицу

Код:
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
Сообщения: 137
Можно узнать количество записей или есть ли запись в БД без использования промежуточной переменной:
Код:
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
Сообщения: 2436
Пол: Мужской
Также вариант чреват членовредительством со стороны базиса, которым будут прилетать плюхи за плохую производительность системы. Один этот запрос конечно заметно производительность не просадит, но если такой стиль у вас используется повсеместно - то ожидайте

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


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

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

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

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


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

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



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

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


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

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 137
Crystal_Ra писал(а):
Ваш вариант грешит большим временем работы , так как БД придется посчитать все записи прочитав весь индекс(если таковой есть, или его создать) - не факт что их мало.

А как тогда узнать кол-во записей, не прочитав индекс или таблицу? ;)

ArmAnn писал:
Также вариант чреват членовредительством со стороны базиса, которым будут прилетать плюхи за плохую производительность системы.

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

NeMurometz писал(а):
Для есть ли запись в БД
Код:
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
Сообщения: 775
Откуда: Москва
Пол: Мужской
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки.
В качестве элементарного примера:
Код:
  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
Сообщения: 2436
Пол: Мужской
nicky555 писал(а):
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки.
Боюсь, такие вещи могут меняться от версии к версии, и при апгрейде можно получить массу эмоций от таких трюков

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


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

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

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


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

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

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


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

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


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

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


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

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