Archiv des Intrexx Live! Forums

Hier sehen Sie die Foreneinträge aus dem Intrexx Live! Forum. Bis November 2016 war es das Forum für alle Fragen rund um die Software Intrexx von United Planet.
Seit November 2016 gibt es ein neues moderiertes Forum, das Intrexx Community Forum. Nutzen Sie bitte unbedingt dieses für aktuelle Fragen, Antworten und Informationen.

Wichtig: Dieses Forum dient als Archiv. Die Einträge beziehen sich oft auf ältere Versionen von Intrexx und entsprechen nicht mehr den aktuellen technischen Gegebenheiten.
Daher sollten alle Inhalte ausschließlich von Experten genutzt werden. Bei unsachgemäßer Anwendung kann es zu zeitaufwändigen Problemen oder Datenverlust kommen.
Übersicht > Intrexx Connectoren und Add-ons: SAPAdapter > How-to (SAP): Anzeigen von internen Tabellen in Intrexx Ansichtstabellen

How-to (SAP): Anzeigen von internen Tabellen in Intrexx Ansichtstabellen

Nicht immer können SAP Daten über physisch vorhandene Tabellen oder Views eingebunden werden. Manchmal sind einfach die Datenmodelle im SAP zu komplex für eine vernünftige und performante Darstellung im Intrexx.
Im ABAP würde man hier auf interne Tabellen ausweichen, die aus mehreren Tabellenzugriffen erstellt und ggf. noch mit weiteren Daten (Texte) angereichert werden.

Solche internen Tabellen lassen sich auch im Intrexx als Ansichtstabelle anzeigen. Man muss dafür allerdings im ABAP diese Tabelle erstellen und an die API des SAP Adapters übergeben.

Folgende Schritte sind dafür notwendig:

[list=1]
  • Erstellen einer DDIC Struktur
    Diese wird als Transferstruktur (Format der internen Tabelle für Intrexx) verwendet. Das erste Feld sollte vom Typ CHAR oder String sein und die Informationen für einen eindeutigen Schlüssel enthalten. Dieser Schlüssel wird später für den Zugriff auf Einzeldatensätze verwendet. Empfehlung für komplexe SAP Schlüssel: Als Trennzeichen "~" verwenden.
  • Vererben der ABAP Objects Klasse /IATL/POPI_CL_IXAPI_GEN_ITAB und redefinieren der Methoden EXIT_GET_ITAB_DATA (Listenansicht) und EXIT_GET_SINGLE_VALUE (Einzeldatensatz)
  • Registrieren der eigenen Klasse
    Dazu im Customizing (Transaktion SPRO) im Pfad "SAP Customizing Einführungsleitfaden - Anwendungsübergreifende Komponenten - init.all Intrexx Portal Plugin (POPI) - Individuelle Datahandler - Handlerklasse registrieren" die eigene Klasse als speziellen Objekttyp registrieren (Objekttypname = ABAP Klasse; Transferstruktur = Name der angelegten DDIC Struktur)
  • Handler dem externen Zugriff zuordnen
    Im Customizing ("SAP Customizing Einführungsleitfaden - Anwendungsübergreifende Komponenten - init.all Intrexx Portal Plugin (POPI) - Individuelle Datahandler - Handler zuordnen") wird ein Zugriff für den Datenhandler "GENERIC_VIEW" und den Namen der Transferstruktur (in Datagroup (ix)) angelegt. Als Objekttyp wird der zuvor registrierte Objekttyp angegeben.[/list]Im Intrexx kann danach über eine Fremddatengruppe, den Handler Generic_View und als Tabellenname der Name der DDIC Struktur auf die eigene Handlerklasse zugegriffen werden. Die Datenfelder der Transferstruktur sind verfügbar und werden über die Verwendung von Datenelementen in dieser Struktur auch automatisch übersetzt.

    Die Methode EXIT_GET_ITAB_DATA wird so implementiert, dass die gewünschte interne Tabelle dort erzeugt wird. Dazu kann das folgende Mustercoding eingesetzt werden. Als Struktur ls_transfer wird die eigene Transferstruktur eingetragen.


    METHOD exit_get_itab_data.
    * ---------- local data
    * individual
    DATA: ls_transfer TYPE /iatl/popi_tcm_tf_aix.
    * general
    DATA: lt_transfer LIKE TABLE OF ls_transfer.
    DATA: lt_filter LIKE it_filter.
    DATA: ls_filter LIKE LINE OF it_filter.
    DATA: ls_orderby LIKE LINE OF it_orderby.
    DATA: lt_sql TYPE /iatl/popi_ixapi_sql_clause_t.
    DATA: lv_key TYPE /iatl/popi_ixapi_fieldvalue.

    * ---------- macros
    DEFINE get_filter.
    read table lt_filter into ls_filter
    with key fieldname = &1.
    if sy-subrc eq 0.
    &2 = ls_filter-value_low.
    else.
    clear &2.
    endif.
    END-OF-DEFINITION.

    * ========== optional activities
    " TODO: set flag IN_LIST for performance issues
    " TODO: initialize external handler class
    " set empty table initial; chance to exit
    ct_table = lt_transfer.

    * ========== check some special filter values
    lt_filter = it_filter.
    * --- get and save special filters
    " get_filter 'MY_FILTER' lv_filter_example.

    * ========== basic database selection
    * TODO: build transfer table (only keys)


    * ========== build details for export table
    LOOP AT lt_transfer INTO ls_transfer.
    lv_key = ls_id-key.
    CALL METHOD me->exit_get_single_value
    EXPORTING
    iv_key = lv_key
    it_add_info = me->add_info
    CHANGING
    cs_data = ls_transfer
    EXCEPTIONS
    not_found = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    trace( 'Error add details to record' ).
    RAISE failed.
    ELSE.
    MODIFY lt_transfer FROM ls_transfer.
    ENDIF. ENDLOOP.

    * ========== orderby
    IF it_orderby[] IS NOT INITIAL.
    READ TABLE it_orderby INTO ls_orderby INDEX 1.
    IF ls_orderby-ordertype EQ 'A'.
    SORT lt_transfer BY (ls_orderby-fieldname) ASCENDING.
    ELSE.
    SORT lt_transfer BY (ls_orderby-fieldname) DESCENDING.
    ENDIF.
    ENDIF.
    * ========== export transfer table
    ct_table = lt_transfer.
    ev_filtered = 'X'.
    ev_offset = ' '.

    ENDMETHOD.


    Das Coding muss natürlich spezielle Filter, Sortieranweisungen u.ä. aus der Oberfläche verarbeiten. Es ist zu empfehlen, die Anreicherung von Details ausschließlich in der Methode EXIT_GET_SINGLE_VALUE durchzuführen. Für die Performanceoptimierung können Daten bereits in der Methode EXIT_GET_ITAB_DATA selektiert, über die Attribute der ABAP Objects Klasse gespeichert und dann in der Methode EXIT_GET_SINGLE_VALUE verwendet werden.
  • 09.06.2011 19:44 von Jörg Müller
    Ein komplexeres Beispiel, was die Kombination eine Tabellenselektion mit anschließender Anreicherung demonstriert enthält das folgende Coding. Hier werden ungültige Filterkriterien über "kill_filter" eliminiert. Es sollte aber bereits in der Oberfläche darauf geachtet werden, dass solche Filter nicht verwendet werden können.


    method exit_get_single_value.

    * ------ local data
    data: lv_guid type /iatl/tcm_guid.
    data: ls_tcm_ui type /iatl/tcm_aix_main_ui_s.
    data: lv_error type /iatl/tcm_flag_error.
    data: lv_message type /iatl/tcm_message.
    data: ls_transfer type /iatl/popi_tcm_tf_aix.

    * ------ prepare
    move-corresponding cs_data to ls_transfer.

    * ------ get ui data
    lv_guid = iv_key.
    call function '/IATL/TCM_API_AIX_GET_DATA_UI'
    exporting
    iv_guid = lv_guid
    importing
    ev_error = lv_error
    ev_message = lv_message
    * ET_MESSAGES = ET_MESSAGES
    es_main = ls_tcm_ui
    * ET_LINK = ET_LINK
    * ET_PART = ET_PART
    * ET_ATTR = ET_ATTR
    * ET_TEXT = ET_TEXT
    .
    if lv_error eq 'X'.
    trace( lv_message ).
    raise not_found.
    else.
    move-corresponding ls_tcm_ui to ls_transfer.
    endif.

    * --------- fill back
    move-corresponding ls_transfer to cs_data.
    endmethod.
    METHOD exit_get_itab_data.

    * ---------- local data
    * individual
    DATA: lc_main_table TYPE tabname VALUE '/IATL/M_TCMAIXM'.
    DATA: lc_kf_fieldname TYPE /iatl/popi_ixapi_fieldname
    VALUE 'GUID'.
    DATA: lc_kf_operand TYPE /iatl/popi_ixapi_filt_operand
    VALUE 'DF'.
    DATA: lc_kf_value TYPE /iatl/popi_ixapi_filt_value
    VALUE '00000000000000000000000000000000'.
    DATA: ls_transfer TYPE /iatl/popi_tcm_tf_aix.
    DATA: lt_id TYPE /iatl/tcm_guid_t.* general
    DATA: lt_transfer LIKE TABLE OF ls_transfer.
    DATA: ls_id LIKE LINE OF lt_id.
    DATA: lt_filter LIKE it_filter.
    DATA: lt_filter_saved LIKE it_filter.
    DATA: ls_filter LIKE LINE OF it_filter.
    DATA: ls_orderby LIKE LINE OF it_orderby.
    DATA: lt_sql TYPE /iatl/popi_ixapi_sql_clause_t.
    DATA: lv_key TYPE /iatl/popi_ixapi_fieldvalue.

    * ---------- macros
    DEFINE get_filter.
    read table lt_filter into ls_filter
    with key fieldname = &1.
    if sy-subrc eq 0.
    &2 = ls_filter-value_low.
    else.
    clear &2.
    endif.
    END-OF-DEFINITION.

    DEFINE kill_filter.
    loop at lt_filter_saved into ls_filter
    where fieldname = &1.
    ls_filter-fieldname = lc_kf_fieldname.
    ls_filter-operand = lc_kf_operand.
    ls_filter-value_low = lc_kf_value.
    ls_filter-value_high = space.
    modify lt_filter_saved from ls_filter index sy-tabix.
    endloop.
    END-OF-DEFINITION.

    * ========== optional activities
    " TODO: set flag IN_LIST for performance issues
    " TODO: initialize external handler class
    " set empty table initial; chance to exit
    ct_table = lt_transfer.

    * ========== check some special filter values
    * --- save original filters
    lt_filter_saved = it_filter.
    lt_filter = it_filter.

    * --- get and save special filters
    " get_filter 'MY_FILTER' lv_filter_example.* --- kill special filters
    " kill_filter 'MY_FILTER'.* --- check for valid filters and kill others
    CALL METHOD me->generic_kill_filter
    EXPORTING
    iv_valid_struc = lc_main_table
    iv_fieldname = lc_kf_fieldname
    iv_operand = lc_kf_operand
    iv_value = lc_kf_value
    CHANGING
    ct_filter = lt_filter
    EXCEPTIONS
    failed = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    trace( 'wrong filter deletion' ).
    ENDIF.

    * ========== basic database selection
    * -- build sql clause
    IF lt_filter[] IS NOT INITIAL.
    CALL METHOD me->get_sql_where_from_filter
    EXPORTING
    it_filter = lt_filter
    IMPORTING
    et_sql = lt_sql
    EXCEPTIONS
    failed = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    trace( 'error building sql clause' ).
    RAISE failed.
    ENDIF.
    ENDIF.

    * -- get data
    IF lt_sql[] IS NOT INITIAL.
    SELECT guid FROM (lc_main_table)
    INTO TABLE lt_id
    WHERE (lt_sql).
    ELSE.
    SELECT guid FROM (lc_main_table)
    INTO TABLE lt_id.
    ENDIF.
    IF lt_id[] IS INITIAL.
    EXIT. " with no results
    ENDIF.

    * ========== build details for export table
    LOOP AT lt_id INTO ls_id. CLEAR ls_transfer.
    ls_transfer-guid = ls_id-guid.
    lv_key = ls_id-guid. CALL METHOD me->exit_get_single_value
    EXPORTING
    iv_key = lv_key
    it_add_info = me->add_info
    CHANGING
    cs_data = ls_transfer
    EXCEPTIONS
    not_found = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    trace( 'Error add details to record' ).
    RAISE failed.
    ELSE.
    APPEND ls_transfer TO lt_transfer.
    ENDIF. ENDLOOP.

    * ========== filter additional values
    IF lt_filter_saved[] IS NOT INITIAL.
    " redefine this method and use the commented code
    CALL METHOD me->generic_filter
    EXPORTING
    it_filter = lt_filter_saved
    CHANGING
    ct_table = lt_transfer
    EXCEPTIONS
    failed = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    trace( 'error using generic filter' ).
    RAISE failed.
    ENDIF.
    ENDIF.

    * ========== orderby
    IF it_orderby[] IS NOT INITIAL.
    READ TABLE it_orderby INTO ls_orderby INDEX 1.
    IF ls_orderby-ordertype EQ 'A'.
    SORT lt_transfer BY (ls_orderby-fieldname) ASCENDING.
    ELSE.
    SORT lt_transfer BY (ls_orderby-fieldname) DESCENDING.
    ENDIF.
    ENDIF.

    * ========== export transfer table
    ct_table = lt_transfer.
    ev_filtered = 'X'.
    ev_offset = ' '.
    ENDMETHOD.

    09.06.2011 19:46 von Jörg Müller
    Zurück | Alles über Intrexx | Impressum | Datenschutzerklärung

    Über United Planet
    © 2019 United Planet GmbH
    Schnewlinstraße 2
    79098 Freiburg