Как преобразовать SET в DATASET в HPCC / ECL?
У меня есть этот набор в ECL
EXPORT TableNames := [
'tbl1',
'tbl2',
'tbl3',
'tbl4'
];
APPLY(TableNames, SomeFunctionPreviouslydefined);
... и я хочу передать его функции, используя APPLY. APPLY не принимает наборы:
"3002: синтаксическая ошибка рядом с \"tblList\": ожидаемый RANGE, ROWSET, SELF, SUCCESS, datarow, набор данных, словарь, имя модуля, идентификатор, идентификатор, имя функции, идентификатор, имя макроса, '+', '^', '(', '['"
Как мне это сделать?
1 ответ
Хотя это не очень понятно в документации ( https://hpccsystems.com/training/documentation/all - Справочник по языку ECL), вы можете использовать объявление DATASET для преобразования SET в DATASET, в частности в форму:
[ attr := ] DATASET( recordset [, recstruct ] );
attr Имя DATASET для последующего использования в других определениях
набор записей Набор встроенных записей данных. Это может просто назвать ранее определенное определение набора или явно использовать квадратные скобки, чтобы указать встроенное определение набора. В квадратных скобках записи разделяются запятыми. Записи задаются одним из следующих способов: 1) Использование фигурных скобок ({}) для окружения значений полей для каждой записи. Значения полей в каждой записи разделяются запятыми. 2) Разделенный запятыми список встроенных функций преобразования, которые создают строки данных. Все функции преобразования в списке должны создавать записи в одном и том же формате результатов.
Перестройте по желанию. Структура ЗАПИСИ набора записей. Опускается только в том случае, если параметр набора записей представляет собой только одну запись или список встроенных функций преобразования
Итак, для вашего примера вы можете использовать:
EXPORT Layout := RECORD
STRING tableName;
END;
EXPORT TableNames := [
'tbl1',
'tbl2',
'tbl3',
'tbl4'
];
ds_inlineLayout := DATASET(TableNames, {STRING tableName}); // Define the layout inline
ds_explicitLayout := DATASET(TableNames, Layout); // Use a an explicitly defined layout
OUTPUT(ds_inlineLayout);
OUTPUT(ds_explicitLayout);
Наконец, чтобы использовать это в вашем заявлении:
APPLY(ds_inlineLayout, SomeFunctionPreviouslydefined);