Загрузите несколько листов 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)');
СЛЕДУЮЩИЙ