XML Inhalt auslesen / auswerten

Integration von Systemen.
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

XML Inhalt auslesen / auswerten

Beitrag von jspranz (ForumUser / 76 / 5 / 0 ) »
Hallo,

ich habe das Problem, daß ich von einem anderenSAP-System im XI Prüfen möchte, ob wirklich die Daten imXI angekommen sind. (es kam leider schon öfters vor,daß die Daten den Status im SXMB_MONI als korrekt versendetdrinstanden aber letztendlich nicht wirklich im XI angekommensind. (somit sind sie auch nicht zu Lieferanten und Kundenetc.)

Leider gibt es in der Tabelle SXMSPMAST kein Feld in dem dieeindeutigen Schlüssel stehen. Deshalb muß unbedingtnoch der Inhalt der XML mit ausgewertet werden.

Wie komme ich an die korrekten Daten.

1. Lesen der Tabelle SXMSPMAST
2. Lesen SXMSPEMAS? / SXMSPVERS?
alternativ FuBA: SXMB_SELECT_MESSAGES
3. Lesen Clustertabellen: SXMSCLUP oder SXMSPCLUR?
alternativ objektorientiert?

Ich bekomme dies einfach nicht hin, da meine Kenntnisse mitClustertabellen bzw. mit der Objektorientierung sehr gering bis garnicht vorhanden sind....

Es gibt wenige Reports, aber die sind wegen derObjektorientierung für mich sehr schwer zu verstehen. Diesehaben auch nicht nur etwas mit dem Lesen der Daten zu tun, sondernvielmehr mit der Aufbereitung der Daten zur Anzeige (Tree-Conrolsu.a.).

Sicherlich haben andere hier im Forum schon ähnlicheProbleme gehabt bzw. werden Sie noch haben.

Wenn jemand eine Lösung hätte wäre daswirklich super.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: XML Inhalt auslesen / auswerten - Klassen / Methoden

Beitrag von jspranz (ForumUser / 76 / 5 / 0 ) »
Funktioniert in unserem SRM-System
SAP_BASIS 620 0061 SAPKB62061 SAP Basiskomponente
SAP_ABA 620 0061 SAPKA62061 Anwendungsübergreifende Komponente
BBPCRM 400 0003 SAPKU40003 BBPCRM
PI_BASIS 2003_1_620 0000 - PI_BASIS 2003_1_620
ST-PI 2008_1_620 0001 SAPKITLRB1 SAP Solution Tools Plug-In
WP-PI 600_620 0000 - WP-PI 600_620 : Add-On Installation
APPINT 200_620 0005 SAPK-20005INAPPINT SAP Exchange Infrastructure 2.0
ST-A/PI 01L_CRM400 0000 - Application Servicetools BBPCRM 400

Code: Alles auswählen.

FUNCTION zide_get_xml_overview.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  EXPORTING
*"     VALUE(ET_DATA) TYPE  ZIDE_GET_XML_OVERVIEW_T
*"     VALUE(RETURN) TYPE  CHAR70
*"----------------------------------------------------------------------
* for checking the import-parameter (convert time stamp)
  DATA lv_time TYPE t.
  DATA lv_date TYPE d.
* for get xml-data
  DATA: lv_message TYPE REF TO if_xms_message.
* dataara for et_data
  DATA  es_data LIKE LINE OF et_data.
* Definitionen für interne XML Inhalt
  TYPE-POOLS: ixml.
  CLASS cl_ixml DEFINITION LOAD.
  DATA:  li_ifmsg   TYPE REF TO if_xms_message,
         li_msg     TYPE REF TO if_xms_message_xmb,
         li_pay     TYPE REF TO if_xms_payload,
         lv_payxstr TYPE xstring,
         li_ixmlfactory TYPE REF TO if_ixml,
          iparser TYPE REF TO if_ixml_parser,
         li_streamfactory TYPE REF TO if_ixml_stream_factory,
          istream TYPE REF TO if_ixml_istream,
          idocument TYPE REF TO if_ixml_document,
          lv_xpath TYPE string,
          root TYPE REF TO if_ixml_element,
          el   TYPE REF TO if_ixml_element,
          vl   TYPE string.
*
* initial tables
*
  CLEAR gt_header[].
  CLEAR et_data[].
*
* Kopfsätze lesen
*
  SELECT * FROM sxmspmast INTO TABLE gt_header.
 
* Test
*  DELETE gt_header WHERE msgguid <> '449A7E24772041FBE10000000A010029'.
*
* for xml-content-read
*
  li_ixmlfactory = cl_ixml=>create( ).
  li_streamfactory = li_ixmlfactory->create_stream_factory( ).
*
* Selectierte Sätze abarbeiten
*
  LOOP AT gt_header ASSIGNING <gs_header>.
* only if correct xi-system
    SELECT SINGLE msgguid FROM sxmspemas
                          INTO <gs_header>-msgguid
                          WHERE msgguid   = <gs_header>-msgguid
                          AND   ib_system = iv_xi_system.
    CHECK sy-subrc = 0.

* Nur Order_CreateOrChangeVendorView_Out berücksichtigen
    SELECT SINGLE msgguid FROM sxmspemas
                          INTO <gs_header>-msgguid
                          WHERE msgguid = <gs_header>-msgguid
                          AND   ob_name  = 'Order_CreateOrChangeVendorView_Out'.
    CHECK sy-subrc = 0.

    CLEAR es_data.

    MOVE-CORRESPONDING <gs_header> TO es_data.
*
* XML Inhalt lesen
*
    TRY.
        IF gcl_xms_persist IS INITIAL.
          CREATE OBJECT gcl_xms_persist.
        ENDIF.
        CALL METHOD gcl_xms_persist->read_msg
          EXPORTING
            im_msgguid = <gs_header>-msgguid
            im_pid     = <gs_header>-pid
*            im_version = lv_last_version
            im_version = 0
          IMPORTING
            ex_message = li_ifmsg.
      CATCH cx_xms_persist .
      CATCH cx_xms_system_error .
    ENDTRY.

    li_msg ?= li_ifmsg.
    li_pay = li_msg->getpayloadwithmaindocument( ).

    TRY.
        lv_payxstr = li_pay->getbinarycontent( ).
      CATCH cx_xms_exception.
      CATCH cx_xms_system_error.
      CATCH cx_sy_ref_is_initial. "keine Daten gefunden
        return = text-e05.
        es_data-error = text-e05.
        APPEND es_data TO et_data.
        CONTINUE. "next record - keine Daten in XML?
    ENDTRY.

*       Create DOM
    CALL METHOD li_streamfactory->create_istream_xstring
      EXPORTING
        string = lv_payxstr
      RECEIVING
        rval   = istream.
*  istream = streamfactory->create_istream_xstring( lv_payxstr ).
    idocument = li_ixmlfactory->create_document( ).
    iparser = li_ixmlfactory->create_parser( stream_factory = li_streamfactory
                                          istream = istream
                                          document = idocument ).
    iparser->parse( ).
    root = idocument->get_root_element( ).
*
* Object-ID = Order-Number
*
    lv_xpath = '/ns1:Order/OrderHeader/OrderID'.
    el   = root->find_from_path( path = lv_xpath ).
    IF el IS BOUND.
      es_data-object_id = el->get_value( ).
    ENDIF.
*
* Member-Number
*
    lv_xpath = '/ns1:Order/OrderHeader/UserDefinedExtension'.    "[Name="ZMITGLIED"]/Value'.
    el   = root->find_from_path( path = lv_xpath ).
    DO .

      IF el IS BOUND.

        DATA: udename TYPE string,
              udevalue TYPE string,
              elname TYPE REF TO if_ixml_element,
              elvalue TYPE REF TO if_ixml_element.

        elname   = el->find_from_path( path = 'Name' ).
        IF elname IS BOUND.
          udename = elname->get_value( ).

          CASE udename.
            WHEN 'ZMITGLIED'.
              elvalue   = el->find_from_path( path = 'Value' ).
              IF elvalue IS BOUND.
                es_data-zmitglied = elvalue->get_value( ).
              ENDIF.
            WHEN 'ZWEMPF'.
              elvalue   = el->find_from_path( path = 'Value' ).
              IF elvalue IS BOUND.
                es_data-zwempf = elvalue->get_value( ).
              ENDIF.
          ENDCASE.

          IF NOT es_data-zwempf IS INITIAL AND NOT es_data-zmitglied IS INITIAL.
            EXIT.
          ENDIF.

        ELSE.
          EXIT.
        ENDIF.

* konvertiere IF_IXML_NODE nach IF_IXML_ELEMENT
        DATA: elnode TYPE REF TO if_ixml_node.
        elnode = el->get_next( ).
        IF NOT elnode IS BOUND.
          EXIT.
        ENDIF.
        el ?= elnode->query_interface( ixml_iid_element ).

      ELSE.
        EXIT.
      ENDIF.

    ENDDO.

    IF es_data-zwempf IS INITIAL.
      es_data-zwempf = es_data-zmitglied.
    ENDIF.
    APPEND es_data TO et_data.

  ENDLOOP.

ENDFUNCTION.


Auf einem anderen XI-System (XI 3.0) funktioniert es nicht, da es z.B. die Methode cl_xms_persist->read_msg nicht gibt (read_msg_pub gibt es)
Dann funzt auch diese Anweisung nicht mehr:
li_pay = li_msg->getpayloadwithmaindocument( ).

SAP_ABA 640 0009 SAPKA64009 Anwendungsübergreifende Komponente
SAP_BASIS 640 0017 SAPKB64017 SAP Basiskomponente
PI_BASIS 2004_1_640 0006 SAPKIPYI66 Basis Plug-In (PI_BASIS) 2004_1_640
ST-PI 2008_1_640 0001 SAPKITLRC1 SAP Solution Tools Plug-In
SAP_BW 350 0009 SAPKW35009 Business Information Warehouse
ST-A/PI 01L_BCO640 0000 - Servicetools for other App./Netweaver 04

Leider ist die objektorientierte Programmierung für mich ein Femdwort, vielleicht hat mir aber jemand einen ähnlichen ABAP-Code (Beispiel) für dieses System.
Wenn jemand das gleiche mit einem direkten Zugriff auf die Tabellen schon realisiert hat, wäre das auch eine Lösung :-)

Re: XML Inhalt auslesen / auswerten

Beitrag von jspranz (ForumUser / 76 / 5 / 0 ) »
:D :) Lösung funktioniert so:

Code: Alles auswählen.

FUNCTION Z_XML_OVERVIEW .
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(DELETEDATABEFORE) TYPE  STRING OPTIONAL
*"     VALUE(CREATENEWDATA) TYPE  STRING DEFAULT 'X'
*"     VALUE(WRITENEWDATAINDB) TYPE  STRING DEFAULT 'X'
*"     VALUE(GETDATABACKNEWDATA) TYPE  STRING DEFAULT 'X'
*"     VALUE(GETDATABACKOLDDATA) TYPE  STRING DEFAULT 'X'
*"  EXPORTING
*"     REFERENCE(ERRORS) TYPE  STRING
*"  TABLES
*"      ET STRUCTURE  Z_XMLDATA OPTIONAL
*"----------------------------------------------------------------------

  DATA: gt_header TYPE table of sxmspmast.
  data: gs_header like line of gt_header.
  field-symbols: <fsheader> like gs_header.

  data: gt_new   type table of z_xmldata.
  data: gs_new   like line of gt_new.
  data: gt_old   like gt_new.
  data: gs_old   like gs_new.

  TYPE-POOLS: ixml.
  CLASS cl_ixml DEFINITION LOAD.

  DATA:  li_ifmsg   TYPE REF TO if_xms_message,
       li_msg     TYPE REF TO if_xms_message_xmb,
       li_pay     TYPE REF TO if_xms_payload,
       lv_payxstr TYPE xstring,
       li_ixmlfactory TYPE REF TO if_ixml,
        iparser TYPE REF TO if_ixml_parser,
       li_streamfactory TYPE REF TO if_ixml_stream_factory,
        istream TYPE REF TO if_ixml_istream,
        idocument TYPE REF TO if_ixml_document,
        lv_xpath TYPE string,
        root TYPE REF TO if_ixml_element,
        el   TYPE REF TO if_ixml_element,
        vl   TYPE string.

*
* Löschen komplette Tabelle
*
  if deletedatabefore = 'X'.
    delete from z_xmldata.
  endif.
*
* Neue Sätze ermitteln
*
  if createnewdata = 'X'.
* letztes Erstelldatum ermitteln
    select INITTIMEST into gs_old-inittimest from z_xmldata order by inittimest descending.
      exit.
    endselect.
* Daten ab ermitteltem letzten Erstelldatum lesen
    select * from sxmspmast as sxmspmast
             join sxmspemas as sxmspemas
             on  sxmspmast~msgguid = sxmspemas~msgguid
             and sxmspmast~pid     = sxmspemas~pid
             into corresponding fields of table gt_header
             where inittimest ge gs_old-inittimest
             and   PARENTMSG       = ' '
             and   ob_name         like 'Order%'
             and   ob_system       like 'SRM_%'
             order by inittimest.
*    break spranz.
* Sicherheitshalber nochmals nachschauen, ob Daten schon in Tabelle
    loop at gt_header assigning <fsheader>.
      select single * from z_xmldata into gs_old where msgguid = <fsheader>-msgguid and pid = <fsheader>-pid.
      if sy-subrc = 0.
        delete gt_header. "Satz löschen, da er sonst doppelt wäre
        continue.
      endif.
* Daten der XML zuusammenstellen
      CLEAR gs_new.
      MOVE-CORRESPONDING <fsheader> TO gs_new.

*----------
* Beginn Durchparsen der XML
*----------
*
* XML Inhalt lesen
*
******
      TRY.
          IF gcl_xms_persist IS INITIAL.
            CREATE OBJECT gcl_xms_persist.
          ENDIF.
          CALL METHOD gcl_xms_persist->read_msg_all
            EXPORTING
              im_msgguid = <fsheader>-msgguid
              im_pid     = <fsheader>-pid
*            im_version = lv_last_version
              im_version = 0
            IMPORTING
              ex_message = li_ifmsg.
        catch cx_xms_syserr_persist.
      ENDTRY.

      li_msg ?= li_ifmsg.
*****************************************
      li_pay = li_msg->GET_PAYLOAD_WITH_MAIN_DOCUMENT( ).
*
      TRY.
          lv_payxstr = li_pay->getbinarycontent( ).
        CATCH cx_xms_exception.
        CATCH cx_xms_system_error.
        CATCH cx_sy_ref_is_initial. "keine Daten gefunden
          errors = 'Es sind Fehler die aus den Tabelleinhalten ersichtlich sind'.
          gs_new-error = 'Fehler bei der Payloadermittlung |'.
          CONTINUE. "next record - keine Daten in XML?
      ENDTRY.

*       Create DOM
      li_ixmlfactory  = cl_ixml=>create( ).
      li_streamfactory  = li_ixmlfactory->create_stream_factory( ).
*****
      CALL METHOD li_streamfactory->create_istream_xstring
        EXPORTING
          string = lv_payxstr
        RECEIVING
          rval   = istream.
*  istream = streamfactory->create_istream_xstring( lv_payxstr ).
      idocument = li_ixmlfactory->create_document( ).
      iparser = li_ixmlfactory->create_parser( stream_factory = li_streamfactory
                                            istream = istream
                                            document = idocument ).
      iparser->parse( ).
      root = idocument->get_root_element( ).
**
** Object-ID = Order-Number
**
      lv_xpath = '/ns1:Order/OrderHeader/OrderID'.
      el   = root->find_from_path( path = lv_xpath ).
      IF el IS BOUND.
        gs_new-object_id = el->get_value( ).
      ENDIF.
**
** Member-Number
**
      lv_xpath = '/ns1:Order/OrderHeader/UserDefinedExtension'.    "[Name="ZMITGLIED"]/Value'.
      el   = root->find_from_path( path = lv_xpath ).
      DO .

        IF el IS BOUND.

          DATA: udename TYPE string,
                udevalue TYPE string,
                elname TYPE REF TO if_ixml_element,
                elvalue TYPE REF TO if_ixml_element.

          elname   = el->find_from_path( path = 'Name' ).
          IF elname IS BOUND.
            udename = elname->get_value( ).

            CASE udename.
              WHEN 'ZMITGLIED'.
                elvalue   = el->find_from_path( path = 'Value' ).
                IF elvalue IS BOUND.
                  gs_new-zmitglied = elvalue->get_value( ).
                ENDIF.
              WHEN 'ZZILN_KUNDE'.
                elvalue   = el->find_from_path( path = 'Value' ).
                IF elvalue IS BOUND.
                  gs_new-mitglied_iln = elvalue->get_value( ).
                ENDIF.
              WHEN 'ZWEMPF'.
                elvalue   = el->find_from_path( path = 'Value' ).
                IF elvalue IS BOUND.
                  gs_new-zwempf = elvalue->get_value( ).
                ENDIF.
              WHEN 'ZZILN_WE'.
                elvalue   = el->find_from_path( path = 'Value' ).
                IF elvalue IS BOUND.
                  gs_new-WEMPF_ILN = elvalue->get_value( ).
                ENDIF.
            ENDCASE.

            IF NOT gs_new-zwempf IS INITIAL AND NOT gs_new-zmitglied IS INITIAL.
              EXIT.
            ENDIF.

          ELSE.
            EXIT.
          ENDIF.

* konvertiere IF_IXML_NODE nach IF_IXML_ELEMENT
          DATA: elnode TYPE REF TO if_ixml_node.
          elnode = el->get_next( ).
          IF NOT elnode IS BOUND.
            EXIT.
          ENDIF.
          el ?= elnode->query_interface( ixml_iid_element ).
*
        ELSE.
          EXIT.
        ENDIF.

      ENDDO.
*
      IF gs_new-zwempf IS INITIAL.
        gs_new-zwempf = gs_new-zmitglied.
      ENDIF.
      if gs_new-wempf_Iln is initial.
        gs_new-wempf_iln = gs_new-mitglied_iln.
      endif.
      if gs_new-zmitglied is initial.
        concatenate gs_new-error
                    'Mitgliedsnummer in XML ist leer |'
               into gs_new-error.
      endif.
      if gs_new-mitglied_iln is initial.
        concatenate gs_new-error
                    'Mitgliedsnummer ILN in XML ist leer |'
               into gs_new-error.
      endif.
      if gs_new-zwempf is initial.
        concatenate gs_new-error
                    'Warenempfänger in XML ist leer |'
               into gs_new-error.
      endif.
      if gs_new-wempf_iln is initial.
        concatenate gs_new-error
                    'Warenempfänger ILN in XML ist leer |'
               into gs_new-error.
      endif.

      APPEND gs_new TO gt_new.

**********************************
    endloop.
  endif.
*
* Sollen neu ermittelte Daten zurückgegeben werden
*
  if GETDATABACKNEWDATA = 'X'.
    et[] = gt_new[].
  endif.
*
* Sollen alte (die schon in der Datenbanktabelle vorhandene Einträge) zurückgegeben werden
*
  if GETDATABACKOLDDATA = 'X'.
    select * from z_xmldata appending table et.
  endif.
*
* Sollen die neu ermittelten Daten auf die Datenbanktabelle geschrieben werden
*
  if WRITENEWDATAINDB = 'X'.
    insert z_xmldata from table gt_new[].
  endif.

ENDFUNCTION.

Änderungen im Coding, die notwendig waren: vorher: CALL METHOD gcl_xms_persist->read_msg
jetzt: CALL METHOD gcl_xms_persist->read_msg_all

Änderung:
Create DOM
li_ixmlfactory = cl_ixml=>create( ).
li_streamfactory = li_ixmlfactory->create_stream_factory( ).
*****
CALL METHOD li_streamfactory->create_istream_xstring
EXPORTING
string = lv_payxstr
RECEIVING
rval = istream.

[/code]

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1329
Views
XML Inhalt auslesen / auswerten
von jspranz » 04.07.2006 15:06 • Verfasst in ABAP® Core
0
Antw.
1455
Views
Konditionen auswerten?
von Gast » 29.11.2005 18:46 • Verfasst in Sales and Distribution
3
Antw.
3434
Views
RTE Feld auswerten?
von nicnor » 08.08.2007 07:51 • Verfasst in Human Resources
13
Antw.
4789
Views
Rechenausdruck auswerten
von Gast » 06.09.2005 14:42 • Verfasst in ABAP® für Anfänger
1
Antw.
1541
Views
ENTER-Taste auswerten
von niko022 » 24.08.2006 14:35 • Verfasst in Basis

Über diesen Beitrag

jspranz
Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 511
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2146
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8742