Разблокирование данных SAP BusinessObjects: полное руководство по получению документов с помощью Python

Разблокирование данных SAP BusinessObjects: полное руководство по получению документов с помощью Python

15 января 2024 г.

В сфере бизнес-аналитики и анализа данных SAP BusinessObjects является мощным инструментом, позволяющим организациям преобразовывать необработанные данные в полезную информацию. Хотя его возможности надежны, программный доступ к данным и управление ими может обеспечить еще большую гибкость. Эта запись блога погружает вас в мир SAP BusinessObjects и Python и демонстрирует пошаговый подход к легкому получению списка документов.

Почему это важно

В SAP BusinessObjects за годы работы может образоваться беспорядок в документах и ​​папках. Наведение порядка в этом хаосе имеет решающее значение для групп данных. Используя Python для получения таких сведений, как путь, дата последнего изменения и статус для всех документов, вы получаете мощный инструмент.

Решение на Python

Часть 1. Аутентификация

Чтобы инициировать процесс аутентификации, замените значения заполнителей «имя пользователя», «пароль» и «localhost» на данные вашей конкретной конфигурации.

import requests
import pandas as pd
import xml.etree.ElementTree as ET

# define the login request parameters
username = 'username'
password = 'password'
localhost = 'localhost'

auth_type = 'secEnterprise'
login_url = 'http://{}:6405/biprws/logon/long'.format(localhost)
login_data = f'<attrs xmlns="http://www.sap.com/rws/bip"><attr name="userName" type="string">{username}</attr><attr name="password" type="string">{password}</attr><attr name="auth" type="string" possibilities="secEnterprise,secLDAP,secWinAD,secSAPR3">{auth_type}</attr></attrs>'
login_headers = {'Content-Type': 'application/xml'}

# send the login request and retrieve the response
login_response = requests.post(login_url, headers=login_headers, data=login_data)

# parse the XML response and retrieve the logonToken
root = ET.fromstring(login_response.text)
logon_token = root.find('.//{http://www.sap.com/rws/bip}attr[@name="logonToken"]').text
api_headers = {'Content-Type': 'application/xml', 'X-SAP-LogonToken': logon_token}

В коде основное внимание уделяется начальному процессу аутентификации, формирующему безопасное соединение с сервером. Учетные данные пользователя, сведения о сервере и тип аутентификации настраиваются, и на указанный URL-адрес входа отправляется POST-запрос. Ответ XML от сервера анализируется для извлечения важного logonToken. Затем этот токен используется для создания заголовков для последующих запросов API, обеспечивая аутентифицированный доступ к SAP BusinessObjects.

Часть 2. Получение данных и создание фрейма данных

Просмотр полученных данных: имя первого документа

Когда мы приступаем к получению данных из SAP BusinessObjects, взгляд на полученную информацию раскрывает ее структуру. Этот фрагмент Python получает всю информацию о документах с сервера. Если вы запустите код, он выведет имя первого документа.

url = "http://{}:6405/biprws/raylight/v1/documents/".format(localhost)
response = requests.get(url,api_headers)
root = ET.fromstring(response.text)

first_docu_key = root.findall('document')[0][2].tag
first_docu_item = root.findall('document')[0][2].text
print(first_docu_key, ":", first_docu_item)

Функции преобразования данных: преобразование в DataFrame

Функции Python, get_dataframe_from_response и get_all_dataframe, работают вместе, чтобы упростить извлечение данных SAP BusinessObjects. Первая функция преобразует данные XML в структурированный DataFrame pandas, фиксируя атрибуты документа. Вторая функция эффективно обрабатывает сценарии, в которых документы превышают лимит одного запроса, путем добавления нескольких кадров данных. В совокупности эти функции упрощают преобразование XML в DataFrame и предоставляют простое решение для обработки большого количества документов.

def get_dataframe_from_response(response):
    # Parse the XML data
    root = ET.fromstring(response.text)
    # Extract the data into a list of dictionaries
    res = []
    for item in root.findall('document'):
        doc_dict = {}
        for elem in item.iter():
            if elem.text is not None:
                doc_dict[elem.tag] = elem.text
        res.append(doc_dict)
    # Convert the list of dictionaries to a pandas dataframe
    df = pd.DataFrame(res)
    return df

def get_all_dataframe(url):
    documents = []
    for i in range(50):
        offset = i * 50
        url_offset = url + "?offset={}&limit=50".format(offset)
        response = requests.get(url_offset, headers=api_headers)
        df = get_dataframe_from_response(response=response)
        if df.empty:
            break
        else:
            documents.append(df)
    dataframe = pd.concat(documents, axis=0)
    return dataframe

Легко получайте подробную информацию о документах SAP BusinessObjects, используя одну строку кода Python. Используйте функцию get_all_dataframe, и полученный в результате df_documents DataFrame предоставит простой обзор атрибутов документа.

url = "http://{}:6405/biprws/raylight/v1/documents/".format(localhost)
df_documents = get_all_dataframe(url=url)
print(df_documents.head())

Демонстрация df_documents: Ниже приводится краткий обзор структуры фрейма данных

| документ | идентификатор | мед | имя | идентификатор папки | описание | |----|----|----|----|----|----| | п | 10283 | AfZQen_U5hGgHqB8 | Отчет о доходах | 10782 | НЭН | | п | 12012 | AUgbex_JocxFfvSFw | Отчет о продажах | 11931 | НЭН | | п | 12435 | AaGqyXfPrFIuC1Eac | Отчет о затратах | 11965 | НЭН | | п | 11232 | ATvl8iD_ii2HdxkKEY | Отчет об инвентаризации | 11038 | НЭН | | п | 11023 | cyslJAAy.JAJBB13hE | Финансовый отчет | 11021 | НЭН |

Часть 3. Извлечение сведений о документе

Если вам нужны дополнительные сведения, такие как путь к документу, время последнего обновления, статус планирования, размер и статус обновления, воспользуйтесь следующей функцией. Эта функция извлекает указанные сведения для каждого документа в DataFrame df_documents, предоставляя более полный обзор каждой записи.

def get_document_detail(documentID, detail):
    url = 'http://{}:6405/biprws/raylight/v1/documents/{}'.format(localhost, documentID)
    res = requests.get(url, headers={
        "Accept": "application/json",
        "Content-Type": "application/json",
        "X-SAP-LogonToken": logon_token
    }).json()
    return res['document'][detail]

def get_more_information_from_documents(df):
        details = ['path', 'updated', 'scheduled', 'size', 'refreshOnOpen']
        for detail in details:
        df[detail] = [get_document_detail(id, detail) for id in df['id'].values]
    return df

df_documents_more_info = get_more_information_from_documents(df_documents)

Показ df_documents_more_info:

| документ | идентификатор | мед | имя | идентификатор папки | описание | путь | обновлено | запланировано | размер | обновитьOnOpen | |----|----|----|----|----|----|----|----|----|---- |----| | п | 10283 | AfZQen_U5hGgHqB8 | Отчет о доходах | 10782 | НЭН | Общие папки/Тест | 2023-06-04T08:24:23.461Z | ложный | 64613 | правда | | п | 12012 | AUgbex_JocxFfvSFw | Отчет о продажах | 11931 | НЭН | Общие папки/Тест | 2023-06-04T08:30:17.907Z | ложный | 64481 | правда | | п | 12435 | AaGqyXfPrFIuC1Eac | Отчет о затратах | 11965 | НЭН | Общие папки/Тест | 2020-06-22T02:06:55.858Z | ложный | 65471 | правда | | п | 11232 | ATvl8iD_ii2HdxkKEY | Отчет об инвентаризации | 11038 | НЭН | Общие папки/Тест | 2023-07-17T08:06:38.444Z | ложный | 171294 | правда | | п | 11023 | cyslJAAy.JAJBB13hE | Финансовый отчет | 11021 | НЭН | Общие папки/Тест/Тест | 2023-07-08T03:04:05.241Z | ложный | 168952 | правда |


Спасибо, что нашли время, чтобы вместе со мной изучить информацию, связанную с данными. Я ценю ваше участие. Если эта информация окажется для вас полезной, я приглашаю вас подписаться на меня или связаться со мной на LinkedIn. Приятного изучения!👋


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE