Большинство компаний имеют внутренний регламент форматирования ABAP кода. Не смотря на наличие регламента, оформление кода может сильно отличаться даже в приделах одной программы. Это связано со следующими фактами: многие программы разрабатывались до принятия регламентов; регламентируют в основном только наименования переменных и программных объектов.
Одни из самых сложных конструкций в ABAP — это SELECT и READ TABLE. Ниже предложены правила форматирования данных конструкций, а также средство автоматизированного форматирования для уже имеющегося кода.
READ TABLE — index
Последовательность операторов следующая:
1 |
READ TABLE itab result index. |
Если INDEX указан совместно с оператором USING KEY, то INDEX переносится на новую строку с отступом в два пробела.
1 2 |
READ TABLE lt_mseg ASSIGNING <ls_mseg> CASTING INDEX 1 USING KEY mch1. |
Если USING KEY не используется, то оператор пишется в одну строку.
1 |
READ TABLE lt_mseg INTO ls_mseg INDEX 1. |
READ TABLE — free_key
Последовательность операторов следующая:
- Первая строка – READ TABLE itab result
- Вторая и последующие строки — WITH KEY с условием выбора
При использовании BINARY SEARCH, оператор ставится на второй строке, строка с WITH KEY смещается ниже. Дополнения BINARY SEARCH и WITH KEY пишутся с отступом в два символа.
Первое условие в WITH KEY пишется на текущей строки, каждое новое условие с новой строки, при этом отступы таким образом, чтобы поля выбора были на одной позиции. Знак равно «=» выделяется таким образом, чтобы на всех условиях выбора он был на одном уровне.
1 2 3 4 5 6 7 8 |
READ TABLE lt_mseg ASSIGNING <ls_mseg> WITH KEY bukrs = lv_bukrs ps_psp_pnr = lv_sppnr. READ TABLE lt_mseg INTO ls_mseg BINARY SEARCH WITH KEY bukrs = lv_bukrs ps_psp_pnr = lv_sppnr. |
READ TABLE — table_key
Если используется дополнение FROM без USING KEY, код пишется в одну строку.
1 |
READ TABLE lt_mseg INTO ls_mseg FROM ls_mseg_key. |
При использовании дополнения FROM с USING KEY код пишется в две строки. Вторая строка с отступом в два пробела.
1 2 |
READ TABLE lt_mseg ASSIGNING <ls_mseg> CASTING FROM ls_mseg_key USING KEY mch1. |
При использовании первичного ключа таблицы, дополнение WITH TABLE KEY пишется на новой строке с отступом в два пробела, при этом отступы таким образом, чтобы поля выбора были на одной позиции. Знак равно «=» выделяется таким образом, чтобы на всех условиях выбора он был на одном уровне.
1 2 3 |
READ TABLE lt_mseg TRANSPORTING NO FIELDS WITH KEY TABLE bukrs = lv_bukrs ps_psp_pnr = lv_sppnr. |
При использовании вторичного ключа, на второй строке указывается WITH TABLE KEY с названием ключа, на третьей и следующих строках COMPONENTS и условия чтения. Выравнивание условий происходит аналогично предыдущему варианту.
1 2 3 4 |
READ TABLE lt_mseg INTO ls_mseg WITH KEY TABLE spp_key COMPONENTS bukrs = lv_bukrs ps_psp_pnr = lv_sppnr. |
SQL
Каждая ключевая конструкция пишется с новой строки с отступом в 2 символа. Исключение — «UP TO n ROWS» если в качестве выбора поля указана * либо одно поле с коротким названием без алиаса, в этом случае конструкция пишется на первой строке. Порядок ключевых конструкций следующий:
1 2 3 4 5 6 7 8 9 10 11 |
SELECT [SINGLE [FOR UPDATE]] [DISTINCT] fields [UP TO n ROWS] [BYPASSING BUFFER] [INTO|APPENDING into] FROM from [FOR ALL ENTRIES itab] [WHERE whereClause] [GROUP BY groupBy] [UNION union] [HAVING having] [ORDER BY orderBy]. |
SQL — fields
Если число суммарная длина полей не превышает половину ширины экрана ни у одного поля нет алиаса, то поля для выбора пишутся в одну строку. Иначе, каждое поле для выбора пишется на новой строке на одном уровне с первым полем. В случае перечисления полей через запятую, разделитель прижимается к полю справа без пробелов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT * FROM mseg... SELECT matnr charg werks lgort FROM mseg... SELECT matnr, charg, werks, lgort FROM mseg... SELECT matnr charg AS batch FROM mseg... SELECT matnr, charg AS batch FROM mseg... |
SQL — where
Условия выбора, разделённые оператором AND, должны быть записаны с новой строки и выровнены на одном уровне с оператором WHERE.
1 2 3 |
WHERE mseg~mblnr IN s_mblnr AND mseg~mjahr EQ p_mjahr AND mara~meins IN s_meins |
SQL — from
При выборе данных из нескольких таблиц, каждый JOIN пишется на новой строке, с отступов в 2 символа. Условия соединений таблиц должны быть выровнены на одном уровне с оператором ON, по аналогии с WHERE.
1 2 3 4 |
FROM mseg INNER JOIN mara ON mara~matnr EQ mseg~matnr INNER JOIN mkpf ON mkpf~mblnr EQ mseg~mblnr AND mkpf~mjahr EQ mseg~mjahr |
1 . READ TABLE
READ TABLE lt_mseg ASSIGNING
WITH KEY bukrs = lv_bukrs
ps_psp_pnr = lv_sppnr.
А теперь передумайте читать по bukrs. Чтобы его убрать нужно редактировать всю строку с WITH KEY.
А теперь передумайте читать по PS_PSP_PNR — нужно переносить точку в строку выше.
Писать нужно так
READ TABLE lt_mseg ASSIGNING WITH KEY
bukrs = lv_bukrs
ps_psp_pnr = lv_sppnr
.
нужно убрать bukrs — только удалил строку с BUKRS (CTRL+SHIFT+L)
нужно убрать PS_PSP_PNR — удалил только эту сроку
кроме того имена полей идут с однократным отступом от READ взгляд не нужно сдвигать дальше.
аналогично для COMPONENTS:
READ TABLE lt_mseg ASSIGNING WITH TABLE KEY main COMPONENTS
bukrs = lv_bukrs
ps_psp_pnr = lv_sppnr
.
2. «Если число суммарная длина полей не превышает половину ширины экрана ни у одного поля нет алиаса, то поля для выбора пишутся в одну строку.»
Нет. Поля пишутся по одному всегда в строке с одиночным выступом от SELECT
SELECT
matnr
matkl
FROM mara …
Их так проще увидеть и удалять/комментировать, а также и добавлять новые
3. «Условия соединений таблиц должны быть выровнены на одном уровне с оператором ON, по аналогии с WHERE»
Да, но условие должно быть на новой строке
вместо
FROM mseg
INNER JOIN mara ON mara~matnr EQ mseg~matnr
INNER JOIN mkpf ON mkpf~mblnr EQ mseg~mblnr
AND mkpf~mjahr EQ mseg~mjahr
должно быть
FROM mseg
INNER JOIN mara
ON mara~matnr EQ mseg~matnr
INNER JOIN mkpf
ON mkpf~mblnr EQ mseg~mblnr
AND mkpf~mjahr EQ mseg~mjahr
Экономить секунду на правки не целесообразно. Код читается в сотни, а то и в тысячи раз больше чем пишется. Поэтому он должен быть удобным для чтения, а не для правок.
Не хотите написать статью о рекомендуемом регламенте правил наименования переменных в ABAP. Я понимаю единого правила нет. Но как пример из какой либо фирмы занимающейся разработкой ABAP. У меня к сожалению нет регламента. Но знаю во многих фирмах есть. Какой либо информации в инете не нашел. Было бы неплохо почитать такую статью.
Спасибо.
Есть такая статья https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md