EXACT ist der bessere CONV
Veröffentlicht am 11. Februar 2025 von | ABAP | S/4HANA |
Mit dem Konstruktoroperator CONV
können wir beim Aufruf einer Methode bequem den Datentypen eines Parameters anpassen. Allerdings hebeln wir damit die Typprüfung des ABAP aus. Der EXACT
-Konstruktoroperator ist aber oft die bessere Wahl, weil er zusätzlich prüft, dass keine Daten verloren gehen.
Die Herausforderung
Ein typisches Problem beim Methodenaufruf sind unpassende Datentypen. Im Gegensatz zu Funktionsbausteinen wird der Datentyp zur Designzeit geprüft und die Klasse lässt sich nicht aktivieren, wenn die Datentypen von Methodenaufrufen nicht stimmen.
Beispiel
Methodendefinition
METHODS my_method IMPORTING text TYPE char8.
Aufruf mit DATS
Ergibt einen Fehler, wenn wir es mit einem Datum vom Datentyp DATS
aufrufen, weil der Datentyp nicht genau passt:
"SYST-DATUM" is not type-compatible with formal parameter "TEXT"
Der zweite Fehler ist hier nicht relevant. Der kommt daher, dass wir auf einem Cloudsystem sind und SYST-DATUM
dort überhaupt nicht mehr verwendet werden darf.
Die klassische Lösung mit Hilfsvariable
Wenn der Datentyp nicht passt, dann eben eine passende Variable anlegen, mit den Daten füllen und diese an die Methode übergeben. Wir nutzen aus, das im ABAP bei einer Zuweisung Äpfel zu Birnen gemacht werden können. Und solange die Inhalte kompatibel sind, wird das gut funktionieren.
METHOD demo_conv.
data lv_text type char8.
lv_text = sy-datum.
my_method( text = lv_text ).
ENDMETHOD.
Haben wir schon 1000 mal so gemacht. Ist aber wenig elegant.
Die moderne Lösung mit CONV
- Eleganter aber genauso ungenau
Mit dem Konstruktoroperator CONV
können wir erreichen, dass der Datentyp passend gemacht wird. Durch das #
wird automatisch der passende Zieldatentyp aus der Methodensignatur verwendet.
METHOD demo_conv.
my_method( text = CONV #( lv_text ) ).
ENDMETHOD.
Das Verhalten entspricht genau dem mit Hilfsvariable.
Das Problem mit dem Datenverlust
Es kann zu Datenverlust kommen, wenn der Datentyp des Parameters nicht alle Daten aufnehmen kann.
Wenn zum Beispiel manche Klassen den Datentyp für das Material noch mit CHAR(18)
definiert haben und an anderen Stellen mit CHAR(40)
gearbeitet wird, dann passen die Datentypen nicht. Das kann man mit einer passenden Hilfsvariable anpassen. Wenn aber irgendwann ein Material mit mehr als 18 Zeichen im System ist, dann wird einfach abgeschnitten. Die Probleme können dann an ganz anderer Stelle auftreten als dort, wo die Ursache dafür war.
Die Variante mit EXACT
- Elegant und sicher
Der Operator EXACT
kann ebenfalls den Datentypen passend machen. Dabei stellt er sicher, dass der Zieldatentyp die Daten auch vollständig aufnehmen kann. Wenn das nicht der Fall ist, reagiert die ABAP Laufzeit mit einer Exception vom Typ CX_SY_MOVE_CAST_ERROR
.
Wenn wir sicher sind, dass der Datentyp passt, dann ist EXACT
kein Mehraufwand. Wenn wir uns aber geirrt haben, werden Daten nicht einfach abgeschnitten und dann mit den falschen Daten weitergearbeitet. Statt dessen bekommen wir einen Dump und wissen sofort, welches Problem wir haben.
METHOD demo_conv.
my_method( text = EXACT #( lv_text ) ).
ENDMETHOD.
Alternativ zum Dump kann man natürlich auch die Exception abfangen. Aber das wird man nur dann machen, wenn man mit dieser Situation rechnet.
Fazit
Modernes ABAP erlaubt uns, mit dem Konzept der Ausdrücke unnötige Hilfsvariablen zu vermeiden. Der CONV
-Operator ist dafür sehr praktisch. Der EXACT
-Operator kann sogar noch mehr: Er verhindert versehentlichen Datenverlust.