Auch das (IMPORT FROM MEMORY) hab ich schon erlebt. Der Punkt ist: Jedesmal, wenn ich suchen muss, verliere ich Zeit. Und dann schreibe ICH mir auf, wo es steht, dann kann es auch gleich der machen, der sich den Kram ausgedacht hat. Das sage ich jedem Neuling: Wenn du was suchen musst, was nicht offensichtlich ist: Kommentar ins Coding schreiben! (ohweh, ich wiederhole mich schon wieder)DeathAndPain hat geschrieben:Gebe ich Dir recht, aber das kriegt man in aller Regel noch raus. Notfalls setzt man sich da einen Breakpoint hin, dann hat man den FB-Namen, oder man verfolgt zurück, wo der Variablenname herkommt. Das ist mit Debuggermitteln in aller Regel noch beherrschbar (jedenfalls wenn der Name nicht per IMPORT FROM MEMORY vom Himmel fällt, weil man nicht weiß, wann und von wem er ins Memory geschoben worden ist).Das hat mich schon vor etlichen Jahren geärgert ("rufe einen Funktionsbaustein, dessen Namen in einer Variable steht" - und der irgendwo im Customizing gepflegt ist, und man darf sich dann auf die Suche begeben).
Das Problem bei Funktionsbausteinen ist, dass die normale Syntaxprüfung die Typen der Schnittstelle nicht verprobt, das dumpt dann erst zur Laufzeit. Darin sehe ich einen erheblichen Vorteil einer Klasse (die sagt mir gleich, dass der übergebene Wert nicht zum Parameter passt), und das liegt daran, dass die Methodenschnittstelle ein Teil der Klassenschnittstelle ist.DeathAndPain hat geschrieben:Funktionsbausteine mag ich sehr gerne, weil sie technisch gut implementiert sind. Übersichtliche Schnittstelle, die bei Pflege direkt einen exzellent lesbaren Kommentar am Anfang des Codes triggert (wodurch sie auch in Eclipse gut lesbar zur Verfügung steht), gute Dokumentationsmöglichkeiten für den Baustein und sogar für jeden einzelnen Parameter. Finde ich angenehmer zu handhaben als globale Klassen. Die haben ihre Berechtigung, sobald es komplexer wird, aber in vielen Fällen ist ein FB ausreichend und von der Handhabung besser verständlich.
Funktionsbausteine kapseln nicht strikt, und dass sie das nicht tun, ist kein Fehler, sondern Konzept. Was für Sauereien man da mit "Dirty Assigns" zum Beispiel machen kann, ist so praktisch wie grausig - gerade aus sicherheitstechnischen Aspekten (wobei in Sachen Sicherheit ohnehin noch viel zu tun ist im SAP). Gerade die von dir erwähnten vielen Abhängigkeiten in großen Funktionsgruppen sind oft sehr intransparent.DeathAndPain hat geschrieben:Was mich an FBs etwas stört, ist die Einbettung in Funktionsgruppen. Funktionsgruppen sollte es IMHO gar nicht geben. Die nehme ich als Versuch wahr, Funktionsbausteine zu einer Art statischer Pseudoklassen zusammenzufassen, wobei die globalen Variablen der Funktionsgruppe die privaten Attribute sind. Dadurch kann man einen Baustein aufrufen, und dessen Verhalten hängt eben nicht nur von seiner wohldefinierten Schnittstelle ab, sondern auch davon, was ein anderer Baustein derselben Funktionsgruppe vorher gemacht hat. Das verletzt für mich die Idee der strikten Kapselung, die Funktionsbausteine eigentlich so klar und schön macht.
An Begrifflichkeiten darf man sich im SAP nicht aufhängen, gerade bei alten Sachen. Auch ein REPORT kann heute weitaus mehr als Reporting. Ich kann mir im DDIC auch "Tabellen" anzeigen, die aber keine Tabellen sind, sondern die DDIC-Repräsentanz von etwas, das auf der DB eine Tabelle sein kann.DeathAndPain hat geschrieben:Gerade auch der Begriff "Funktionsbaustein" suggeriert für mich, dass ich was reinschiebe und basierend darauf was rausbekomme, ohne dass das Ergebnis auch noch davon abhängt, was der Hund des Nachbarn gestern zu Mittag gegessen hat.
Ich sag mal vereinfachend: Wenn du wirklich kapseln willst, nimm Klassen, keine Funktionsgruppen. Aber das ist dann auch ein anderes Konzept. Ich kenne viele statische Klassen, die einfach angelegt wurden, damit der Entwickler sagen konnte "ich hab das in OO gemacht", ohne überhaupt erklären zu können, was ein Objekt überhaupt ist. Ich hab vor einigen Jahren mal einen zweiten Entwickler einstellen wollen und was mir da so in Vorstellungsgesprächen an gefährlichem Halbwissen gegenübersaß, war so schlimm, dass ich es lieber gelassen habe.DeathAndPain hat geschrieben:Trotzdem wäre es mir lieber, wenn es Funktionsgruppen nicht gäbe und man sich dafür darauf verlassen könnte, dass ein FB für sein Ergebnis nur die Informationen nutzt, die man ihm als Parameter übergibt.
Das kommt JETZT? Wo der Fokus (sinnvollerweise) auf UI5 liegen soll? Wer hat sich das denn ausgedacht? Ich finde (und fand immer schon) Dynpros überaus anstrengend, weil sie ein recht "schräges" Konzept verfolgen (ja, jetzt werden wieder einige schreiben wollen, wie modern das doch sei....). Und wenn man dann einen Barcodescanner mit Display integrieren will, ist man nahe dran, den Verstand zu verlieren. Unter UI5 ist das Teil einfach ein Endgerät mit einem Browser, fertig.DeathAndPain hat geschrieben:Mal eine ganz andere Frage: Zu Release 7.52 soll es wieder interessante Neuerungen geben. Unter anderem soll es endlich möglich sein, auf Dynproebene zu debuggen
Wusstest du eigentlich, dass die SE24 auch Schnittstellenkommentare generiert, wodurch sie in Eclipse gut lesbar zur Verfügung stehen? Dumm nur, dass das m.W. von Eclipse selber nicht unterstützt wird.DeathAndPain hat geschrieben:Funktionsbausteine mag ich sehr gerne, weil sie technisch gut implementiert sind. Übersichtliche Schnittstelle, die bei Pflege direkt einen exzellent lesbaren Kommentar am Anfang des Codes triggert (wodurch sie auch in Eclipse gut lesbar zur Verfügung steht),...
Edit: Quelltext reduziert, da das Wichtige in den Kommentarzeilen steht.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZZZZZZ=>MYMETHOD
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_BUKRS TYPE BKPF-BUKRS
* | [--->] IV_GJAHR TYPE BKPF-GJAHR
* | [--->] IV_BELNR TYPE BKPF-BELNR
* | [<-()] RV_EINSENDER TYPE KUNNR
* | [!CX!] ZCX_UTILITIES
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD MYMETHOD.
was hier kommt ist eigentlich egal
ENDMETHOD.
Nur im Mouseover.....black_adept hat geschrieben:Wusstest du eigentlich, dass die SE24 auch Schnittstellenkommentare generiert, wodurch sie in Eclipse gut lesbar zur Verfügung stehen? Dumm nur, dass das m.W. von Eclipse selber nicht unterstützt wird.
Von der Sache her bin ich bei Dir, nur bei der Gewichtung habe ich eine deutlich andere Meinung. Was soll an diesem Vorteil "erheblich" sein, wenn einen das System schon beim ersten Ausprobieren (ich sage bewusst nicht "Test", denn einen solchen braucht es dazu noch nicht mal) glasklar auf den Fehler hinweist? Wenn die Probleme alle nur solcherart wären, dann könnten wir froh und glücklich sein!Das Problem bei Funktionsbausteinen ist, dass die normale Syntaxprüfung die Typen der Schnittstelle nicht verprobt, das dumpt dann erst zur Laufzeit. Darin sehe ich einen erheblichen Vorteil einer Klasse
Also das finde ich erst recht trivial und kein Problem. Zumal sowohl die SE38 als auch Eclipse Kommentare deutlich als solche hervorheben. Anfänger mögen das lernen müssen, aber was zählt, ist die tägliche Arbeit, und da ist das exzellent handhabbar.Die Schnittstelle am Anfang des Codings ist insofern verwirrend, als dass man sie dort nicht pflegen kann, sie ist wirklich nur ein Kommentar. Anfängern muss man sowas oft sagen, sonst pflegen die im Editor vermeintlich die Schnittstelle und wundern sich
Ich weiß, Funktionsgruppen gibt es nicht aus Zufall. Ich finde dieses Konzept nur halt nicht gut und hätte es lieber gesehen, wenn man auf die Funktionsgruppen verzichtet und die Datenversorgung von Funktionsbausteinen auf deren Schnittstelle festgenagelt hätte.Funktionsbausteine kapseln nicht strikt, und dass sie das nicht tun, ist kein Fehler, sondern Konzept.
Ach, in bezug auf das, was ich an FBs kritisiert habe, machen Klassen genau den gleichen Mist. Bei einer Methode ist es auch nicht so, dass Du Dich darauf verlassen kannst, dass die Methode ihr Ergebnis allein auf dem aufbaut, was Du ihr als Parameter mitgibst. Was beim FB die funktionsgruppenglobalen Felder sind, sind bei der Klasse die privaten Attribute. Du rufst die Klasse, die verwurstet bei der Bearbeitung Deine Inputparameter mit dem, was andere, zuvor gerufene Methoden derselben Klasse ihr geheim hinterlassen haben, und am Ende bekommst Du gleichfalls ein Ergebnis, das Du nicht nachvollziehen kannst, weil Du nicht weißt, was alles bei seiner Ermittlung eingeflossen ist.Ich sag mal vereinfachend: Wenn du wirklich kapseln willst, nimm Klassen, keine Funktionsgruppen.
Ich staune auch, aber auf der anderen Seite finde ich es auch sehr angenehm, mit Elementen zu arbeiten, die komplett in der SAP-Welt beheimatet sind und ohne Browser auskommen. Jetzt zum Beispiel ärgere ich mich, dass seit einigen Wochen durch ein Update des Firefox ESR (betrifft aber genauso den normalen Firefox) im Solution Manager keine Checkboxen mehr anklickbar sind! Wenn ich mir also im Solman Transportaufträge für Änderungsdokumente beschaffen möchte, dann muss ich immer Customizing- und Workbench-Auftrag nehmen, auch wenn ich genau weiß, dass ich nur einen von beiden brauchen werde. Ich könnte auf einen anderen Browser umsteigen, aber dazu habe ich auch keine Lust, zumal der FF ja als voll unterstützt gilt. Die SAP zuckt zu dem Problem mit dem Schultern. All solch Gefaxe hätte man nicht, wenn der Solman im SAPGui laufen würde.Das kommt JETZT? Wo der Fokus (sinnvollerweise) auf UI5 liegen soll? Wer hat sich das denn ausgedacht?
Und wenn dieses Endgerät aus irgendeinem Grund nicht funktioniert, dann legt man sich die Karten und betet, dass es einen Hinweis dazu gibt, weil man sich selbst nicht mehr helfen kann.Unter UI5 ist das Teil einfach ein Endgerät mit einem Browser, fertig.
Ja, ich glaube, ich habe das mal gesehen. Rein subjektiv finde ich das Interface der SE37 aber angenehmer als das der SE24.Wusstest du eigentlich, dass die SE24 auch Schnittstellenkommentare generiert, wodurch sie in Eclipse gut lesbar zur Verfügung stehen?
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel
Du schreibst ein Programm und rufst einen Funktionsbaustein auf, dabei vertust du dich beim Typen des Parameters. Aktivieren, Starten, BÄNG! Deinen Testfall hast du dann im Zweifel schon verschossen.DeathAndPain hat geschrieben:Von der Sache her bin ich bei Dir, nur bei der Gewichtung habe ich eine deutlich andere Meinung. Was soll an diesem Vorteil "erheblich" sein, wenn einen das System schon beim ersten Ausprobieren (ich sage bewusst nicht "Test", denn einen solchen braucht es dazu noch nicht mal) glasklar auf den Fehler hinweist?Das Problem bei Funktionsbausteinen ist, dass die normale Syntaxprüfung die Typen der Schnittstelle nicht verprobt, das dumpt dann erst zur Laufzeit. Darin sehe ich einen erheblichen Vorteil einer Klasse
Ach, wer Ketzer ist und wer nicht und wer Papst werden sollte, das ist immer abhängig davon, mit wem man spricht und wann man das tut. Das ist hier nicht anders als anderswo. Nehmen wir die angeblich religiös anmutende Diskussion um die Ungarische Notation, die wir hier ja geführt haben. Die war von mir keineswegs religiös motiviert, sondern rein pragmatisch. Das zeigte sich in einem Gespräch, das ich neulich geführt habe:Daniel hat geschrieben:Der Ketzer hat sowas von Recht, de sollte Papst werden
Meine Antwort war:Warum reitest du so auf der Ungarischen Notation herum? Lass uns das doch festlegen!
Es ist also nicht so, dass ich das will, weil ich das will, sondern weil es in meinen Augen triftige Gründe dafür gibt, seinen Fokus auf andere Bereiche zu richten - Codingqualität definiere ich aus eben diesen Gründen anders als über Präfixe."Das ist einfach nicht wichtig genug. Du verschwendest viel Zeit drauf, in Programmierrichtlinien festzulegen und im System zu verproben, welches Präfix man unter welchen Umständen verwenden muss - aber das macht nix kaputt, wenn man davon abweicht. Deine ungleichen Feldnamen im DDIC für gleiche Inhalte* haben uns Dumps und schwer nachvollziehbare Schiefstände eingebracht, nach deren Ursache ich zwei Stunden gesucht habe - DAS macht was kaputt und DARUM ist DAS wichtig, und nicht die Frage der Präfixe vor lokalen Variablen".
Doch, da wurde es mir auch unterstellt, wenn auch ausnahmsweise nicht von dir. Bei dir ist es OO - wir haben halt gänzlich voneinander abweichende Arten der Programmierung. Das ist ja auch OK, das Problem ist die fehlende Konsistenz. Einer (idealerweise beim Kunden) muss den Hut auf haben und sagen "SO machen wir das hier". Ein Teil wird auch nicht mal so und mal so in ein Auto eingebaut (je nachdem, wer gerade am Band steht), da gibt es definierte, detaillierte Qualitätskriterien. Da legt einer fest "SO wollen wir das hier haben" und jeder hält sich dran.Daniel hat geschrieben:Bei der religiösen Diskussion ging es aber gar nicht um die Präfixe
(die ich für den größten Schwachsinn der Menschheitsgeschichte halte).
Nein, das ist ja der Witz, dass das gute Stück gar keinen Zustand haben soll! In vielen Fällen reicht das aus und macht den Code leichter verständlich bzw. überprüfbar.Wie attributfreie Klassen oder Funktionsgruppen funktionieren sollen, weiß ich allerdings nicht. Irgendwie musst du doch den Zustand speichern.
Code: Alles auswählen.
CALL FUNCTION 'GET_MATERIAL_TEXT'
EXPORTING MATNR = MARA_MATNR
IMPORTING MTEXT = TEXT_DES_MATERIALS.
Richtig. Wenn es einen statuslosen Typ gäbe (parallel zum jetzigen), könnte das für bestimmte Einsatzbereiche praktisch sein, davon hast du mich gerade überzeugt.DeathAndPain hat geschrieben:Zustände können nützlich sein, aber ich behaupte, dass man sie sogar bei der Mehrzahl der Funktionsbausteine nicht braucht. In dem Moment, in dem ich das beim Lesen des Funktionsbausteins syntaktisch zugesichert bekomme (etwa weil der FB einen Typ "stateless" hat), weiß ich schon mal, dass eine riesige Quelle von Fehlern und Unsicherheiten ausgeschlossen ist und ich mich allein auf das, was ich in der Schnittstelle sehe, verlassen kann. Zugleich vereinfacht sich das Testen des Bausteins dramatisch!
Bist Du Dir da ganz sicher? Ich könnte schwören, dass ich CHECK von Anfang an benutzt habe, und das war Release 3.1i. Von dort aus haben wir damals direkt auf 4.7 upgegradet (ja, das ging und war offiziell supportet!), so dass ich ja sonst erst sehr spät mit dem CHECK hätte anfangen können. Und ich glaube, dass ich das wüsste, wenn ich so lange ohne ihn hätte auskommen müssen.Daniel hat geschrieben:CHECK ist doch fast neu. Gibt es erst seit Release 4.2B.
Im ABAP3 ging das aber auch schon - hieß bloß nicht so.