Brandeis Consulting
    • Anmelden
    1. Übersicht
    2. Kundensupport
    3. Modern ABAP
    4. EXACT ist der bessere CONV

    EXACT ist der bessere CONV

    Geplant Angeheftet Gesperrt Verschoben Modern ABAP
    1 Beiträge 1 Kommentatoren 27 Aufrufe
    Lade mehr Beiträge
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
    • JörgJ Offline
      Jörg Trainer
      zuletzt editiert von Jörg

      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.

      <div class="warning">Was passiert, wenn bei der Zuweisung ein Datenverlust auftritt. </div>

      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.

      1 Antwort Letzte Antwort Antworten Zitieren 0
      • Erster Beitrag
        Letzter Beitrag