Перейти к основному содержимому

Макро подстановка

Обычно используется для того, чтобы выполнить 1 операцию внути опреатора SET или вызвать функции с определенными параметрами.

Иногда полезно комбинировать макроподстановки

Примеры вызова

$(eRows('mytable'));
IF $(eTableExists('mytablename')) THEN
...
ELSE
...
END IF
LET preciding_load = IF ($(eTableExists('myTable')), 'OUTER JOIN ([$('myTable')])', 'NOCONCATENATE [$('myTable')]:');

$(preciding_load)
LOAD
...
RESIDENT ...;

Полезные функции с макроподстановкой

eRows - вывести в лог скрипта количество строк в таблице

Код для вставки в скрипт:

SET eRows = CALL ls_t_rowcount($1);
SUB ls_t_rowcount(ls_tname)
LET ls_r_qty = NOOFROWS('$(ls_tname)');
TRACE '$(ls_tname): rows count = $(ls_r_qty)';
SET ls_r_qty;
SET ls_tname;
END SUB;

Пример использования:

$(eRows('mytable'));
Результат выполнения

в логе выполнения скрипта будет написано количество строк в таблице mytable:

mytable: rows count = 555

eFileExists - проверка существования файла

Код для вставки в скрипт:

SET eFileExists = 'LEN(FILESIZE($1))>0';

Пример использования:

IF $(eFileExists('lib://qvd/layer/mydata.qvd')) THEN
...
END IF
Результат выполнения

В случае, если файл существует, то начнётся выполнение скрипта внутри условия IF

eDefaultIfEmpty - поставить значение по умолчанию, если поле пустое

Код для вставки в скрипт:

SET eDefaultIfEmpty = 'IF (LEN($1), $1, $2)';

Пример использования:

LOAD
ID
, $(eDefaultIfEmpty([MyValue],'0')) as MyValue
FROM ....
Результат выполнения

При чтении значений из источника, значение в поле MyValue будет проверятся на заполненность, и если длина строки будет равна нулю, то будет поставлено значение 0.

В принципе, макроподстановка работает аналогично функции COALESCE

eDropTableIfExists - удалить таблицу, если она существует

Код для вставки в скрипт:

SET eDropTableIfExists =  WHEN LEN(TABLENUMBER('$1')) DROP TABLE [$1];

Пример использования:

$(eDropTableIfExists('mytable'));
Результат выполнения

Если таблица с указанным именем существует, то она будет удалена из модели

eTableHeader - подстановка CONCATENATE или NOCONCATENATE

Код для вставки в скрипт:

SET eTableHeader = IF(TABLENUMBER('$1')>=0, 'CONCATENATE([$1])', 'NOCONCATENATE [$1]:');

Пример использования:

LET vTableName = $(eTableHeader(myTable));
$(vTableName)
LOAD
...
FROM/RESIDENT ...
Результат выполнения

в переменную vTableName будет записано значение:

  • CONCATENATE([myTable]) если таблица с таким имененм уже существует
  • или NOCONCATENATE [myTable] если таблица с таким именем не существует

eTableExists - проверка на существование таблицы

Код для вставки в скрипт:

SET eTableExists = 'Len(TableNumber($1))>0';

Пример использования:

IF $(eTableExists('mytable')) THEN
...
END IF;
Результат выполнения

В случае, если таблица существует, то начнётся выполнение скрипта внутри условия IF

Генерация GUID

eGUID - генерация GUID, просто ,"почти уникально"

При вызове макроподстановки $(eGUID) в переменную vGUID будет записано значение

Код для вставки в скрипт:

SET eGUID = CALL GetGUID;

SUB GetGUID
LET vGUID = KEEPCHAR(NOW(1),'0123456789');
END SUB;

Пример использования:

$(eGUID)
[mytable_$(vGUID)]:
LOAD
...
FROM ...
Результат выполнения

Создается таблица с примерным именем: mytable_13052024162243

GUID посложнее

В переменную vGUID записывается хэш

Код для вставки в скрипт:

SET eGUID = CALL GetGUID;

SUB GetGUID
NOCONCATENATE
__temp_table_guid:
LOAD KEEPCHAR(LOWER(Hash128(NOW(1))),'0123456789qwertyuiopasdfghjklzxcvbnm') as __guid_field AUTOGENERATE 1;
LET vGUID = PEEK('__guid_field');
DROP TABLE __temp_table_guid;
END SUB;

Пример использования:

$(eGUID)
[mytable_$(vGUID)]:
LOAD
...
FROM ...
Результат выполнения

Создается таблица с примерным именем: mytable_h9htuk5ib52yie