SAPфорум.RU
https://sapboard.ru/forum/

Полезные трюки ABAP
https://sapboard.ru/forum/viewtopic.php?f=13&t=87197
Страница 6 из 6

Автор:  Kuranov.Dmitry [ Ср, сен 06 2017, 15:09 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

LAT написал(а):
Я имел в виду проверить "обернется в строковый литерал уже маленькими", а не работу PrettyPrinter.

хмм. действительно, макрос переводит в верхний регистр. Не знал.

Автор:  DKiyanov [ Пн, окт 23 2017, 18:04 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

новый синтаксис OPEN SQL использование COALESCE и CASE в комбинации
Code:
  SELECT
     COALESCE( ( CASE vbrk~fksto WHEN 'X' THEN 'X' END ), ( CASE vbrk~sfakn WHEN ' ' THEN ' ' ELSE 'S' END ) ) AS stor " X - сторнирован; S - сторнирующий
  FROM vbrk

т.е удалось проанализировать два поля и вывести один результат

Автор:  SAPer [ Чт, июл 12 2018, 13:30 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

Очень люблю использовать такую конструкцию в коде. Она позволят избавится от грамоздких и многократно вложенных if.
Code:
do 1 times.
 
  check a = b.

  check n = m.

  check x = y.

  do something here.

enddo.

Автор:  Rizor [ Чт, июл 12 2018, 14:32 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

SAPer написал:
Очень люблю использовать такую конструкцию в коде. Она позволят избавится от многократно вложенных if.
Code:
do 1 times.
 
  check a = b.

  check n = m.

  check x = y.

  do something here.

enddo.


По мне тут на 80% звоночек, что этот кусок кода стоит обернуть в отдельный метод со значащим названием :wink:

Автор:  Saperx [ Пт, июл 13 2018, 07:38 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

Rizor написал(а):
SAPer написал:
Очень люблю использовать такую конструкцию в коде. Она позволят избавится от многократно вложенных if.
Code:
do 1 times.
 
  check a = b.

  check n = m.

  check x = y.

  do something here.

enddo.


По мне тут на 80% звоночек, что этот кусок кода стоит обернуть в отдельный метод со значащим названием :wink:

И про вложенность не понял, почему не
Code:
IF a = b AND n = m AND x = y.
  do something here.
ENDIF.

Автор:  Kuranov.Dmitry [ Пт, июл 13 2018, 10:27 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

Цитата:
И про вложенность не понял, почему не


Думаю автор имел в виду

Code:
do 1 times.
 
  check a = b.
"  что-то деллаем
  check n = m.
"что-то делаем
  check x = y.
"что-то делаем

enddo.


вместо

Code:
if a = b.

  "do some action
    if n = m.
      "do someeaction
        if x = y.
          "do someaction
       enddif.
    endif
endif

Автор:  SAPer [ Пт, июл 13 2018, 13:31 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

Я то что написал, то и имел ввиду. Внутри DO делаем последовательные проверки и в конце какой то код. Код отработает, если пойдут все условия.

Данный подход для меня позволяет:
1. Избежать написания громоздких IF с множеством условий. Например одно из условий может быть вызов метода. И их может быть несколько.
2. Избежать написания вложенных IF.
3. Удобство отладки. При отладке сразу понятно какое условие не прошло.

Минусы - код немного получается длиннее.

Пример реального кода:
Code:
  " Проверка на максимальную стоимость
  do 1 times.

    check lr_bid->s_header-src_object_type ne zcl_doc_static=>pp.

    " конкурс должен быть активной версией
    check lr_bid->s_header-version_type eq zcl_doc_static=>version_active.

    " Проверка этапа
    check lr_bid->s_header-object_id eq lr_bid->s_header-zz_hist_doc_id.

    " Проверка на включенность закупки в план
    check lr_bid->s_header-zz_plan_excl_x eq abap_false.

    " Проверка локального флага
    check zcl_oos_notice_static=>is_enabled( lr_bid->guid ) eq abap_true.

    " Для компании сравниваем с 500.000, для ДЗО с 100.000
    if zcl_doc_static=>is_dzo( lr_bid->guid ) eq abap_false.
      check lr_bid->s_header-total_value gt zcl_constants=>value( 'BUS2200/MAX_VALUE_WO_PP' ).
    else.
      check lr_bid->s_header-total_value gt zcl_constants=>value( 'BUS2200/DZO_MIN_VALUE' ).
    endif.

    message e015 into zcl=>dummy.
    zcl_message_static=>add_message(
      changing
        ct_messages = ct_messages ).

  enddo.

Автор:  Удав [ Пт, июл 20 2018, 01:55 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

SAPer написал:
Я то что написал, то и имел ввиду.

Имелось ввиду, что вместо do..enddo можно было написать method..endmethod.
И было бы элегантнее и кода бы меньше было ;)

Автор:  Kengur [ Пт, июл 20 2018, 10:50 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

Удав написал(а):
SAPer написал:
Я то что написал, то и имел ввиду.

Имелось ввиду, что вместо do..enddo можно было написать method..endmethod.
И было бы элегантнее и кода бы меньше было ;)

do 1 times часто пишут там где нельзя объявлять свои блоки (энхансменты и т.д.) но при этом надо писать независимые условия (проверки).

Автор:  ArmAnn [ Пт, июл 20 2018, 15:02 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

Kengur написал(а):
do 1 times часто пишут там где нельзя объявлять свои блоки (энхансменты и т.д.) но при этом надо писать независимые условия (проверки).
это вы зря - объявлять может и нельзя, а использовать - можно. Как раз в энхансментах лучше бы заворачивать свой код в ФМы или методы и только вызывать из энхансмента - так и сопровождать проще, и при апгрейде головной боли меньше.
А рекомендация Удава к do..enddo прямого отношения не имеет, просто видно что есть блок кода, который выполняет определенную функцию. И это блок явно напрашивается на вынос в отдельный метод.

Автор:  Kengur [ Пт, июл 20 2018, 15:13 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

ArmAnn написал:
это вы зря

это не я :shumlol:

Автор:  Kuranov.Dmitry [ Пт, июл 20 2018, 16:02 ]
Заголовок сообщения:  Re: Полезные трюки ABAP

ArmAnn написал:
А рекомендация Удава к do..enddo прямого отношения не имеет, просто видно что есть блок кода, который выполняет определенную функцию. И это блок явно напрашивается на вынос в отдельный метод.


порой это надо сильно рефакторить, так как блок в Do enddo может использовать дофига локальных переменных.

Code:
FORM myForm.
DATA: a,b,c,d,e,f.

",,,,

Do 1 times.

   a = b  = 'X'.
enddo.


Страница 6 из 6 Часовой пояс: UTC + 4 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/