Разблокирование данных 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. Приятного изучения!👋
Оригинал