Lerne und übe ABAP – Buchhandlung

Lerne und übe ABAP. In der ABAP-Übung „Book Store“ implementierst Du ein ABAP-Programm, der den Preis jedes denkbaren Warenkorbs von Büchern berechnet und dabei einen möglichst großen Rabatt gewährt. Es gibt zusätzlich 40 geniale ABAP Übungen auf exercism. Du kannst diese Übung entweder in Deinem SAP-System ausprobieren oder Dich kostenlos auf der Plattform anmelden und die Übung absolvieren. Du kannst Dir sogar Lösungen von anderen Nutzen ansehen und dadurch Deine Lösung vergleichen.

Aufgabenstellung

Um den Verkauf verschiedener Bücher einer beliebten 5-bändigen Reihe zu fördern, hat eine Buchhandlung beschlossen, Rabatte für den Kauf mehrerer Bücher anzubieten.

Ein Exemplar eines der fünf Bücher kostet 8 $.

Wenn Du jedoch zwei verschiedene Bücher kaufst, erhältst Du einen Rabatt von 5 % auf diese beiden Bücher.

Wenn Du 3 verschiedene Bücher kaufst, erhältst Du 10 % Rabatt.

Wenn Du 4 verschiedene Bücher kaufst, erhältst Du einen Rabatt von 20 %.

Wenn Du alle 5 Bücher kaufst, erhältst Du einen Rabatt von 25%.

Hinweis: Wenn Du vier Bücher kaufst, von denen drei verschiedene Titel sind, erhältst Du einen Rabatt von 10 % auf die drei Bücher, die Teil eines Sets sind, aber das vierte Buch kostet immer noch 8 $.

Deine Aufgabe ist es, einen Code zu schreiben, der den Preis jedes denkbaren Warenkorbs (der nur Bücher der gleichen Reihe enthält) berechnet und dabei einen möglichst großen Rabatt gewährt.

Wie viel kostet zum Beispiel dieser Korb mit Büchern?

  • 2 Exemplare des ersten Buches
  • 2 Exemplare des zweiten Buches
  • 2 Exemplare des dritten Buches
  • 1 Exemplar des vierten Buches
  • 1 Exemplar des fünften Buches

Eine Möglichkeit, diese 8 Bücher zu gruppieren, ist:

  • 1 Gruppe von 5 –> 25% Rabatt (1,2,3,4,5)
  • +1 Gruppe von 3 –> 10% Rabatt (1., 2., 3.)

Dies würde insgesamt ergeben:

  • 5 Bücher mit einem Rabatt von 25%
  • +3 Bücher mit einem Rabatt von 10%

Daraus ergibt sich:

  • 5 × (8 – 2.00) = 5 × 6.00 = $30.00
  • +3 × (8 – 0.80) = 3 × 7.20 = $21.60

Das ergibt insgesamt 51,60 $.

Eine andere Möglichkeit, diese 8 Bücher zu gruppieren, ist jedoch folgende:

  • 1 Gruppe von 4 Büchern –> 20% Rabatt (1, 2, 3, 4)
  • +1 Gruppe von 4 Büchern –> 20% Rabatt (1, 2, 3, 5)

Dies würde insgesamt ergeben:

  • 4 Bücher mit einem Rabatt von 20%
  • +4 Bücher mit einem Rabatt von 20%

Daraus ergibt sich:

  • 4 × (8 – 1.60) = 4 × 6.40 = $25.60
  • +4 × (8 – 1.60) = 4 × 6.40 = $25.60

Das ergibt insgesamt 51,20 $.

Und 51,20 $ ist der Preis mit dem größten Rabatt.

Beispiel Programmierung

CLASS zcl_book_store DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    "! ID of book to buy from 1 to 5
    TYPES book_id TYPE i.

    TYPES basket_type TYPE SORTED TABLE OF book_id
      WITH NON-UNIQUE KEY table_line.

    TYPES total TYPE p LENGTH 3 DECIMALS 2.

    "! @parameter basket | E.g., buying two copies of the first book and one copy of the second book
    "!                     is equivalent to ( ( 1 ) ( 1 ) ( 2 ) )
    METHODS calculate_total
      IMPORTING basket       TYPE basket_type
      RETURNING VALUE(total) TYPE total.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_book_store IMPLEMENTATION.

  METHOD calculate_total.
    " add solution here
    TYPES: BEGIN OF ty_cart_aggr_line,
             book_id  TYPE book_id,
             quant TYPE i,
           END OF ty_cart_aggr_line.
    TYPES: BEGIN OF ty_discount_grp,
             unique_books TYPE i,
             discount     TYPE total,
           END OF ty_discount_grp.
    DATA: lr_cart_aggr TYPE REF TO ty_cart_aggr_line,
          lt_cart_aggr TYPE TABLE OF ty_cart_aggr_line WITH NON-UNIQUE SORTED KEY quant COMPONENTS quant,
          lr_cart_line TYPE REF TO book_id,
          lt_filtered_cart_aggr LIKE lt_cart_aggr,
          lr_discount_grp TYPE REF TO ty_discount_grp,
          lt_discount_grps TYPE TABLE OF ty_discount_grp,
          lv_total TYPE total.
    lt_discount_grps = VALUE #( ( unique_books = 5 discount = '0.25' )
                             ( unique_books = 4 discount = '0.20' )
                             ( unique_books = 3 discount = '0.10' )
                             ( unique_books = 2 discount = '0.05' )
                             ( unique_books = 1 discount = 0 ) ).
    total = 999.
    DATA(lv_max_grp) = 5.
    DO 5 TIMES.
      lv_total = 0.
      lt_cart_aggr = VALUE #( ( book_id = 1 )
                             ( book_id = 2 )
                             ( book_id = 3 )
                             ( book_id = 4 )
                             ( book_id = 5 ) ).
      LOOP AT basket REFERENCE INTO lr_cart_line.
        lt_cart_aggr[ book_id = lr_cart_line->* ]-quant += 1.
      ENDLOOP.
      LOOP AT lt_discount_grps REFERENCE INTO lr_discount_grp WHERE unique_books <= lv_max_grp.
        DO.
          CLEAR lt_filtered_cart_aggr.
          LOOP AT lt_cart_aggr REFERENCE INTO lr_cart_aggr WHERE quant > 0.
            APPEND lr_cart_aggr->* TO lt_filtered_cart_aggr.
          ENDLOOP.
          IF lines( lt_filtered_cart_aggr ) < lr_discount_grp->unique_books.
            EXIT.
          ENDIF.
          SORT lt_cart_aggr BY quant DESCENDING.
          DO lr_discount_grp->unique_books TIMES.
            lt_cart_aggr[ sy-index ]-quant -= 1.
          ENDDO.
          lv_total = lv_total + lr_discount_grp->unique_books * 8 * ( 1 - lr_discount_grp->discount ).
        ENDDO.
      ENDLOOP.
      total = nmin( val1 = total val2 = lv_total ).
      lv_max_grp -= 1.
    ENDDO.
  ENDMETHOD.

ENDCLASS.

Erklärung

Die Methode calculate_total berechnet den Gesamtpreis eines Buchkaufs auf der Grundlage einer Liste der gekauften Bücher (Warenkorb).

Die Methode verwendet eine interne Tabelle (ty_cart_aggr_line), um die Menge jedes Buches im Warenkorb zu speichern. Die interne Tabelle wird mit den 5 Büchern initialisiert und die Menge jedes Buches wird aktualisiert, wenn es im Warenkorb gefunden wird.

Eine weitere interne Tabelle (ty_discount_grp) wird verwendet, um die Rabatte auf die Buchpreise zu speichern, die auf der Anzahl der einzelnen Bücher basieren.

Der Algorithmus berechnet dann den Gesamtpreis, indem er die Rabatte für alle möglichen Kombinationen von Unikaten im Warenkorb berechnet und den niedrigsten Gesamtpreis auswählt. Dies wird wiederholt, während die Anzahl der Einzelbücher, für die der Rabatt berechnet wird, verringert wird.

Das Ergebnis wird als Gesamtpreis zurückgegeben.

Über den Autor

Andreas Geiger

Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.

Mehr zu ERP UP

ERP UP unterstützen

Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.

Schreibe einen Kommentar