Ich halte Klassen und Methoden gerade wenn es um Sichtbarkeiten geht für das Mittel der Wahl - ich möchte aber darauf hinweisen, dass SAP sehr wohl Möglichkeiten bereitstellt Sichtbarkeiten von allen möglichen Objekten bereitzustellen und zwar mittels den Pakteschnittstellen (zumindest lt. Doku - ich habe das selber noch nie verwendet! ) https://help.sap.com/saphelp_nw73ehp1/h ... ameset.htmralf.wenzel hat geschrieben:Schon bei der Kapselung sind Funktionsgruppen damit „raus“, weil es keine geschützten Funktionsbausteine gibt. Jeder Funktionsbaustein ist von außen aufrufbar, somit muss der Aufrufer wissen, was er aufrufen darf und was nicht (das ist das Gegenteil von „autonom agieren“).
Da verwendet wohl jemand BOPF oder hat das dort verwendete Prizinzip gut verinnerlicht...ralf.wenzel hat geschrieben:Bei mir besteht eine Tabelle zum Beispiel aus dem einzigen Einzelfeld MANDT, einem Include für alle Keyfelder (Gruppenname KEY), einem weiteren DATA für die weiteren Felder, einem weiteren CREATE mit Erstellerfeldern (Name, Datum, Uhrzeit) und noch einem CHANGE (entsprechend) für die letzte Änderung.
Aber nach meinen Erfahrungen nur in richtig altem Code - oder in Code, der mit richtig altem Code umgehen muss (wenn man etwa ein altes User Exit nutzt). Es widerspricht nicht nur den Regeln von OO, sondern sehr wohl auch der Lehre strukturierter prozeduraler Programmierung.Dirty Assigns findest du ohne Ende im Coding der SAP. Hab ich mich gerade letzte Woche drüber geärgert, als ich nach Merkwürdigkeiten im BAL suchte.
Zunächst einmal sind beides Formen von Unterprogrammen (und Methoden wären die Dritten im Bunde). Natürlich gibt es zwischen den Dreien Unterschiede. Aber Funktionsbausteine, die ja per definitione stets global sind, sind dafür gedacht, von programmexternen Aufrufern genutzt zu werden, Formroutinen im Grundsatz nicht. "Im Grundsatz" ist hier im juristischen Sinne gemeint, also dergestalt, dass Ausnahmen die Regel bestätigen. Es ist technisch möglich, Formroutinen von völlig anderen Programmen aus aufzurufen, aber damit ist man qualitativ schon sehr dicht an einem Dirty Assign, und ein vernünftiger prozeduraler Programmierer wird das nicht machen, wenn es nicht bei der Arbeit mit Altcode unumgänglich ist.Eine FORM-Routine ist etwas vollkommen anderes als ein Funktionsbaustein
Das Customizing wäre ja der Verwendungsnachweis. Darin ist festgelegt, unter welchen Umständen welcher FB gerufen werden soll, und wenn Du wissen willst, wann das ausgewertet wird, dann machst Du einen WHERE-USED auf die Customizingtabelle.Funktionsbaustein im Customizing festlegen? Und damit keinerlei Verwendungsnschweise mehr haben?
Ok, jetzt habe ich es verstanden. Mir war nicht klar, dass Du meintest, Strukturen in die Tabellendefinition zu inkludieren. Der Ansatz ist mit Sicherheit gut. Davon habe ich mich in der Praxis überzeugen können, weil die Personaladministrationstabellen der SAP im HCM genau so gebaut sind (z.B. die PA0001). Mit diesen Tabellen arbeite ich viel und habe daher erkennen können, wie flexibel und nützlich dieser Ansatz ist. Da hat die SAP zur Abwechslung mal was gut gemacht.Zu den Tabellen:
Bei mir besteht eine Tabelle zum Beispiel aus dem einzigen Einzelfeld MANDT, einem Include für alle Keyfelder (Gruppenname KEY), einem weiteren DATA für die weiteren Felder, einem weiteren CREATE mit Erstellerfeldern (Name, Datum, Uhrzeit) und noch einem CHANGE (entsprechend) für die letzte Änderung.
In DATA kann man Felder zu weiteren Includes zusammenfassen, die nur/gern zusammen auftreten (Statusschema und Status).
So erhält man nicht einfach „lose“ Felder, sondern semantisch zusammenhängende Feldgruppen, die man wiederverwenden und gemeinsam ansprechen kann. Das hat mir auch bei Altkunden schon viel Arbeit erspart, wenn es etwas zu ändern gab.
Ich greife das nochmal auf, weil das Thema bei mir gerade akut ist.DeathAndPain hat geschrieben:Ich habe eine grobe Vorstellung davon, wovon die beiden reden. Was ich nicht verstehe, ist, weshalb Ralf offenbar die für diesen Zweck in OO vorgesehene Constructor-Methode durch eine selbstgebastelte Erzeugungsmethode ersetzen möchte. Wird dadurch aus OO nicht doch 00? Was ist der Vorteil?
Nuja, außer man gibt die ab 7.51 ( glaube ich .. kann aber auch 7.52 sein, not quite sure here ) eingeführten ENUMS her und sagtralf.wenzel hat geschrieben:
Es ist eben nicht nur wichtig, ein Objekt aus einer Klasse zu erzeugen, sondern ein *konsistentes* Objekt. Also keineswegs 00, sondern OO, aber richtig. Der Blick, dass ein Objekt in sich konsistent sein sollte, bedingt auch, dass der Erzeuger nicht wissen muss, welche Voraussetzungen erforderlich sind für ein gültiges Objekt,
Abgesehen davon ist ein FARBKLASSE=>CREATE_SCHWARZ( ) deutlich sprechender als ein CREATE OBJECT FARBE EXPORTING farbcode = 0.
Syntaxprüfung macht das automatisch.ralf.wenzel hat geschrieben:Und wie prüfst du, ob „schwarz“ überhaupt eine gültige Farbe ist? Im Constructor, der dann eine Ausnahme wirft, die wieder abgefangen werden muss. Darum bevorzuge ich Erzeugermethoden bei diskreten Parametern, weil es dann nur für die gültigen eine Erzeugermethode gibt.
So spart man sich das Fehlerhandling, weil Fehler gar nicht entstehen können.
Code: Alles auswählen.
Types: enum Farben,
schwarz,
rot,
gold.
Code: Alles auswählen.
new Farbcode( Klasse=>Farben-lila ) " hier wird ein Syntaxfehler gewrofen
Na wenn dieser Beitrag nicht mal deutlich peinlicher ist als alle anderen in diesem Thread...v1m4r hat geschrieben:Ich finde es eine Frechheit, wie hier Neulinge behandelt werden.
Da kommt so ein alter Entwickler daher, der hier meint, alle fertig machen zu müssen.
Eine Frechheit, Ralf Wenzel sollte sich mal lieber schämen, kurz vor der Rente nen 18-22 Jährigen fertig zu machen, der sich für SAP / ABAP interessiert.
Typen wie der müssen frei von Arroganz gerne helfen, aber nicht Neulinge abschrecken. Du meinst wohl, nur weil du ein bissl OO und Designpatterns verstanden hast, dass du ein Gott bist... peinlich für die SAP Community der Ralf.
Folgende Benutzer bedankten sich beim Autor schick für den Beitrag:
DeathAndPain