Połaczenie do kostki SAP BW z poziomu Pythona

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
muskagap
Posty: 4
Rejestracja: wt maja 06, 2025 5:01 pm
Has thanked: 1 time
Been thanked: 1 time

Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: muskagap »

Hej, nie wiem czy mieliście okazję korzystac z tego rozwiązania le może wiecie jak pomóc. Łączę się do kostki SAP BW z poziomu Fabrica (dokładniej Notebooka gdzie używam Pythona). Do połączenia z SAP BW używam biblioteki DuckDb + rozszerzenia ERPL. Podążam za dokumentacją tejże bilblioteki, kod jak niżej:

Kod: Zaznacz cały

conn = duckdb.connect(config={"allow_unsigned_extensions": "true"})
conn.sql("SET custom_extension_repository = 'http://get.erpl.io';")
conn.install_extension("erpl")
conn.load_extension("erpl")

conn.sql("""
SET sap_ashost = 'sapmsphb.unix.xyz.net';
SET sap_sysnr = '99';
SET sap_user = 'user_name';
SET sap_password = 'some_pass';
SET sap_client = '019';
SET sap_lang = 'EN';
""")
Roszerzenie ERPL ładuje się bez problemów. Ale jak wykonuję kod otrzymuję ten error:
CatalogException: Catalog Error: unrecognized configuration parameter "sap_ashost"
Kiedy testowo łączę się do kostki SAP BW Application Server przez konektor Fabrica (Dataflow) to generuje mi się od razu kod w Power M, wraz z ustawieniami połączenia, które wykorzystuję właśnie w kodzie wyżej:

Kod: Zaznacz cały

Source = SapBusinessWarehouse.Cubes("sapmsphb.unix.xyz.net", "99", "019", [LanguageCode = "EN", Implementation = "2.0"])
Wiecie może dlaczego błąd wskazuje, że parametr nie jest rozpoznany? Działam zgodnie z dokumentacją:
https://erpl.io/docs/integration/connec ... h_sap.html. Mój kod jest w sumie identyczny jak w dokumentacji a jednak rzuca błędem, tym bardziej że przecież parametr 'sap_ashost' widnieje wyraźnie w dokumentacji.
yacol
Posty: 578
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 10 times
Been thanked: 188 times

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: yacol »

Dotychczas do wywołania RFC w SAP z poziomu Pythona używałem PyRFC. Przyznam, że nie znałem rozwiązania opartego o DuckDb + ERPL. Wygląda to ciekawie i zdecydowanie warto się temu przyjrzeć :) nie wiem czy znajdziesz szybko odpowiedź. Z tego co widzę to pytałeś też na Stack Overflow i na Reddit. Daj znać czy udało się temat rozwiązać. Trochę faktycznie to dziwne, że nie jest rozpoznawany kluczowy parametr definiujący adres serwera aplikacyjnego SAP. Jesteś pewien, że rozszerzenie ERPL jest poprawnie zainstalowane i zainicjowane w Twoim przypadku?

Rozumiem, że nie dostajesz:

Kod: Zaznacz cały

-- Loading ERPL Trampoline Extension. --
(The purpose of the extension is to extract dependencies and load the ERPL implementation)
Saving ERPL SAP dependencies to '/home/jr/.duckdb/extensions/v0.9.2/linux_amd64' and loading them ... done
ERPL extension extracted and saved to /home/jr/.duckdb/extensions/v0.9.2/linux_amd64.
ERPL implementation extension installed from /home/jr/.duckdb/extensions/v0.9.2/linux_amd64/erpl_impl.duckdb_extension.
ERPL implementation extension loaded. For instructions how to use it visit https://erpl.io
tylko komunikat błędu:

Kod: Zaznacz cały

CatalogException: Catalog Error: unrecognized configuration parameter "sap_ashost"
Może jednak coś jest nie tak z instalacją ERPL?

Przy okazji:
W linku, który wkleiłeś brakuje 'l' na końcu, powinno być https://erpl.io/docs/integration/connec ... h_sap.html
Pozdrawiam,

Jacek Witczak
http://novertio.pl
muskagap
Posty: 4
Rejestracja: wt maja 06, 2025 5:01 pm
Has thanked: 1 time
Been thanked: 1 time

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: muskagap »

Hej, tak, dużo wczoraj grzebałem w tym temacie ale tak naprawdę nigdzie nie dostałem odpowiedzi. Natomiast gdzieś widziałem sugestię, że może być niezgodność wersji DuckDb i ERPL. I faktycznie, w środowisku Fabrica zainstalowałem sobie wersję 1.2.2 a w dokumentacji ERPL jest napisane:
At this point of time, ERPL supports version 0.10.3 and 1.0.0 of DuckDB.
więc obniżyłem wersję do 1.0.0 i działa:)

Co do pyRFC, z tego co czytałem to SAP wystawia swoje RFC API i tą biblioteka możemy się tam łączyć natomiast u mnie jest taki case, że nikt żadnego API po stronie SAP BW raczej nie skonfiguruje i nawet za bardzo firma nie chce, żeby się podłączać pod to API z różnych powodów (duża ilośc odpytań) choć faktycznie to byłoby najlepsze rozwiązanie. W moim przypadku jedyna opcją jest korzystanie z Notebooka w Fabricu i w jakiś sposób z tego poziomu muszę się dobić do danych. Inną opcja byłoby łączenie się przez ODBC no ale nie zainstaluję w środowisku Fabrica tych sterowników (co innego gdybym miał on-premowy cluster Databricsa). Dlatego jedyna opcją jest skorzystanie z DuckDb + ERPL, gdzie pod spodem korzysta on z interfejsu RFC. Innej opcji nie widzę prawdę mówiąc na ominięcie Dataflow.

Obecnie udało mi się dobić do serwera SAP BW natomiast port który wywołuję nie odpowiada więc musze podpytać IT na którym porcie stoi SAP BW. Inna kwestia jest to, i nie wiem czy do przeskoczenia, że Dataflow łaczy się do SAP BW przez Gatewaya. Nie wiem czy istnieje możliwość żeby dobić się w takim przypadku do przez Notebooka w Fabricu. Z drugiej strony tu jest artykuł: https://erpl.io/blog/integrate-sap-microsoft-fabric/ gdzie pokazana jest możliwość dobicia się do SAP BW z poziomu Fabrica czyli jakby Gateway byśmy pomijali w jakiś sposób ta biblioteką a uderzali prosto na port. To mnie w sumie zastanawia.
Ostatnio zmieniony śr maja 07, 2025 11:13 am przez muskagap, łącznie zmieniany 1 raz.
dominik.tylczynski
Posty: 8694
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 2085 times
Been thanked: 1552 times

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: dominik.tylczynski »

yacol pisze: śr maja 07, 2025 8:48 am Przy okazji:
W linku, który wkleiłeś brakuje 'l' na końcu, powinno być https://erpl.io/docs/integration/connec ... h_sap.html
Skorygowałem w oryginalnym poście.
yacol
Posty: 578
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 10 times
Been thanked: 188 times

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: yacol »

Wiesz, generalnie w SAP BW są dostępne obiekty OLAP BAPI takie jak MDDataSetBW czy MDDataProviderBW. Pod spodem jest to cała banda standardowych modułów funkcyjnych BAPI (a więc i RFC), które można wołać np. przez zwykłe PyRFC. Choćby z powodów wydajnościowych bym się nad tym pochylił. Jak zauważyłeś - combo DuckDb + ERPL, pod spodem korzysta z RFC więc skoro możesz się pozbyć tej dodatkowej warstwy - pewnie będzie szybciej i wydajniej :) Baaaardzo dawno temu (jakoś tak w 2003 roku), dla pewnej globalnej firmy z Wronek w Wielkopolsce ;) robiłem coś z kwerendami MDX wykonywanymi w SAP BW, korzystając po stronie klienckiej z aplikacji, którą pisaliśmy w Visual Basic for Applications (MS Office) i właśnie tam korzystaliśmy z OLAP BAPIs choć używane też było ADO MD - jeśli mnie pamięć nie myli. To było ponad 20 lat temu i pewnie od tego czasu mnóstwo się zmieniło ale jest to zawsze jakiś punkt zaczepienia.

Metody obiektu MDDataProviderBW to między innymi:

GetCatalogs (BAPI_MDPROVIDER_GET_CATALOGS)
GetCubes (BAPI_MDPROVIDER_GET_CUBES)
GetDimensions (BAPI_MDPROVIDER_GET_DIMENSIONS)
GetHierarchies (BAPI_MDPROVIDER_GET_HIERARCHYS)
itd.

Metody obiektu MDDataSetBW mto między innymi:
GetAxisData (BAPI_MDDATASET_GET_AXIS_DATA)
FindTuple (BAPI_MDDATASET_FIND_TUPLE)
FindCell (BAPI_MDDATASET_FIND_CELL)
GetCellData (BAPI_MDDATASET_GET_CELL_DATA)
itd.

Szczegóły znajdziesz w sieci (słowa kluczowe: OLAP BAPI, Staging BAPI) oraz w transakcji BAPI w SAP (pamiętaj żeby się zalogować do systemu po angielsku).

Temat jest na 100% ciekawy - daj znać jak Ci poszło :)
Pozdrawiam,

Jacek Witczak
http://novertio.pl
dominik.tylczynski
Posty: 8694
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 2085 times
Been thanked: 1552 times

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: dominik.tylczynski »

yacol pisze: śr maja 07, 2025 9:43 pm Baaaardzo dawno temu (jakoś tak w 2003 roku), dla pewnej globalnej firmy z Wronek w Wielkopolsce ;) robiłem coś z kwerendami MDX wykonywanymi w SAP BW, korzystając po stronie klienckiej z aplikacji, którą pisaliśmy w Visual Basic for Applications (MS Office) i właśnie tam korzystaliśmy z OLAP BAPIs choć używane też było ADO MD - jeśli mnie pamięć nie myli. To było ponad 20 lat temu i pewnie od tego czasu mnóstwo się zmieniło ale jest to zawsze jakiś punkt zaczepienia.
Pamiętam, pamiętam... :D
muskagap
Posty: 4
Rejestracja: wt maja 06, 2025 5:01 pm
Has thanked: 1 time
Been thanked: 1 time

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: muskagap »

Ok, jeszcze będziemy zgłębiać temat z IT i w razie czego będę podpytywał albo dawał znać. Zasadniczo chyba stanie na tym, że postawimy VM na Azurze i stamtąd będziemy łączyć się do Fabrica (ładowanie danych z kostek do Lakehouse) i do SAP BW bo inaczej nie da rady. Czytałem, że odpytywanie kostek przez pyrfc może być skomplikowane i dlatego jest ten duckdb+erpl, który to ułatwia sowimmi wbudowanymi funkcjami. Ale na razie nie stawiam tez, musze potestować. Dzięki za sugestie, poczytam.
muskagap
Posty: 4
Rejestracja: wt maja 06, 2025 5:01 pm
Has thanked: 1 time
Been thanked: 1 time

Re: Połaczenie do kostki SAP BW z poziomu Pythona

Post autor: muskagap »

Mam jeszcze pytanie odnośnie architektury w poruszonym przeze mnie przypadku (czyli ekstrakcja danych z SAP BW do chmury). Jako, że masz spore doświadczenie chciałbym podpytać jaka byłaby najlepsza praktyka:

1. Azure Databrics + PySpark
- tutaj na klastrze Databricsa instalujemy ODBC lub biblioteki DuckDb+ERPL i łączymy się nimi do SAP BW
- wymagany VPN lub Azure ExpressRoute do łączenia się na linii chmura -> on-prem czyli do SAP BW z poziomu VM
- ładowanie gotowych tabel z Databrics (w schemie star) do Fabrica/Power BI przy użyciu konektora Databrics, dostepnego w tych toolach

2. Azure VM + PySpark
- tu podobnie tworzymy VM i instalujemy ODBC, ew. biblioteki pythona j.w.
- wymagany VPN/ExpressRoute do łączenia chmura -> on-prem
- ładowanie danych do Lakehouse na Fabricu przez REST API

W głównej mierze chodzi mi o sposób na łączenie się z chmury do on-prema i tutaj z tego co wiem robimy to przez VPN albo ExpressRoute. Jak widziałbyś takie rozwiązanie? Czy masz ewentualnie inny pomysł na architekturę w tym zakresie?