Загрузите несколько листов Excel, используя цикл For с QlikView

Я хочу загрузить данные из двух разных файлов Excel и использовать их в одной таблице в QlikView.

У меня есть два файла (DIVISION.xls и REGION.xls), и я использую следующий код:

let tt = 'DIVISION$' and 'REGION$';

FOR Each db_schema in 'DIVISION.xls','REGION.xls'
    FOR Each v_db in $(tt)
        div_reg_table:
        LOAD *
        FROM $(db_schema) 
        (biff, embedded labels, table is $(v_db));
    NEXT
NEXT

Этот код работает нормально и не отображает никаких ошибок, но я не получаю никаких данных и не вижу свою новую таблицу (div_reg_table).

Вы можете мне помочь?

2 ответа

Решение

Основная причина того, что ваш код не загружает какие-либо данные, связана с формой tt переменная.

Когда ваш внутренний цикл выполняется, он оценивает tt (обозначается $(tt)), что затем приводит к оценке:

'DIVISION$' AND 'REGION$'

Что приводит к нулю, так как это всего лишь две строки.

Если вы слегка измените свое утверждение, от LET в SET и удалите ANDтогда внутренний цикл будет работать. Например:

SET tt = 'DIVISION$', 'REGION$';

Однако теперь это также означает, что ваш внутренний цикл будет выполняться для каждого значения в tt для обеих рабочих книг. Это означает, что если у вас нет REGION лист в вашем DIVISION книга, тогда загрузка не удастся.

Чтобы избежать этого, вы можете немного реструктурировать свой сценарий, чтобы у вас была контрольная таблица, в которой указаны файлы и таблицы для загрузки. Пример, который я подготовил, показан ниже:

FileList:
LOAD * INLINE [
    FileName, TableName
    REGION.XLS, REGION$
    DIVISION.XLS, DIVISION$
];


FOR i = 0 TO NoOfRows('FileList') - 1

    LET FileName = peek('FileName', i, 'FileList'); 
    LET TableName = peek('TableName', i, 'FileList'); 

    div_reg_table:
    LOAD
        *
    FROM '$(FileName)'
    (biff, embedded labels, table is '$(TableName)');

NEXT

Если у вас есть только два файла DIVISION.XLS а также REGION.XLS тогда, возможно, стоит просто использовать две отдельные загрузки одну за другой и полностью удалить цикл for. Например:

div_reg_table:
LOAD
    *
FROM [DIVISION.XLS]
(biff, embedded labels, table is DIVISION$)
WHERE DivisionName = 'AA';

LOAD
    *
FROM [REGION.XLS]
(biff, embedded labels, table is REGION$)
WHERE RegionName = 'BB';

Не нужно ли делать тест noofrows('Filelist') на 1 меньше, чем ответ.

noofrows ('filelist') будет иметь значение 2, поэтому вы получите шаг цикла для 0,1 и 2. Таким образом, 2 вернет ноль, что приведет к его сбою.

Я сделал это так:

FileList: LOAD * INLINE [FileName, TableName REGION.XLS, REGION DIVISION.XLS, DIVISION];

let vNo = NoOfRows ('FileList') - 1;

FOR i = 0 TO $ (vNo)

LET FileName = peek('FileName', i, 'FileList'); 
LET TableName = peek('TableName', i, 'FileList'); 

div_reg_table:
LOAD
    *,
    $(i) as I,
    FileBaseName() as SOURCE
FROM '$(FileName)'
(biff, embedded labels, table is '$(TableName)');

СЛЕДУЮЩИЙ

Другие вопросы по тегам