Сегодня расскажу о SAP Report Connector – он открыл нам довольно много полезного.
Главный плюс – то, что не нужно повторять логику программы SAP, а результат программы можно затянуть, «почти» как обычную таблицу:
- Итак, создаём коннект.
- После этого нажимаем в QlikView кнопку Reports:
- Заполняем название программы (именно программы, а не транзакции) – поле Report, пункт 1 на скрине ниже.
- Далее заполняем поле Variant:
a) либо название варианта – п.2. На примере ниже это оправдано, так как никакие параметры задавать переменными нет необходимости,
b) либо же заполняем п.3, параметры вручную, по нажатию на кнопку «Select Options», которые уже в скрипте можно будет задать нужными переменными (об этом ниже).
Одновременно использовать 2 и 3 пункт нельзя.
- Далее перед нами появляется отчёт, на примере ниже это окно п.4. Здесь показывается, как коннектор распределил строки по типам (Category), далее некоторые типы строк можно фильтровать или определять, как строку заголовка. А также поле Action, которое указывает текущий статус строки, data, header или skip
Самые трудные для реализации пункты (в зависимости от программы) – это заполнение параметров по кнопке «Select Options», а также пункт с преобразованиями получившихся отчётов. Практически к каждому отчёту нужен свой подход и свои маневры – то на стороне SAP, то на стороне коннектора, то уже при обработке в QlikView.
В итоге после одного преобразования, «Rows per record» = 4, у меня получился отчёт, который я уже смог обработать в QlikView. Остальные преобразования не помогли, в частности «Field Delimeter» отрабатывал некорректно:
В QlikView обработка выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//Выгружаем одно поле, так как коннектор разбивает поля некорректно. Factoring_tmp: Load [Field0_]; Select SAPREPORT (REPORT (ZAK_EXEC_ZFBDT_REESTR), VARIANT (ГПБ), ROWS_PER_RECORD (4)); //Преобразуем в соответствии с внешним видом транзакции, не подгружаем ненужные поля. Факторинг: LOAD If(Text(SubField(Field0_, '!', 1)) like '*0A*', 'Не оплачено', //Здесь сразу преобразуем в зависимости от значения поля. If(Text(SubField(Field0_, '!', 1)) like '*09*', 'В процессе', If(Text(SubField(Field0_, '!', 1)) like '*08*', 'Оплачено') ) ) as Статус_оплаты, Trim(SubField(Field0_, '!', 2)) as HBKID, Trim(SubField(Field0_, '!', 3)) as Номер_реестра, Num(Trim(SubField(Field0_, '!', 4))) as Дата_реестра, Trim(SubField(Field0_, '!', 5)) as Номер_инвойса, Num(Trim(SubField(Field0_, '!', 6))) as Дата_инвойса, PurgeChar(Trim(SubField(Field0_, '!', 7)), '.') as Сумма, Trim(SubField(Field0_, '!', 8)) as Валюта, Num(Trim(SubField(Field0_, '!', 9))) as Дата_погашения, Trim(SubField(Field0_, '!', 10)) as Кредитор, Num('$(vCountDate)') as Дата Resident Factoring_tmp Where not IsNull(Num(Trim(SubField(Field0_, '!', 6)))); DROP Table Factoring_tmp; ... |
В итоге получилась таблица, которой уже можно полноценно пользоваться для создания отчётов:
Примерная схема работы с SAP Report Connector для QlikView
За время работы с SAP Report Коннектором выработалась следующая схема работы:
Шаг 1: Попробовать сразу загрузить программу в QlikView, желательно используя заготовленный вариант в SAP с небольшим количеством данных, чтобы не ждать каждый раз, ведь время отклика в коннекторе равно времени отклика в SAP . Если есть какая-нибудь ошибка, что происходит довольно часто в начале работы с отчётом – обращаться к коллегам из SAP. Ошибки бывают следующие:
a) У пользователя, под которым был коннект недостаточно прав (либо на саму программу, либо на какой-либо модуль, используемый это программой), это исправляется довольно быстро консультантами SAP.
b) SAP возвращает какой-либо элемент, который коннектор не может принять (чаще всего это графический элемент), и здесь также помогает взаимодействие с коллегами-сапистами. Решается вопрос корректировками программы на стороне SAP – отдельным выводом данных для пользователя, под которым законнекчен QlikView.
c) Создание Spoof-файлов. Spoof-файлы – некий аналог сохранений результатов отчетов. Уточнить, создает ли программа spoof, нужно опять же у консультантов SAP. Далее нажимаем Get – ждём выполнение транзакции и получаем отчет.
Шаг 2: После устранения ошибок – можно более тесно знакомиться с нужным отчётом. В инструкции рекомендуют использовать варианты в SAP для подключения, но в этих вариантах нельзя использовать переменные, а так что для автоматической выгрузки идеально подходит самостоятельный выбор параметров.
Чтобы настроить параметры, необходимо сначала попробовать сделать это в интерфейсе самого коннектора:
У многих программ может быть совсем немного параметров и настроить их получится интуитивно. Как на примере ниже:
- Вводим имя нужной программы.
- Нажимаем «Select Options»
- Перед нами всего два параметра. Настраиваем нужные значения – возможности аналогичны возможностям в SAP, можно выбрать одно значение, можно несколько, можно указать диапазон или исключить ненужные значения:
Но бывает, когда список параметров более чем велик, как на примере ниже. Причём часть параметров содержит описание и примерно понятна, а часть без описания:
Чтобы разобраться с подобными параметрами необходимо создать нужный вариант в SAP, а потом уже с помощь транзакции SE38, смотреть какие значения, каким полям присваиваются:
Далее указываем имя вариант, предварительно созданного из транзакции:
Далее получаем список значений, который уже можно переносить в коннектор, а нужные значения, к примеру «Финансовый год» и «Отчетные периоды» заменять на переменные, для дальнейших манипуляций в QlikView:
Шаг 3: Расставив параметры и получив нужные данные, переходим к завершающему этапу – обработке данной таблицы и корректировке полученного скрипта:
В зависимости от таблицы нужно будет указать (при необходимости):
- какие строки пропускать
- какая строка будет заголовком
- какой разделитель использовать (Field Delimeter)
- сколько строк в одной записи (Rows per record)
- при необходимости самостоятельно настроить количество символов разделителей полей.
- и т.д.
На примере программы RFBILA00:
- Сначала я настроил какие типы строк оставить, определил строку с заголовком.
- Далее проверил, как коннектор разделил данные на поля. В данном случае не определилось поле между «Статья» и «Текст статьи баланса», поэтому я настроил в скрипте этот пункт:
FIELD_DELIMITER_POSITIONS (0, 11, 73, 93, 113, 133, 144)
- В скрипте настроил поля, значения которых определяются переменными в зависимости от текущей даты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
$(include=E:\QVFixPrice\QVReload\QVScripts\ConnectSAPReport.txt); Balance: //Здесь делаем необходимые преобразования. Load RowNo() as Номер, [Field0_Статья], [Field1_Текст статьи баланса/отчета П+У] as Наименование_статьи, If([Field2_Итого/ОтчП] like '*-', -Num(PurgeChar([Field2_Итого/ОтчП], '-.')), Num(PurgeChar([Field2_Итого/ОтчП], '.'))) as Итого_отчПер, If([Field3_Итог/ПСрав] like '*-', -Num(PurgeChar([Field3_Итог/ПСрав], '-.')), Num(PurgeChar([Field3_Итог/ПСрав], '.'))) as Итого_сравПер, If([Field4_АбсолютОтк] like '*-', -Num(PurgeChar([Field4_АбсолютОтк], '-.')), Num(PurgeChar([Field4_АбсолютОтк], '.'))) as Абсолютн_отлк, If([Field5_ОтнОтклон] like '*-', -Num(PurgeChar([Field5_ОтнОтклон], '-.')), Num(PurgeChar([Field5_ОтнОтклон], '.'))) as Относит_отлк, $(vCountYear) as Год, $(vCountMonth) as Месяц Where not [Field1_Текст статьи баланса/отчета П+У] like '*==*'; Select SAPREPORT (REPORT (RFBILA00), ROWS_PER_RECORD (1), FIELD_DELIMITER_POSITIONS (0, 11, 73, 93, 113, 133, 144), SKIP (T (1), T (2), T (4), T (5), T (6), T (7), T (8)), HEADER (T (9)), OPTIONS ( (SELNAME BILABKON, KIND P, SIGN I, OPTION EQ, LOW 3), (SELNAME BILAGKON, KIND P, SIGN I, OPTION EQ, LOW 3), (SELNAME BILAGRID, KIND P, SIGN I, OPTION EQ, LOW X), (SELNAME BILAGVAR, KIND P, SIGN I, OPTION EQ, LOW 1SAP), (SELNAME BILASKAL, KIND P, SIGN I, OPTION EQ, LOW 0/0), (SELNAME BILATVAR, KIND P, SIGN I, OPTION EQ, LOW 1SAP), (SELNAME BILAVART, KIND P, SIGN I, OPTION EQ, LOW 1), (SELNAME BILAVERS, KIND P, SIGN I, OPTION EQ, LOW I-A2), (SELNAME BILBJAHR, KIND P, SIGN I, OPTION EQ, LOW $(vLoadYearOtch)), //Здесь указывается год отчетного периода. (SELNAME BILVJAHR, KIND P, SIGN I, OPTION EQ, LOW $(vLoadYearSrav)), //Здесь указывается год для сравнения. (SELNAME B-MONATE, KIND S, SIGN I, OPTION BT, LOW 1, HIGH $(vLoadMonthMaxOtch)), //Здесь указываются периоды (или месяцы) текущего года. LOW = 1, а вот HIGH в зависимости от даты. (SELNAME V-MONATE, KIND S, SIGN I, OPTION BT, LOW 1, HIGH 16), (SELNAME SD_BUKRS, KIND S, SIGN I, OPTION EQ, LOW BSTP), (SELNAME SD_KTOPL, KIND S, SIGN I, OPTION EQ, LOW CA01), (SELNAME SD_OBJE1, KIND P, SIGN I, OPTION EQ, LOW FI_TF_GLF), (SELNAME SD_USDB1, KIND P, SIGN I, OPTION EQ, LOW X), (SELNAME XX_KTOPL, KIND S, SIGN I, OPTION EQ, LOW CA01) )); |
На сегодня все ☺ В следующий раз напишу о своем любимом Коннекторе – SAP BAPI Connector for QlikView.
Свежие комментарии