Как преобразовать 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);
Другие вопросы по тегам