ABAP Clean Code

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
68 Beiträge Vorherige Seite 4 von 5 (current) Nächste
68 Beiträge Vorherige Seite 4 von 5 (current) Nächste

Re: ABAP Clean Code

Beitrag von ralf.wenzel (Top Expert / 3415 / 149 / 220 ) » 22. Mai 2019 12:41

Er wollte mal Persistenzschicht üben. Die MARA hab ich als Beispiel genommen, weil es die überall gibt.

Übungsbeispiele müssen nicht sinnvoll sein. Ich habe die halbe Lehrzeit damit zugebracht, Zeugs zu feilen, das man nach der Benotung wegwirft.


Ralf


Re: ABAP Clean Code

Beitrag von GastX (Specialist / 269 / 4 / 10 ) » 22. Mai 2019 17:20

@Ralf: ich fand das Beispiel gut.
Bei Sortierungen u.ä. sehe ich die Anwendung auch sofort (und den Sinn, es nicht auf den Datenbankserver machen zu lassen).

Schwerer vorstellbar wird es für mich, wenn es um Auswertungen geht: da habe ich ggfs. mehrere Tabellen, die nicht zu einem Objekt gehören aber in Beziehung zu einander stehen. Und dort wären speziell gebaute Joins, die gleich die Menge der Daten radikal einschränken, hilfreich. Passt für mich aber nicht so zu "Persistenzklasse für einzelne Tabelle" oder "Persistenzklasse für ein Geschäftsobjekt".

Wie würdest Du das angehen?

Re: ABAP Clean Code

Beitrag von ralf.wenzel (Top Expert / 3415 / 149 / 220 ) » 22. Mai 2019 17:22

Redefinition der SELECT-Methode.


Ralf

Re: ABAP Clean Code

Beitrag von GastX (Specialist / 269 / 4 / 10 ) » 24. Mai 2019 12:05

Redefinition der SELECT-Methode
Eine etwas generische Antwort... :-)

Was ich meinte: wenn man anfängt und für seine Geschäftsobjekte, oder für einzelne Tabellen, jeweils eine Persistenzklasse zu stricken, die gerne viel Komplexität abfackeln und vor dem Aufrufer verbergen darf (wäre ja einer der Vorteile) und nun die Anforderung hat, eine Auswertung zu bauen, die sich
a) die Daten aus mehreren Quellen (Persistenzklassen, bzw. am Ende Tabellen) beschaffen muss und
b) sich Joins geradezu anbieten, um Treffermenge und Datenmenge einzuschränken
Also Tabelle A und B und ihre Persistenzklassen CLA und CLB.
Dann finde ich es "unschön", einen Join der A und B betrifft in CLA oder CLB unterzubringen. Die Daten erst über CLA und CLB zusammenzulesen und dann erst einzudampfen, dürfte auch ungeschickt sein.
Bleibt, hierfür eine spezialisierte Persistenzklasse CLAB zu bauen. Oder?

Re: ABAP Clean Code

Beitrag von ralf.wenzel (Top Expert / 3415 / 149 / 220 ) » 24. Mai 2019 12:13

Genau das meinte ich. Und weil

* ein JOIN eine etwas andere Schreibweise hat
* aus mehreren Tabellen bestehen
* und weiteren Gründen

musst du die SELECT-Methode redefinieren.


Ralf

Re: ABAP Clean Code

Beitrag von DeathAndPain (Top Expert / 1052 / 122 / 230 ) » 24. Mai 2019 18:30

Darum geht es ja gar nicht, es geht darum, dass viele mit Cluster-Tabellen gar nicht umgehen können
Zum Glück ist das auch nicht mehr wirklich notwendig, da die SAP Clustertabellen schon vor geraumer Zeit für deprecated erklärt hat und eine nach der anderen in transparente Tabellen umwandelt.

Re: ABAP Clean Code

Beitrag von ralf.wenzel (Top Expert / 3415 / 149 / 220 ) » 24. Mai 2019 18:46

Trotzdem kann man sie gut gebrauchen, um beliebig (!) strukturierte Daten abzulegen.

Außerdem arbeitet das SBAL auch heute noch mit Clustertabellen, um z. B. Daten zur Meldung zu speichern (den betreffenden Beleg, den Dateiauszug, etc.), deren Struktur man zwangsläufig nicht allgemein festlegen kann.

Zumal es ja noch den Fall gibt „die Daten liegen nicht im SAP, die holt er sich aus einer anderen DB“. Und das, ohne dass den Entwickler interessieren muss. Der sagt nur, was er hat und was er braucht.

Aber auch wenn es nur eine theoretische Möglichkeit zu sein scheint (wer weiß, was morgen ist) kann man die ganze Datenablage nicht nur vereinheitlichen, sondern eben auch zentral umstellen.


Ralf

Re: ABAP Clean Code

Beitrag von black_adept (Top Expert / 3243 / 54 / 568 ) » 25. Mai 2019 22:08

ralf.wenzel hat geschrieben:
24. Mai 2019 18:46
Trotzdem kann man sie gut gebrauchen, um beliebig (!) strukturierte Daten abzulegen.
Ralf
Kann ich nur bestätigen. Persönlich bevorzuge ich inzwischen stattdessen Tabellen mit einem Stringfeld als zentrale Datenablage, da man eigentlich all das was man in ein Cluster schreiben kann via ID-Transformation in einen String oder zurück umwandeln kann
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ABAP Clean Code

Beitrag von deejey (Specialist / 199 / 48 / 16 ) » 26. Mai 2019 01:05

Ist das euer Ernst? Wie wertet ihr das aus?

Re: ABAP Clean Code

Beitrag von ralf.wenzel (Top Expert / 3415 / 149 / 220 ) » 26. Mai 2019 07:53

black_adept hat geschrieben:
25. Mai 2019 22:08
Kann ich nur bestätigen. Persönlich bevorzuge ich inzwischen stattdessen Tabellen mit einem Stringfeld als zentrale Datenablage, da man eigentlich all das was man in ein Cluster schreiben kann via ID-Transformation in einen String oder zurück umwandeln kann
Richtig, habe ich auch schon gemacht. XML in Stringtab. Ich überlege derzeit, was besser ist.
deejey hat geschrieben:
26. Mai 2019 01:05
Ist das euer Ernst? Wie wertet ihr das aus?
Ich verstehe die Frage nicht. Satz einlesen, XML zurück transformieren und mit dem so erhaltenen Datenobjekt arbeiten.



Ralf

Re: ABAP Clean Code

Beitrag von ewx (Top Expert / 3972 / 164 / 368 ) » 26. Mai 2019 11:53

ralf.wenzel hat geschrieben:
26. Mai 2019 07:53
black_adept hat geschrieben:
25. Mai 2019 22:08
Kann ich nur bestätigen. Persönlich bevorzuge ich inzwischen stattdessen Tabellen mit einem Stringfeld als zentrale Datenablage, da man eigentlich all das was man in ein Cluster schreiben kann via ID-Transformation in einen String oder zurück umwandeln kann
Richtig, habe ich auch schon gemacht. XML in Stringtab. Ich überlege derzeit, was besser ist.
XML-Transformation IMHO. weil deutlich robuster gegen Strukturänderungen.

Re: ABAP Clean Code

Beitrag von IHe (ForumUser / 39 / 11 / 9 ) » 27. Mai 2019 13:28

ralf.wenzel hat geschrieben:
26. Mai 2019 07:53
black_adept hat geschrieben:
25. Mai 2019 22:08
Kann ich nur bestätigen. Persönlich bevorzuge ich inzwischen stattdessen Tabellen mit einem Stringfeld als zentrale Datenablage, da man eigentlich all das was man in ein Cluster schreiben kann via ID-Transformation in einen String oder zurück umwandeln kann
Richtig, habe ich auch schon gemacht. XML in Stringtab. Ich überlege derzeit, was besser ist.
deejey hat geschrieben:
26. Mai 2019 01:05
Ist das euer Ernst? Wie wertet ihr das aus?
Ich verstehe die Frage nicht. Satz einlesen, XML zurück transformieren und mit dem so erhaltenen Datenobjekt arbeiten.
Wie darf ich mir das vorstellen? Ich habe komplexe Datenobjekte, welche ich als XML-String mit eindeutiger ID in einer Tabelle speichere und per Transformation lesen/schreiben kann. Gehen wir als einfaches Beispiel von einem Lieferscheinobjekt aus. Wenn ich nun zu einem Lieferzeitraum die Menge von spezifischen ausgelieferten Materialien ermitteln möchte würde ich ja nicht sämtlich vorhandene Objekte transformieren und anhand Kopf- sowie Positionskriterium auswerten wollen. Werden dann auswertungsrelevante Daten zusätzlich in Tabellenfelder gespeichert? Aber das wäre ja eine gewaltige Datenredundanz.

Re: ABAP Clean Code

Beitrag von a-dead-trousers (Top Expert / 3214 / 81 / 799 ) » 27. Mai 2019 13:52

IHe hat geschrieben:
27. Mai 2019 13:28
Wie darf ich mir das vorstellen? Ich habe komplexe Datenobjekte, welche ich als XML-String mit eindeutiger ID in einer Tabelle speichere und per Transformation lesen/schreiben kann. Gehen wir als einfaches Beispiel von einem Lieferscheinobjekt aus. Wenn ich nun zu einem Lieferzeitraum die Menge von spezifischen ausgelieferten Materialien ermitteln möchte würde ich ja nicht sämtlich vorhandene Objekte transformieren und anhand Kopf- sowie Positionskriterium auswerten wollen. Werden dann auswertungsrelevante Daten zusätzlich in Tabellenfelder gespeichert? Aber das wäre ja eine gewaltige Datenredundanz.
Ein Beispiel näher aus der Praxis:
Die Konfiguration eines Geschäftsfalles ist im Programmlauf als Objekt einer Klasse abgelegt. Es kommt zu einem Fehler und nun möchte man den "Kontext" unter dem dieser Fehler aufgetreten ist nachvollziehbar abgelegt haben. Dazu könnte man einerseits die Inhalte aus den einzelnen Variablen in den beteiligten Objekten zusammensuchen und in dafür vorgesehene (Protokoll-)Tabellen mit entsprechender Struktur ablegen ODER anderseits einfach die betroffenen Objekte "transformieren" (serialisieren) und als String ablegen.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
IHe (28. Mai 2019 07:28)

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.07
Basis: 7.40

Re: ABAP Clean Code

Beitrag von ewx (Top Expert / 3972 / 164 / 368 ) » 27. Mai 2019 15:26

IHe hat geschrieben:
27. Mai 2019 13:28
Wie darf ich mir das vorstellen? Ich habe komplexe Datenobjekte, welche ich als XML-String mit eindeutiger ID in einer Tabelle speichere und per Transformation lesen/schreiben kann. Gehen wir als einfaches Beispiel von einem Lieferscheinobjekt aus. Wenn ich nun zu einem Lieferzeitraum die Menge von spezifischen ausgelieferten Materialien ermitteln möchte würde ich ja nicht sämtlich vorhandene Objekte transformieren und anhand Kopf- sowie Positionskriterium auswerten wollen. Werden dann auswertungsrelevante Daten zusätzlich in Tabellenfelder gespeichert? Aber das wäre ja eine gewaltige Datenredundanz.
Clustertabellen werden in der Regel als "Datengrab" verwendet und nicht als Stamm- oder Bewegungsdatenspeicher. Immer mal wieder kommt es vor, dass man einen "Programmzustand" protokollieren möchte, weil an bestimmten Stellen "irgendwas" nicht so funktioniert, wie gedacht. Dann ist es sehr einfach, alle Objekte, Strukturen und/ oder interne Tabellen zu serialisieren und unter der Objekt-ID + Timestamp + User + ApplicationServer abzuspeichern. Wenn du hier für jede intern definierte Tabelle oder Struktur eine eigene Datenbanktabelle erstellen möchtest, dann die Daten in den entsprechenden Tabellen speichern und hinterher wieder sinnvoll zusammen setzen möchtest... Dann viel Spaß... ;)

Hier ein paar Links zu der Serialisierung:
https://www.volker-wegert.de/en/content ... -idontwork
https://tricktresor.de/blog/serialize-me/
https://rvanmil.wordpress.com/2011/05/20/serialization/

Wofür man das dann letztendlich benötigt, weiß man meistens erst, wenn es soweit ist.

Die Vorteile der Serialisierung und Deserialisierung per CALL TRANSFORMATION id ggü. {EXPORT TO / IMPORT FROM} DATABASE abc(id):
* Sehr variabel/ robust. Du kannst Felder aus der Struktur entfernen oder hinzufügen und die Deserialisierung funktioniert trotzdem.
* Klartext. Zur Not, wenn doch irgendwas nicht funktionieren sollte, kannst du dir den String als Text anzeigen lassen und hast die Informationen.

Die Serialisierung ist sehr schnell. Keine Ahnung, ob sie schneller ist, als die Speicherung in einer Clustertabelle. Müsste man mal ausprobieren.

Obwohl die De-/Serialisierung von Klasseninstanzen funktioniert, klappt das leider nicht mit GUI-Controls. Das wäre sonst sehr schön, wenn man ein Control einfach unter Angabe eines neuen PARENT wieder Deserialisieren könnte... ;)

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
IHe (28. Mai 2019 07:29) • qyurryus (29. Mai 2019 07:56)


Re: ABAP Clean Code

Beitrag von IHe (ForumUser / 39 / 11 / 9 ) » 28. Mai 2019 07:52

Danke für das praktische Beispiel + Infos. Da wir häufig externe Java-Anwendungen mittels XML-Schnittstellen anbinden werden Transformationen ebenso häufig verwendet. Das Thema Serialisierung war mir grundsätzlich bekannt, aber aus dem Fokus gerückt. Ich werde dies für unsere nächste interne Entwicklerrunde aufnehmen, damit uns diese Möglichkeit bewusst ist wenn bzw. falls wir sie benötigen.

Vorherige Seite 4 von 5 (current) Nächste

Aktuelle Forenbeiträge

Welche Entwicklertools?
vor 3 Stunden von LostDarkness 2 / 891
Werksspezifische Konfiguration kopieren
vor 5 Stunden von eleve 2 / 32
Removal of left space - next to a docking container
vor 5 Stunden von Haemma83 16 / 89

Unbeantwortete Forenbeiträge

BAPI_PO_CREATE1 und Einkaufsinfosatz
vor 2 Tagen von SweetRuedi 1 / 74
WCOCO: Gruppe für Betragsfelder 0S01
vor 5 Tagen von SAP_ENTWICKLER 1 / 48
CAS-Nr.: Chemical Abstracs Service
vor einer Woche von SAP_ENTWICKLER 1 / 87
Interaktives Skript, Rolle IC-Manager
vor 3 Wochen von erubadhron86 1 / 124