2. Versuch spezifischer: Auslesen Tabelle DBTABLOG

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

2. Versuch spezifischer: Auslesen Tabelle DBTABLOG

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
Moin moin,

da wir uns im Nachbarthread im Kreis drehen, hier nochmal eine spezifischere Anfrage:

Ich habe hier akut das Problem, dass ich die DBTABLOG auslesen muss.

Diese speichert pro Tabelle die Änderung von Tabelleninhalten. Der Name der geänderten Tabelle steht im Feld TABNAME, die Änderung selbst im Feld LOGDATA.


Ziel ist es, für eine kundeneigene Tabelle (die zum Beispiel Zusatzdaten zu einem Bestellvorgang enthalten könnte mit Bezug auf die entsprechenden Bestellnummern) **belegnummernscharf** Änderungen herauszuselektieren.


Hierfür muss ich also alle Sätze der entsprechenden Tabelle (ist immer dieselbe) in einem bestimmten Zeitraum selektieren und alle Änderungen danach absuchen, was wo geändert wurde.


Und genau DA sind wir beim Problem: Welches Feld wie geändert wurde, steht in LOGDATA, ein Feld des Datentypes LRAW, das in irgendeiner Codierung vorliegt, die auch in der Onlinehilfe nicht schlüssig und ausreichend erläutert wird.


Diese Codierung führt dazu, dass ich nicht sagen kann "Zeige mir alle Änderungen zu Bestellung 123", weil die Nummer der Bestellung so codiert ist, dass ich nicht direkt darauf zugreifen kann. Ich muss zunächst alle Sätze selektieren, in einer itab zwischenspeichern und für alle Sätze das Feld LOGDATA dekodieren, um festzustellen, ob meine Belegnummer im Feld LOGDATA steht.


Alle Sätze, die auf andere Belegnummern zeigen, ignoriere ich hierbei. Ich muss also zwingend das Feld LOGDATA in eine "menschlich lesbare Form" bringen, damit ich darin suchen kann.


Wer kann mir einen Tipp geben wie das funktioniert?


Den Report RSVTPROT / Transaktion SCU3 kenne ich, aber der ist auch nicht wirklich hilfreicher als die besagte Onlinehilfe.


Danke


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

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


Beitrag von xxxx (ForumUser / 38 / 0 / 0 ) »
Hallo Ralf,

ich würde die Protokollierung in Tabellen nur bei Customizing-Tabellen aktivieren - ist aber eine Geschmacksache - Auszug aus der F1-Hilfe:

Hinweis: Das Einschalten der Protokollierung verlangsamt ändernde Zugriffe auf die Tabelle! Erstens muß für jede Änderung ein Satz in die Protokolltabelle geschrieben werden. Zweitens greifen viele Benutzer parallel auf diese Protokolltabelle zu. Dadurch können Sperrsituationen entstehen, obwohl die Benutzer auf verschiedenen Anwendungstabellen arbeiten.

Meiner Meinung wäre hier das "bessere" Instrument, mit "Änderungsbelege" zu arbeiten - da du ja von einem Objekt (in diesem Fall Bestellung) sprichst - hier ein Link aus der SAP-Doku:

http://help.sap.com/saphelp_47x200/help ... ameset.htm

Vielleicht ist das ein Lösungsansatz - vielleicht auch nicht *g* ... nur mal ein Tipp!

lg
Jo

Beitrag von edwin (Specialist / 306 / 10 / 68 ) »
Hallo Ralf,

im Prinzip ist es ganz einfach:
im FELD LOGDATA steht der komplette Datensatz der zu loggender Tabelle,
Du kannst also :

Code: Alles auswählen.

field-symbols <fs_rec> type "DeineTabelle".
...
assign wa_dbtablog-logdata to <fs_rec> casting.
...
und kannst dann Deine Felder in <fs_rec> prüfen - ABER -
falls sich die Tabellenstruktur inzwischen geändert hat, hast Du ein Problem,
deshalb macht die SAP bei der Auswertung diese Kopfstände. Es wird die Historie der Tabellestruktur gelesen und anhand dieser "alten" Struktur werden die Daten ausgewertet - da musst Du dann anhand des Datums die entsprechende Struktur aufbauen und dann diese verwenden.

Gruss Edwin

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
xxxx hat geschrieben:ich würde die Protokollierung in Tabellen nur bei Customizing-Tabellen aktivieren
So berechtigt dein Rat sein mag, aber wir haben eine kundeneigene Tabelle für die eben diese Protokollierung eingeschaltet ist und auch aktiv genutzt wird.



Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
edwin hat geschrieben:im Prinzip ist es ganz einfach:
im FELD LOGDATA steht der komplette Datensatz der zu loggender Tabelle,
Du kannst also :

Code: Alles auswählen.

field-symbols <fs_rec> type "DeineTabelle".
...
assign wa_dbtablog-logdata to <fs_rec> casting.
...
und kannst dann Deine Felder in <fs_rec> prüfen
SO einfach ist das? Na super, und ich reiß mir ein Bein auf um den Report zu verstehen. Mich wundert nur, dass ich bei DER einfachen Konstruktion den Inhalt von LOGDATA nicht lesen kann (also in der SE16).

Ich probiere das morgen gleich mal.

Edwin, du hast ein Bier bei mir gut wenn das klappt. Abzuholen bei deinem nächsten Besuch in HH ;)


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
edwin hat geschrieben:im Prinzip ist es ganz einfach:
im FELD LOGDATA steht der komplette Datensatz der zu loggender Tabelle,
Du kannst also :

Code: Alles auswählen.

field-symbols <fs_rec> type "DeineTabelle".
...
assign wa_dbtablog-logdata to <fs_rec> casting.
...
und kannst dann Deine Felder in <fs_rec> prüfen
SO einfach ist das? Na super, und ich reiß mir ein Bein auf um den Report zu verstehen. Mich wundert nur, dass ich bei DER einfachen Konstruktion den Inhalt von LOGDATA nicht lesen kann (also in der SE16). Oder anders gefragt: Warum funktioniert ein "move wa_dbtablog-logdata to (struc)" nicht?

Ich probiere das morgen gleich mal.

Edwin, du hast ein Bier bei mir gut wenn das klappt. Abzuholen bei deinem nächsten Besuch in HH ;)


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von edwin (Specialist / 306 / 10 / 68 ) »
Hallo Ralf,

ich werde bei Gelegenheit darauf zurückkommen :wink: ,
allerdings bin ich selten in HH, meine Kunden sind im Moment
alle im Süden.

aber noch mal zum Thema: nicht vergessen - wenn sich die
Tabellenstruktur seit Anfang der Aufzeichnung geändert hat- hast Du ein
Problem mit dieser Einfachstmethode.


Gruss Edwin

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
edwin hat geschrieben:aber noch mal zum Thema: nicht vergessen - wenn sich die
Tabellenstruktur seit Anfang der Aufzeichnung geändert hat- hast Du ein
Problem mit dieser Einfachstmethode.
Was nicht beantwortet, warum der ASSIGN klappt, ein MOVE aber nicht ;)


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von edwin (Specialist / 306 / 10 / 68 ) »
Hallo Ralf,
und wie sieht's aus, hat alles geklappt ?
zu move / assign :
ein move in eine Struktur funktioniert nicht weil:
bei Unicode/"Unicode Prüfung aktiv" mosert schon der "Compiler", es kann keine Typkonvertierung durchgeführt werden von RAW = HEX in eine Struktur.
Bei einem Assign mit casting werden keine Daten bewegt (deshalb auch keine Typkonvertierung), da wird einfach über den Datenbereich eine Struktur "übergestülpt"unabhängig davon ob diese Daten dieser Struktur entsprechen oder nicht, der Bereich muss nur gross genug sein.
Du kannst z.B. auch einfach nur ein Buffer(4096) type char definieren,
leeren und dann mit Assign casting jede Struktur darüberlegen
(der Inhalt ist dann natürlich Schrott). Wenn Du einen
Move von RAW - Hex Daten in eine Struktur machen willst, dann musst Du
etwas "arbeiten",aber ein direkter Cast ist natürlich einfacher.

Code: Alles auswählen.

 data it_dblog            type TABLE OF dbtablog.
  field-SYMBOLS <fs_dblog> type dbtablog.
  field-symbols <fs_any>   type any.
  field-symbols <fs_hex>   type x.
  data wa_bereich          type "DeineTabelle".
  data f type f.                    "<<< ausrichten
  data wa_logdata          type LOGDATA.
...
assign wa_bereich to <fs_hex> casting.
loop at it_dblog ASSIGNING <fs_dblog>.
      wa_logdata = <fs_dblog>-logdata.
* der etwas umständliche Weg:
* Jetzt kannst Du den Move  oder '=' machen
* aber unter Benutzung des <fs_hex>
      <fs_hex> = wa_logdata.
* und Deine Felder aus dem Bereich abfragen
      if wa_bereich-"DeinFeld"= "Sonstwas".
*           tue etwas
      endif.
*
* Dann schon lieber der einfache Cast
    ASSIGN wa_logdata to <fs_rec> casting.
...
endloop.
Anmerkung: falls die Struktur ein INT2 / Float Feld besitzt, müssen die
Daten im Speicher auf Doppelwortgrenze ausgerichtet sein,
deshalb:

Code: Alles auswählen.

...
data f_dummy type f.       "<<< ausrichten auf Doppelwortgrenze
data wa_logdata          type LOGDATA.
...
loop at it_dblog ASSIGNING <fs_dblog>.
   wa_logdata = <fs_dblog>-logdata.
   ASSIGN wa_logdata to <fs_rec> casting.
sonst bekommst Du einen "ASSIGN_BASE_WRONG_ALIGNMENT" Dump.

Gruss Edwin

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
edwin hat geschrieben:Anmerkung: falls die Struktur ein INT2 / Float Feld besitzt, müssen die
Daten im Speicher auf Doppelwortgrenze ausgerichtet sein,
deshalb:

Code: Alles auswählen.

...
data f_dummy type f.       "<<< ausrichten auf Doppelwortgrenze
data wa_logdata          type LOGDATA.
...
loop at it_dblog ASSIGNING <fs_dblog>.
   wa_logdata = <fs_dblog>-logdata.
   ASSIGN wa_logdata to <fs_rec> casting.
sonst bekommst Du einen "ASSIGN_BASE_WRONG_ALIGNMENT" Dump.
Ich war heute krank, darum kann ich das erst Montag coden.

Zwei Fragen bleiben mir noch:

1. DBTABLOG hat ein INT-Feld, das lt. Online-Doku irgendwie mit dem LRAW-Feld zusammenhängt. Welche Funktion hat es und welche Auswirkungen hat das auf mein Auslesen?

2. Spricht irgendwas dagegen den loop in ein strukturiertes Feld zu machen? Also "loop it_dbtablog into ls_dbtablog"?


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
edwin hat geschrieben:

Code: Alles auswählen.

field-symbols <fs_rec> type "DeineTabelle".
...
assign wa_dbtablog-logdata to <fs_rec> casting.
...
Hm, da krieg ich nur Kuddelmuddel raus, sieht aus wie um ein oder zwei Zeichen verschoben. Jetzt kann ich freilich ständig mal ein Zeichen nach links oder rechts verschieben in der Hoffnung, dass ich treffe. Das Vorgehen finde ich aber nicht sonderlich professionell.

Die Tabelle hat Urzustand seit der ersten Entwicklung.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von edwin (Specialist / 306 / 10 / 68 ) »
Hallo Ralf,
bist Du sicher, daqs sich die Tabelle nicht geändert hat ?
bei mit funktioniert es einwandfrei.

Gruss Edwin

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
edwin hat geschrieben:bist Du sicher, daqs sich die Tabelle nicht geändert hat ?
bei mit funktioniert es einwandfrei.
Ich habe, was die Tabelle angeht, eine einwandfreie Versionsverwaltung und die Sätze, die ich mir angesehen habe, waren auch fast neu.

Kann es sein, dass das INT2-Feld (DATALN) was damit zu tun hat? Irgendeinen Sinn muss es haben und es hängt mit dem LRAW-Feld lt. Online-Hilfe zusammen.


Ralf *wundert sich
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von edwin (Specialist / 306 / 10 / 68 ) »
Hallo Ralf,

inzwischen bin ich ziemlich ratlos :?
versuche mal mit dem Baustein :
'DD_NTAB_HIST_GET'
die Änderungshiestorie der Tabelle zu holen, vielleicht fällt Dir ja da was auf.
(Dieser Baustein liefert aber nur die Änderungen der protokollierter Tabellen)


Gruss Edwin

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
*Posting lösch* Geht. Vielen Dank für die Hilfe!!!


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Vergleichbare Themen

2
Antw.
1851
Views
Versuch Left Join von 2 auf 3 Tabellen zu erweitern
von Domgr » 10.07.2020 16:59 • Verfasst in ABAP® für Anfänger
0
Antw.
139
Views
Auslesung dbtablog
von Hendrik96 » 02.06.2022 16:55 • Verfasst in ABAP® für Anfänger
3
Antw.
1034
Views
DBTABLOG für Z-Tabellen umgehen
von John75438 » 29.07.2019 14:50 • Verfasst in ABAP® Core
0
Antw.
208
Views
Report zu geänderten Tabellen mit dbtablog
von Hendrik96 » 08.06.2022 07:56 • Verfasst in ABAP® für Anfänger
1
Antw.
685
Views
Interne Tabelle auslesen
von Flower28 » 31.12.2021 17:40 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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.