Działania na plikach

Potrafimy już tworzyć podstawowe struktury danych, wiemy też jak zalogować informację przy użyciu Balloga. Czas więc przejść do kolejnego kroku i dowiedzieć się w jaki sposób możemy przeprocesować dane zewnętrzne w ABAPie. Weźmy na przykład taki plik .csv, z którego chcielibyśmy przenieść do tabeli:

Procedura jest ogólnie będzie dość prosta – jedną tabelkę już przecież mamy. Nasz program będzie potrafił:

  • wczytać dane od użytkownika,
  • wprowadzić nowe wpisy od użytkownika do bazy ,
  • wprowadzić wpisy z serwera aplikacji do bazy.

Fajnie byłoby aby program był tak dynamicznie napisany, że nie będziemy musieli go zmieniać nawet jeżeli będziemy chcieć „wpisać” dane do tabeli określonej w pierwszej kolumnie naszego pliku. Jeżeli otworzymy zbiór danych, zobaczymy że prezentują się one następująco:

Uwaga, w tym artykule przedstawiam dwa ważne rozdziały: operacje na plikach i programowanie obiektowe. Jeśli niektóre rozwiązania są dla Ciebie niejasne, bądź też chcesz dowiedzieć się więcej to zapisz się proszę na listę mejlingową mojego kursu online o programowaniu w ABAPie, który staruje już niedługo! W kursie online znajdziesz dwie osobne lekcje w których przedstawione zagadnienia będą rozszerzone i dogłębniej wyjasnione.
* pola wymagane

Tworzymy dodatkową tabelę

Pierwszą kolumną w pliku csv oznaczona jest nazwa tabeli do której chcemy wpisać dane. Dwie kolejne zawierają dane które chcemy do podanych tabel wpisać. Potrzebujemy zatem poza tabelką ZEMPLOYEES jeszcze tabelę ZSALARIES. Możemy ją szybko utworzyć w eclipse:

Tabele mamy gotowe, fajnie byłoby gdybyśmy mogli nie tylko używać plików pobranych od użytkownika, ale również tych które są dostępne na app serwerze. O tym ostatnim jeszcze nie pisałem w żadnych z poprzednich poradników. Nowością jest tu transakcja al11, która służy w NetVeawer do przechowywania plików. Można powiedzieć, że jest ona odpowiednikiem windowsowego explorera, widać w niej foldery odpowiadające tym faktycznie umieszczonym na dysku twardym wirtualnej maszyny:

Dostęp do plików z poziomu ABAPa odpowiada dostępowi z poziomu systemu operacyjnego. Jest to o tyle ważne, że jeżeli używamy Windowsa to wielkość znaków w ścieżce do pliku nie ma znaczenia, natomiast w przypadku Linuxa jest odwrotnie. Nasz serwer aplikacji zainstalowany jest na maszynie z Linuxem, natomiast serwer prezentacji (czyli SAP GUI) możemy mieć zainstalowany na dowolnym systemie operacyjnym, np. Windows.

Nasz development będzie składać się z dwóch klas i raportu służącego do uruchomienia. Wykorzystamy tutaj dziedziczenie, czyli jedną z zalet programowania obiektowego. Jeżeli chcielibyśmy przedstawić klasy graficznie wyglądałoby to następująco:

Klasa po której będziemy dziedziczyć

1.Zacznijmy od eclipse i stwórzmy pierwszą klasę ZCL_FILE. Po pierwsze musimy zadeklarować potrzebne typy danych:

Określamy najpierw własne typy: strukturę zwierającą tylko stringi i tabelę do niej. W sekcji publicznej tworzymy również dwie metody. Pierwsza z nich ma za zadanie wpisać nasze dane do tabeli, natomiast druga jest odpowiedzialna za odczytanie przekazanej lini z tabeli i określenia do jakiej tabeli wpis powinien trafić.

2. Implementacja:

Jeżeli mimo opisu nie do końca rozumiesz co dzieje się w kodzie to się nie przejmuj. Jak program będzie już gotowy po prostu przedebugguj się przez niego.

Obsługa plików z serwera aplikacji

Zacznijmy od umieszczenia pliku na serwerze aplikacji. Jak wspominałem wcześniej w al11 możemy zobaczyć pliki w tym samym miejscu w którym widać je z poziomu systemu operacyjnego. Możemy więc przenieść je tam za pomocą ssh i nadając im uprawnienia dla npladm, lub użyć modułu funkcyjnego ARCHIVFILE_CLIENT_TO_SERVER. Ważne jest aby koniecznie przed wprowadzaniem danych zaznaczyć flagę Uppercase/Lowercase.

Następnie w path podajemy ścieżkę do pliku na naszym systemie operacyjnym (w Windows będzie ona zaczynać się prawdopodobnie od C:), natomiast w targetpath ścieżkę w której chcemy zapisać plik na serwerze aplikacji. Następnie uruchamiamy modół i sprawdzamy czy plik faktycznie znajduje się w katalogu /usr/sap/NPL/D00/work/.

Jeżeli dwa razy klikniemy w plik powinniśmy zobaczyć jego zawartość:

3. Przejdźmy teraz do definicji klasy ZCL_FILE_SERVER

Klasa dziedziczy po klasie ZCL_FILE i dlatego potrzebujemy INHERITING FROM. Po naszej klasie nie będzie można dziedziczyć, dlatego posiada dopisek „final”. Wewnątrz klasy tworzymy prywatny parametr path, który odczytać możemy za pomocą gettera a zapisać za pomocą settera. Jest to zgodne z zasadami programowania obiektowego, i umożliwia nam stworzenie np. dodatkowej walidacji w setterze gdzie możemy sprawdzić czy nasza ścieżka zawiera charakterystyczne znaki jak np. „/”. Do parametru prywatnego nie mamy dostępu zarówno z poziomu obiektu klasy, jak i w przypadku dziedziczenia. Implementacja będzie wyglądać następująco:

Raport uruchamiający przetważanie

Finalnie możemy przejść do stworzenia raportu który będzie odpowiedzialny za uruchamianie naszej implementacji:

Text elementy do raportu powinny wyglądać następująco:

Finalnie powinniśmy mieć trzy nowe klasy i raport oraz dwie tabele i plik widoczny w al11:

Przed uruchomieniem programu tabele powinny być puste, natomiast po jego uruchomieniu powinny wypełnić się danymi:

W tej lekcji to już wszystko. Jeśli plik przeprocesował się poprawnie, wpisy w obu tabelach powinny pojawić się natychmiast po uruchomieniu. Pliki utworzone podczas tej lekcji możecie znaleźć też na githubie:

https://github.com/pawelwiejkut/abap_operacje_na_plikach.git

Sprawdź też

Create new SAP Client

In SAP NetWeaver world clients are used to may purposes. One of the business purposes …