SAP Tabelle: kein autowert im Primärschlüsselfeld möglich??

Für eine SAP-Kunden-Entwicklung möchte man eigene Tabellen mit Pflegedialog anlegen. Es lässt sich aber kein Primärschlüsselfeld so anlegen, dass es mit einem automatisch generiertem Wert gefüllt wird. Die Lösung hierfür ist dieNutzung eines Nummernkreisobjektes. An einem Beispiel soll erklärt werden wie das geht.


Die Transaktion zum anlegen und pflegen eines Nummernkreisobjektes lautet SNRO.
Der neue Objektname wird eingetragen und neu angelegt.

 

 

 

Kurz- und Langtextbeschreibung eintragen.
Eine Domänendefinition und Länge für den Nummernkreis.
Prozentrest der Nummern eines Nummernkreises, bei dessen Erreichen bei der Nummernvergabe eine Warnung ausgegeben wird.


 

 

Sichern der Einstellungen und anlegen eines Transportauftrages.Wieder zurück auf dem Einstiegsbild wählen wir “Nummernkreise”.

 

Ändern Intervalle

 

Hier ist bereits ein Nummernkreis angelegt. Durch klick auf den Button können weitere Nummernkreise angelegt werden.Das Kennzeichen im Feld würde bedeuten, dass eine externe Nummernvergabe stattfindet. Hier ist aber eine interne Vergabe gewollt, so dass die Tabelle bei jeder neu eingefügten Zeile eine eindeutige Nummer erhält.

Beim sichern des Nummernkreises erscheint die Meldung, dass die Intervalle nicht an das Transportsystem gekoppelt sind. Die Intervalle müssen also entweder manuell in einen Transportauftrag aufgenommen werden oder die Intervalle werden im Zielsystem gepflegt.

Nun muss das Tabellenfeld noch mit der Nummer aus dem Nummernkreis versorgt werden. Dies geschieht in einem dreistufigen Verfahren das über Funktionsbausteine abgewickelt wird.

 

  • Nummernkreis sperren, FuB NUMBER_RANGE_ENQUEUE

 

 

  • nächste freie Nummer holen, FuB NUMBER_GET_NEXT

 

 

  • Nummernkreis freigeben, FuB NUMBER_RANGE_DEQUEUE

 

Am folgenden Beispiel soll erklärt werden wie diese Nummer aus dem definierten Intervall in einem Pflegedialog (SM30) zur Tabelle genutzt werden kann.
Im Tabellenpflegegenerator wählen wir im Menü –Umfeld – Modifikationen – Zeitpunkte aus.

Die Meldung: wird bestätigt.
Neue Einträge

Der Zeitpunkt 05 beschreibt den Zeitpunkt beim erzeugen eines neuen Datensatzes.

alt

Im Feld FORM-Name/Programmname tragen wir eine FORM-Routine ein. Es macht nichts wenn diese noch nicht existiert. Nach dem drücken von ENTER erscheint im Feld Editor ein neues Symbol .Durch klicken auf werden wir aufgefordert ein neues Unterprogramm anzulegen. Dabei kann ein bestehendes INCLUDE ausgewählt bzw. neu angelegt werden. In meinem Beispiel sieht das so aus:

FORM NEXT_NUMBER .
CALL FUNCTION ‚NUMBER_RANGE_ENQUEUE‘
EXPORTING
OBJECT           = ‚Z_INVEST‘
EXCEPTIONS
FOREIGN_LOCK     = 1
OBJECT_NOT_FOUND = 2
SYSTEM_FAILURE   = 3
OTHERS           = 4.
IF SY-SUBRC NE 0.
* message e086 with ‚Lock error‘ sy-subrc.
ENDIF.  

CALL FUNCTION ‚NUMBER_GET_NEXT‘
EXPORTING
NR_RANGE_NR = ’01‘
OBJECT = ‚Z_INVEST‘    

IMPORTING
NUMBER = I_INTNR “ Number generated by Range Generator Object

EXCEPTIONS
INTERVAL_NOT_FOUND = 1
NUMBER_RANGE_NOT_INTERN = 2
OBJECT_NOT_FOUND = 3
QUANTITY_IS_0 = 4
QUANTITY_IS_NOT_1 = 5
INTERVAL_OVERFLOW = 6
BUFFER_OVERFLOW = 7
OTHERS = 8.
IF SY-SUBRC 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.  

CALL FUNCTION ‚NUMBER_RANGE_DEQUEUE‘
EXPORTING
OBJECT = ‚Z_INVEST‘.
IF SY-SUBRC 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ZMM_INVEST_PLAN-INTNR = I_INTNR.
ENDFORM. “ next_number

Schreibe einen Kommentar