Маски в SAP (языки ABAP и OpenSQL, транзакция SE38 и др.)Опишу
ArmAnn написал:
знания базового уровня, хорошо описанные в хелпе и которые необходимо знать любому abap-разработчику
(перенесено
отсюда).
В масках используется символ «*», а есть ещё «+» и другие (языки ABAP и OpenSQL)Чтобы из внутренней таблицы выбрать все записи, у которых в некотором поле стоит значение, начинающееся с буквы M и состоящее ровно из 4 символов, можно использовать оператор сравнения like 'M+++'. Т.е. для обозначения одного любого символа в языке ABAP используется маскирующий символ '+'. Для обозначения же любого количества любых символов — '*'.
Для выборок из таблиц базы данных используются соответственно маскирующие символы '_' и '%', в соответствии с языком Open SQL. Показывающая это программа с листингом ниже (код в виде файла
тут).
Code:
*---------------------------------------------------------------------*
* Report ZMASK
*---------------------------------------------------------------------*
* ┌───────────────────────┬──────────────────┬──────────┬──────┐
* │ Что? │ Файловая система │ Open SQL │ ABAP │
* ├───────────────────────┼──────────────────┼──────────┼──────┤
* │ Любое кол-во символов │ * │ % │ * │
* │ Один любой символ │ ? │ _ │ + │
* └───────────────────────┴──────────────────┴──────────┴──────┘
* Смотри документацию к оператору like в выражении Select ... where A like B.
* Цитата:
* «The use of the wildcard characters "_" and "%" corresponds to the standard
* of SQL. In the rest of ABAP, the wildcard characters "+" and "*" are used in
* similar logical expressions, in particular when selection tables are used».
*---------------------------------------------------------------------*
Report ZMASK.
Parameters: p_mask1 type dd02l-tabname default 'MAR_',
p_mask2 type dd02l-tabname default 'MAR*',
p_mask3 type dd02l-tabname default 'M+++'.
Types:
begin of ty_s_data,
tabname type dd02l-tabname,
end of ty_s_data,
ty_t_data type standard table of ty_s_data.
Data: gs_data type ty_s_data, gt_data type ty_t_data.
Select tabname from dd02l into corresponding fields of table gt_data
where tabname like p_mask1.
Write / 'Все таблицы MAR* (максимум — от MAR1 до MARVCD):'.
New-line.
Loop at gt_data into gs_data where tabname cp p_mask2.
Write gs_data.
Add 1 to sy-index.
Endloop.
Write: / 'Итого таких таблиц —', sy-index, 'шт.'.
Clear sy-index.
Write / 'Только те таблицы M*, у которых в названии 4 символа, не больше:'.
New-line.
Loop at gt_data into gs_data where tabname cp p_mask3.
Write gs_data.
Add 1 to sy-index.
Endloop.
Write: / 'Итого таких таблиц —', sy-index, 'шт.'.
Для параметров | MAR_ | MAR* | M+++ | результат такой:
Code:
Все таблицы MAR* (максимум — от MAR1 до MARVCD):
MAR1 MARA MARC
MARD MARE MARI
MARM MARU MARV
Итого таких таблиц — 9 шт.
Только те таблицы M*, у которых в названии 4 символа, не больше:
MAR1 MARA MARC
MARD MARE MARI
MARM MARU MARV
Итого таких таблиц — 9 шт.
Для параметров | MAR% | MAR* | M+++ | же результат такой:
Code:
Все таблицы MAR* (максимум — от MAR1 до MARVCD):
MAR1 MARA MARA1
MARAEXT MARAP MARASUBSCR
MARAV MARA_B MARA_C
MARA_MATNR MARA_TMP MARA_UEB
MARA_VRKME MARC MARCE
MARCH MARCHO1 MARCO1
MARCP MARCU MARCV
MARCW MARC_DISP MARC_NFMAT
MARC_TMP MARC_UEB MARC_VRBMT
MARC_WERK MARD MARDE
MARDH MARDHO1 MARDO1
MARDP MARDU MARD_EXT
MARD_F4HELP MARD_KEY MARD_LGORT
MARD_TMP MARD_UEB MARE
MAREC MARI MARKDOWN
MARKVINTF MARM MARM_TMP
MARM_UEB MARTSTATUS MART_RANGE
MARU MARV MARVCD
Итого таких таблиц — 54 шт.
Только те таблицы M*, у которых в названии 4 символа, не больше:
MAR1 MARA MARC
MARD MARE MARI
MARM MARU MARV
Итого таких таблиц — 9 шт.
Чем это полезно (транзакция SE38 и др.)?При поиске чего-нибудь по названию можно ставить «+» вместо «*», получая более точные результаты.
Например, так в транзакции SE38 можно найти все программы, начинающиеся на «BC» и заканчивающиеся на «GRID_xx», где «xx» — это ровно два символа.
