Objekt mit Referenz als Attribut auf DB speichern?

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Hallo in die Runde,
ich bin auf der Suche nach einer Möglichkeit, Objekte, die wiederum selbst als Attribut Instanzen haben, auf der DB o.ä. zu speichern. Serialisieren oder persistente Klassen scheiden aus, da beide mein Vorhaben (scheinbar) nicht unterstützen. Habt ihr vielleicht noch einen Tipp für mich, wie ich meine Objekte - sagen wir mal - langfristig erhalten kann?

Danke im Voraus & viele Grüße
Jochen

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


Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Mit CALL TRANSFORMATION ID lassen sich Objekte problemlos serialisieren und auch wieder in Objekt zurückverwandeln.
Vorallem der Zusatz "OPTIONS data_ref = 'heap-or-create'" ist bei Objekten mitunter wichtig, damit die Serialisierung vollständig abläuft.
http://help.sap.com/abapdocu_70/de/ABAP ... PTIONS.htm

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
dejo79

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Hallo ADT,

danke für deine schnelle Antwort. Bedeutet das im Umkehrschluss, dass ich für meine Klasse ein eigenes XSLT-Programm schreiben muss?

Viele Grüße
Jochen

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Vielleicht noch etwas zu meinen Gehversuchen. Folgendes Testprogramm habe ich angelegt:

Code: Alles auswählen.


REPORT  zdj_test_transform.

CLASS lcl_xmltest DEFINITION.

  PUBLIC SECTION.
    INTERFACES:
      if_serializable_object.

    DATA counter    TYPE i.
    DATA t_mara     TYPE mara_tt.
    DATA s_mara     TYPE mara.
    DATA r_equi     TYPE REF TO zcl_msb5_ih_equi.

    METHODS:
      constructor
        IMPORTING
          iv_counter  TYPE i
          it_mara     TYPE mara_tt
          is_mara     TYPE mara.

ENDCLASS. 

CLASS lcl_xmltest IMPLEMENTATION.

  METHOD constructor.
    me->counter = iv_counter.
    me->s_mara  = is_mara.
    me->t_mara  = it_mara.

    CREATE OBJECT me->r_equi.
    me->r_equi->load( 'TEQ-30' ).
  ENDMETHOD.     

ENDCLASS.            

DATA: go_ixml           TYPE REF TO if_ixml,
      go_stream_factory TYPE REF TO if_ixml_stream_factory,
      go_encoding       TYPE REF TO if_ixml_encoding,
      go_xml_o          TYPE REF TO if_ixml_ostream,
      go_xml_i          TYPE REF TO if_ixml_istream,
      gv_xml_xstring    TYPE xstring.

DATA: go_old            TYPE REF TO lcl_xmltest,
      go_new            TYPE REF TO lcl_xmltest.

DATA lt_mara TYPE TABLE OF mara.
DATA ls_mara TYPE mara.

CONSTANTS: gc_encoding TYPE string VALUE 'UTF-16'. "or UTF-8 etc.

START-OF-SELECTION.

  SELECT *
    FROM mara
    INTO TABLE lt_mara
    UP TO 10 ROWS.
  READ TABLE lt_mara INTO ls_mara INDEX 1.

  CREATE OBJECT go_old
    EXPORTING
      iv_counter = 5
      it_mara    = lt_mara
      is_mara    = ls_mara.

  go_ixml = cl_ixml=>create( ).
  go_stream_factory = go_ixml->create_stream_factory( ).
  go_encoding = go_ixml->create_encoding( character_set = gc_encoding byte_order = 0 ).
  go_xml_o = go_stream_factory->create_ostream_xstring( gv_xml_xstring ).
  go_xml_o->set_encoding( go_encoding ).


  CALL TRANSFORMATION id_indent
       OPTIONS data_refs = 'heap-or-create'
       SOURCE obj = go_old
       RESULT XML go_xml_o.

  CALL TRANSFORMATION id_indent
       SOURCE XML gv_xml_xstring
       RESULT obj = go_new.

  BREAK-POINT.

END-OF-SELECTION.

ID_IDENT löst mir die Attribute der Klasse sauber auf, was counter, t_mara und s_mara betrifft. r_equi ist allerdings in go_new initial. Das diese Referenzen aber auch serialisiert werden (ich sag mal in beliebiger Tiefe), ist für mich von großer Bedeutung. Für mich ist das alles Neuland, ich hoffe ich habe alles bisher richtig verstanden...

Viele Grüße
Jochen

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Nein. "ID" ist, wenn man so will, das Standard XSLT Programm von SAP. Es ist für die grundsätzliche Umwandlung in das asXML Format zuständig mit dem alle anderen XSLT- bzw. ST-Transformationen weiterarbeiten.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Probiers mal so:

Code: Alles auswählen.

DATA: 
  lo_object type ref to lcl_xmltest,
  ld_string TYPE string.

CALL TRANSFORMATION ID
  OPTIONS data_refs = 'heap-or-create'
  SOURCE obj = lo_object
  RESULT XML ld_string.
Ist etwas einfacher :wink:

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
dejo79

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Uhm ja, deutlich einfacher!

Und die Lösung meines Problems ist auch relativ einfach, wenn man einmal darauf gekommen ist. Ich hatte vergessen, in meiner Klasse, die im Objekt referenziert wird, auch IF_SERIALIZABLE_OBJECT aufzunehmen. Wie soll CALL TRANSFORMATION sonst wissen, dass an der Stelle weiter gemacht werden soll... :?
Danke für deine Hilfe! :up:

Grüße
Jochen

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Hallo in die Runde,

nachdem meine Objekte nun korrekt ins XML übernommen werden habe ich folgendes Problem.

Wenn ich im selben Report serialisiere und deserialisere, funktioniert alles einwandfrei:

Code: Alles auswählen.

  CREATE OBJECT lo_old
    EXPORTING
      iv_counter = 5.

  CALL TRANSFORMATION id
       OPTIONS data_refs = 'heap-or-create'
       SOURCE obj = lo_old
       RESULT XML lv_xml_xstring.

  ls_xml-uname = sy-uname.
  ls_xml-xml   = lv_xml_xstring.
  MODIFY zjd_xstring FROM ls_xml.
  COMMIT WORK.

  CALL TRANSFORMATION id
       SOURCE XML lv_xml_xstring
       RESULT obj = lo_new.
Wenn ich aber in einem separaten Report auf meine Tabelle ZJD_XSTRING selektiere und XML --> ABAP mache, dumpt mir die Geschichte mit CX_XSLT_RUNTIME_ERROR(XML_INVALID_REF), Ungültiger Wert in einer href oder id-Property.

Da das XML in beiden Reports identisch ist gehe ich davon aus, dass die Art und weise, wie ich es ursprünglich zusammenbaue, nicht korrekt ist und die Referenzen nicht richtig übernommen werden. Ich habe nun mit den unterschiedlichen data_refs gespielt, aber auch das hat mich nicht weiter gebracht. Hat jemand vielleicht noch eine Idee? (Vielleicht du, ADT :wink:)

Danke im Voraus & viele Grüße
Jochen

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Hat das Objekt das du serialisierst einen CONSTRUCTOR mit obligatorischen Parametern?
Ich vermute, dass deswegen das Objekt innerhalb der Transformation nicht angelegt werden kann.
Vielleicht hilft es in diesem Fall, wenn du vorher ein DUMMY-Objekt erzeugst und dann in der Transformation nur mit den Daten befüllen lässt.

Alternativ kannst du die Transformation auch mit dem Datentyp STRING durchführen und dir das das erstellte XML-Dokument durchschauen ob darin ein Fehler wegen ungültiger IDs im Heap Abschnitt existiert.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Hallo ADT, danke für deine schnelle Antwort!
Ich habe des Rätsels Lösung: im XML selbst wird ja auch der Reportname geparst. Wenn ich das XML dann in einem neuen Report aufs Objekt transformiere, dann wird auch der Reportname entsprechend aufgelöst. Da der ausführende Report nicht mit dem XML-Report übereinstimmt, knallt es. Ersetzt man den Namen mit dem aktuellen Report, passt es. Allerdings muss ich die ganze Geschichte über ein RAWSTRING laufen lassen, mit STRING funktioniert es nicht.

Also

Speichern:

Code: Alles auswählen.

REPORT  zdj_test_transform.

*----------------------------------------------------------------------*
*       CLASS lcl_mysample DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xmltest DEFINITION.

  PUBLIC SECTION.
    INTERFACES:
      if_serializable_object.

    DATA counter    TYPE i.
    DATA r_equi     TYPE REF TO zcl_msb5_ih_equi. "in dieser Klassen muss auch if_serializable_object includiert werden!!!

    METHODS:
      constructor.

ENDCLASS.                    "lcl_mysample DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_mysample IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xmltest IMPLEMENTATION.

  METHOD constructor.
    CREATE OBJECT me->r_equi.
    me->r_equi->load( 'TEQ-30' ).
  ENDMETHOD.                    "constructor

ENDCLASS.                    "lcl_mysample IMPLEMENTATION


DATA lo_old     TYPE REF TO lcl_xmltest.
DATA lv_xstring TYPE xstring.
DATA lt_xml     TYPE TABLE OF zjd_xstring.
DATA ls_xml     TYPE zjd_xstring.


START-OF-SELECTION.


  CREATE OBJECT lo_old.
  lo_old->counter = 5.

  CALL TRANSFORMATION  id_indent
       OPTIONS data_refs = 'heap-or-create'
       SOURCE obj = lo_old
       RESULT XML lv_xstring.

*  CALL FUNCTION 'SCOL_TRACE_SHOW_XML'
*    EXPORTING
*      xdoc = lv_xstring.

  ls_xml-uname = sy-uname.
  ls_xml-xml   = lv_xstring.
  MODIFY zjd_xstring FROM ls_xml.
  COMMIT WORK.

END-OF-SELECTION.

Parsen:

Code: Alles auswählen.

REPORT  zdj_test_transform2.

*----------------------------------------------------------------------*
*       CLASS lcl_xmltest DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xmltest DEFINITION.

  PUBLIC SECTION.
    INTERFACES:
      if_serializable_object.

    DATA counter    TYPE i.
    DATA r_equi     TYPE REF TO zcl_msb5_ih_equi. "in dieser Klassen muss auch if_serializable_object includiert werden!!!

ENDCLASS.                    "lcl_mysample DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_mysample IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xmltest IMPLEMENTATION.
*nn
ENDCLASS.                    "lcl_mysample IMPLEMENTATION


DATA lo_new     TYPE REF TO lcl_xmltest.
DATA lv_xstring TYPE xstring.
DATA lv_1       TYPE string VALUE 'ZDJ_TEST_TRANSFORM'.
DATA lv_2       TYPE string VALUE 'ZDJ_TEST_TRANSFORM2'.
DATA lv_1x      TYPE xstring.
DATA lv_2x      TYPE xstring.

START-OF-SELECTION.

  SELECT SINGLE xml
    FROM zjd_xstring
    INTO lv_xstring
   WHERE uname = sy-uname.

  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text   = lv_1
    IMPORTING
      buffer = lv_1x.

  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text   = lv_2
    IMPORTING
      buffer = lv_2x.

  REPLACE ALL OCCURRENCES OF lv_1x IN lv_xstring WITH lv_2x IN BYTE MODE.

*  CALL FUNCTION 'SCOL_TRACE_SHOW_XML'
*    EXPORTING
*      xdoc = lv_xstring.

  CALL TRANSFORMATION id
       SOURCE XML lv_xstring
       RESULT obj = lo_new.

END-OF-SELECTION.
So funktioniert es auf jeden Fall. Meine abschließende Frage an dich: geht das noch eleganter?
Danke für deine Hilfe & viele Grüße
Jochen

Re: Objekt mit Referenz als Attribut auf DB speichern?

Beitrag von dejo79 (ForumUser / 7 / 2 / 0 ) »
Ja geht es, wenn man globale Klassen verwendet. Dann wird der Reportname nämlich gar nicht geparst :!:

Viele Grüße
Jochen

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1815
Views
Neues Attribut in Business Objekt
von FelgerW » 06.02.2009 08:51 • Verfasst in ABAP Objects®
11
Antw.
9969
Views
Speichern einer Internen Tabelle als Attribut
von OO-Anfänger » 03.01.2005 10:51 • Verfasst in ABAP Objects®
3
Antw.
5687
Views
Kopie der Werte, nicht der Referenz. Objekt klonen?
von newbie007 » 02.02.2012 23:50 • Verfasst in ABAP Objects®
3
Antw.
3482
Views
Referenz-Tabelle UND Referenz-Feld f.BRGEW und NTGEW
von bohne » 22.02.2007 10:52 • Verfasst in ABAP® für Anfänger
2
Antw.
6561
Views
Referenz-Tabelle und Referenz-Feld
von dyv » 28.08.2014 15:25 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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
vor 6 Stunden von Bright4.5 1 / 129
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1771
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8373