- 24. Januar 2014

BOPF: Die Nummernkreise sind nicht rund

Für die Verwendung von Nummernkreisen im Business Object Processing Framework (BOPF) gibt es eine Library Klasse /BOFU/CL_D_DRAW_NUMBER. Diese Klasse zieht Nummern aus einem angegebenen Nummernkreis, die dann für ein Business Object verwendet werden können. Dabei gibt es aber durch ein Problem mit dem Puffer der Nummernkreise häufig Lücken in den Nummerierungen. Dies ist beispielsweise bei Rechnungsnummern ein Problem, falls diese fortlaufend nummeriert werden sollen. Woraus dieses Problem resultiert und wie es behoben werden kann wird in diesem Beitrag beschrieben.

Das Problem

Innerhalb eines Projektes wurde eine große Anzahl von Instanzen eines Business Objects angelegt. Diese Instanzen hatten eine ID, die auf einem Nummernkreis basiert. Dabei fiel auf, dass immer wieder Lücken bei dieser ID auftraten.

Zur Verdeutlichung des Problems ein Beispiel:

Es werden im Projekt durch einen Report 8 neue Instanzen eines Business Objects angelegt.
Die ID der zuletzt angelegten Instanz des Business Objects ist z.B. die 48. Nach dem Import sollte die höchste ID die 56 sein (48 + 8 = 56).

Korrekte Nummernkreisberechnung in SAP BOPF

Abbildung 1: Korrekte Nummernkreisberechnung


Während des Tests ist allerdings aufgefallen, dass die höchste ID nach der Ausführung des Reports die 58 ist.

Fehlerhafte Nummernkreisberechnung in SAP BOPF

Abbildung 2: Fehlerhafte Nummernkreisberechnung

Es stellte sich die Frage, warum die ID um zwei Stellen höher ist, als sie eigentlich sein müsste.

Nutzen Sie unser BOPF Knowhow!
Mit den Business Object Processing Framework (BOPF) läuft Ihre ABAP Entwicklung schneller und günstiger. Unsere Experten wissen wie. - Ingo Biermann, Fachbereichsleiter

Als idealer Einstieg in BOPF Thema gilt unser Kickstarter Angebot

Unsere Lösung für Projekte im SAP Transportation Manangement ist die TM Datenmigration mit BOPF

Gerne spreche ich mit Ihnen auch im Detail über Ihre Ausgangslage und zeige Lösungsmöglichkeiten auf. Auf Wunsch unterbreite ich Ihnen im Anschluss ein unverbindliches Angebot.

Kontaktieren Sie mich: Telefon 0211.9462 8572-16 oder per E-Mail info@erlebe-software.de

 

Die Ursache

Gefunden wurde der Fehler, da auch beim Anlegen von nur 3, 6 oder 7 Instanzen die neue höchste ID immer genau 10 Stellen über der vorherigen höchsten ID lag.
Es stellte sich heraus, dass die Ursache für diesen Fehler im Puffer des Nummernkreises liegt. Im Nummernkreis war das Buffering auf „Main Memory Buffering“ mit einer Anzahl von 10 Nummern eingestellt.

Pufferung des Nummernkreises aktiviert (SAP BOPF)

Abbildung 3: Pufferung des Nummernkreises aktiviert

Durch diese Einstellungen werden bei jeder Anfrage nach einer neuen Nummer gleich 10 Stück in den Puffer gelegt und die höchste Nummer zurückgeliefert. In unserem Fall wurden die Nummern durch eine BOPF Determination angefordert. Diese Determination nutzte die zurückgelieferte Nummer und zählte dann für jede Instanz die sie während des Importes erzeugte eine Stelle zurück.
Wurden also weniger als die 10 gepufferten Nummern verwendet, so wurde der Rest ignoriert und es entstanden Lücken bei der Nummerierung.

Die einfachste Lösung für dieses Problem ist sicherlich die Pufferung des Nummernkreises zu deaktivieren

Pufferung der Nummernkreise deaktiviert (SAP BOPF)

Abbildung 4: Pufferung der Nummernkreise deaktiviert

Es gibt jedoch noch eine weitere Möglichkeit diesen Fehler in BOPF zu umgehen.

Wird beispielsweise eine Validierung benötigt um einen alternativen Schlüssel zu erzeugen, so erbt diese von der Klasse /BOFU/CL_D_DRAW_NUMBER. In dieser Klasse gibt es eine Membervariable MV_IGNORE_BUFFER welche initial auf false steht.

Pufferung bei Nummernkreisen ignorieren in SAP BOPF

Abbildung 5: Pufferung bei Nummernkreisen ignorieren

Im Konstruktor kann diese Membervariable auf true gesetzt werden. Anschließend wird der Puffer ignoriert und die richtige Anzahl an Nummern vom Nummernkreis bezogen.

METHOD constructor.
super->constructor( ).
mv_attribute_name = ‚INVOICE_ID‘.
mv_nobj           = ‚/MIND2/INV‘.
mv_nr_range_nr    = ‚1‘.
mv_ignore_buffer  = abap_true.
ENDMETHOD.

Nun sind die Nummernkreise wieder rund: Die Nummern sind fortlaufend ohne Lücken, so wie es bei Nummernkreisen sein soll.


Ich hoffe, ich konnte Ihnen mit dieser Anleitung helfen und freue mich über Ihr Feedback.


SHARE


Schreiben Sie einen Kommentar

Bitte füllen Sie alle mit * gekennzeichneten Felder aus. Ihre E-Mail Adresse wird nicht veröffentlicht.