[ABAP] Odczyt pliku z archiwum do stringa

Posted on February 17, 2012, under SAP.

Ostatnio rozwiązywałam problem odczytu zdjęcia pracownika zapisanego w kartotece pracowniczej. Takie zdjęcie przechowywane jest w postaci Archive Linku i o ile ściągniecie go na dysk nie stanowi problemu (jest kilka modułów funkcyjnych, które do tego służą) to odczytanie go w sposób zrozumiały dla edytora tekstu, jakim jest MS Word już nie jest takie proste. Do zapisu dowolnych plików do formatu .doc korzystamy z dedykowanej aplikacji opartej na zapisie żądanego dokumentu w języku HTML (który jest bardzo zrozumiały dla MS Word), zatem problem ograniczył się do ściągnięcia zdjęcia w formacie akceptowalnym dla tagu IMG – w postaci inline. Dzięki temu nie musimy zapisywać oddzielnie obrazków, linkować ich do pliku i martwić się, czy na pewno zawsze będą w lokalizacji, w której je zapisaliśmy. W zapisie obrazka inline, nasze zdjęcie jest zapisane w postaci ciągu znaków w treści dokumentu HTML.

Konkretniej – będziemy konwertować obrazki z postaci binarnej do stringa o podstawie 64bitowej. Taką konwersję dla dowolnego pliku można zrobić np. w takim edytorze. Po wczytaniu i przekonwertowaniu obrazka w takim edytorze otrzymamy ciąg znaków, który możemy wstawić w HTMLowy tag IMG:

<img src=”data:image/jpeg;base64,CIĄG_ZNAKÓW_OBRAZKA” height=”100″ width=”100″/>

Aby powyższy ciąg znaków otrzymać dla dokumentu zapisanego w archiwum wykorzystamy cztery moduły funkcyjne:

1. Pobieramy listę dokumentów przypisanych do pracownika – wykorzystujemy do tego funkcję ARCHIV_CONNECTINFO_GET_META. Ważne, żeby w parametrze object_id podać numer pracownika i na końcu gwiazdkę (*) np. ’10000021*’

  CALL FUNCTION 'ARCHIV_CONNECTINFO_GET_META'
    EXPORTING
      object_id    = lv_objid
      ar_object    = ''
      sap_object   = 'PREL'
    IMPORTING
      number       = lv_number_hits
    TABLES
      connect_info = lt_hit_table
    EXCEPTIONS
      OTHERS       = 1.

2. Tabela lt_hit_table zawiera wszystkie dokumenty przypisane do osoby. Nas interesują zdjęcia ( pole ar_object w tabeli = HRICOLFOTO). Szukamy wybranego wpisu (ja go zapisałam do ls_hit_table) i dla niego wywołujemy kolejną funkcję – ARCHIVEOBJECT_GET_TABLE, która pobiera plik binarnie do tabelki:

    doc_type = ls_hit_table-ar_object.
    CALL FUNCTION 'ARCHIVOBJECT_GET_TABLE'
    EXPORTING
      archiv_id                = ls_hit_table-archiv_id
      document_type            = doc_type
      archiv_doc_id            = ls_hit_table-arc_doc_id
    TABLES
      binarchivobject          = binary_tab
    EXCEPTIONS
      error_archiv             = 1
      error_communicationtable = 2
      error_kernel             = 3
      OTHERS                   = 4.

3. Obliczamy długość pliku (raczej mało elegancko):

  length = LINES( binary_tab ).
  length = length * 1024.

4. Wywołujemy funkcję SCMS_BINARY_TO_XSTRING, która stworzy nam jeden ciąg bajtów w postaci xtsringa z tabelki binarnej:

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = length
      first_line   = 0
      last_line    = 0
    IMPORTING
      buffer       = lv_pic_xstring
    TABLES
      binary_tab   = binary_tab
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

5. Teraz wystarczy tylko zakodować wynik do postaci stringa o podstawie 64bitowej:

  CALL FUNCTION 'SSFC_BASE64_ENCODE'
    EXPORTING
      bindata                  = lv_pic_xstring
    IMPORTING
      b64data                  = lv_picture
    EXCEPTIONS
      ssf_krn_error            = 1
      ssf_krn_noop             = 2
      ssf_krn_nomemory         = 3
      ssf_krn_opinv            = 4
      ssf_krn_input_data_error = 5
      ssf_krn_invalid_par      = 6
      ssf_krn_invalid_parlen   = 7
      OTHERS                   = 8.

W zmiennej lv_picture mamy ciąg znaków, który możemy wkleić w tag img.

ABAP: poszukiwanie logicznej bazy danych na podstawie nazwy tabeli

Posted on May 4, 2010, under SAP.

For English please choose the language in the right panel –>

Wychodząc naprzeciw różnym dziwnym potrzebom ABAPerów zamieszczam poniższe.

Aby znaleźć logiczną bazę danych posiadając jedynie nazwę tabeli należy skorzystać z transakcji SE36 – edytor logicznej bazy danych. Wybieramy Dodatki -> Wykorzystanie tabeli i podajemy nazwę tabeli. Rezultatem jest lista logicznych baz danych, które z niej korzystają.

I tak np. dla tabeli PERNR otrzymujemy LDB: PNP (Dane podstawowe HR) i PNPCE (Dane podst. HR wraz z równoczesnymi etatami).

Ta wiedza może przydać np. przy eksploracji mało znanych nam modułów ERP, kiedy jednym z niewielu punktów zaczepienia, jakim dysponujemy jest jedna z tabel z danego obszaru. Quick&useful.

Pomoc wyszukiwania dla PCHOBJID w raporcie z PNP

Posted on February 3, 2010, under SAP.

Spotkałam się ostatnio z problemem w programie w SAP HR, konkretniej w HR-PA. Piszę aplikację, która w założeniu opiera się na bazie PNP, ale pewna jej funkcjonalność korzysta ze struktury organizacyjnej, czyli z bazy PCH. Wygenerowanie pól ekranu selekcji, takiego jak w programie opartym na bazie PCH nie stanowi większego problemu. Kłopot pojawia się dopiero, kiedy chcemy dodać pomoc wyszukiwania do pola ID obiektu – standardową dla ekranu selekcji raportu ze struktury.

(more…)

s-community-owana

Posted on November 22, 2009, under SAP, Luźne refleksje.

Społeczności internetowe – ostatnio zaczynam odkrywać potencjał drzemiący pod tym coraz częściej używanym wyrażeniem. I nie chodzi mi tutaj bynajmniej o społeczności znane i popularne, takie jak nasza-klasa, grono, facebook, nawet nie goldenline, czy linkedin. Warto przyjrzeć się tym, które wydają się być najciekawsze i są więcej niż tylko czystą rozrywką – zrzeszające developerów, programistów, konsultantów i szerokie kręgi IT.

Na początek: Microsoft Groups w wydaniu z nazego podwórka, czyli po polsku. Tak naprawdę każdy użytkownik, programista, czy też pasjonat technologii MS znajdzie tu coś dla siebie – dla każdego coś miłego. Ja zaczęłam od – jakżeby inaczej – Women in Technology i już pierwsze spotkanie, w którym miałam przyjemność uczestniczyć nastroiło mnie bardzo pozytywnie. Miło, gdy kobiety na co dzień współpracujące głównie z mężczyznami spotykają się w gronie innych kobiet mających podobne zainteresowania i problemy. Zdecydowanie popieram! I wybieram się na kolejne spotkanie.

Nie sposób nie wspomnieć także o Microsoft Developer Network, czyli po prostu o MSDN. Kopalnia wiedzy i informacji. Blogi, artykuły, pomoc, publikacje i mnóstwo innych.

Wygląda na to, że duże korporacje IT działają na wielu płaszczyznach podobnie zatem pojawia się pytanie: czy tylko gigant z Redmond przejawia takie inicjatywy? Z mojego punktu widzenia, w naturalny sposób uwaga kieruje się na SAP. Z całkiem niezłym efektem: SAP Developer Network, czyli SDN. Zbieżność nazw nie jest przypadkowa, zatem najbardziej można go porównać z Microsoft’owym MSDN’em. Co prawda brakuje między innymi typowych społeczności offline’owych, ale jak na firmę o dużo węższym spektrum produktów niż MS – jest co najmniej nieźle. Nie mówiąc o tym, że zna go każdy szanujący się developer, czy konsultant SAP.

Wygląda na to, że korporacje IT nauczyły się wspierać programistów i zaawansowanych użytkowników swoich produktów w bardzo prosty sposób – nimi samymi. Udostępniając serwisy wspomagające dzielenie się wiedzą i umiejętnościami, a także kontaktami i znajomościami. Popierając społeczności online i offline. Organizując konferencje (patrz: Microsoft TechEd oraz SAP TechEd – zbieżność nazw znowu nie wydaje się przypadkowa ;)). Oczywiście z drugiej strony, to wspaniałe pole do poszukiwania nowych, utalentowanych i w dodatku idealnych (bo kochających to, co robią) potencjalnych pracowników. Pytanie, kto tak naprawdę bardziej na tym korzysta – firma, czy programista-pasjonat – pozostaje otwarte.