Schlüssel erstellen ABAP

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Schlüssel erstellen ABAP

Beitrag von Bright4.5 (Specialist / 298 / 21 / 1 ) »
Hallo zusammen,

Ich würde gerne eine ID für jeden Datensatz den ich in einer DB-Tabelle erstelle erzeugen.

Ich habe ein Feld mit 10 Zeichen dafür zur Verfügung (CHAR10).

Nun soll diese ID natürlich immer einmalig für jeden Datensatz sein.

Ich würde gerne die Zeichen 0 - 9 und a - z verwenden, damit ich mehr Möglichkeiten habe.

Wenn ich immer nur hochzählen lassen würde etwa ich nur etwas mehr als 3 Millionen. Das reicht mir nicht, deshalb noch die Buchstaben.

Kennt da jemand einen Funktionsbaustein oder eine Methode?

Vielen Dank im Voraus.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Schlüssel erstellen ABAP

Beitrag von a-dead-trousers (Top Expert / 4445 / 226 / 1196 ) »
Dafür hat die SAP die sog. Nummernkreise vorgesehen.
(Funktionsbaustein NUMBER_GET_NEXT)
Über die externe Nummernvergabe kann man da sogar Buchstaben verwenden.

Ich verwende aber lieber GUIDs weil die keine umständlich Konfiguration benötigen. Das Zielfeld muss dazu aber min. 22 Zeichen lang sein.
(Methode CL_SYSTEM_UUID=>CREATE_UUID_C22)

EDIT: Alternativ hab ich mir schon mal eine Zählvariante gebaut die bis zu einem INT8 zählt und dann das Ergebnis in BASE36 (Buchstaben und Zahlen) umrechnet. Aber nachdem man hier auch zuerst bestimmen müsste, was die höchste Zahl ist, nur um dann 1 dazuzuzählen, hab ich das dann doch wieder verworfen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Schlüssel erstellen ABAP

Beitrag von black_adept (Top Expert / 4131 / 130 / 955 ) »
Bright4.5 hat geschrieben:
27.03.2025 13:32
Ich habe ein Feld mit 10 Zeichen dafür zur Verfügung (CHAR10).
[...]
Wenn ich immer nur hochzählen lassen würde etwa ich nur etwas mehr als 3 Millionen.
Wie kommst du zu diesem verwirrend kleinen Ergebnis? Bei mir ergeben 10 Ziffern (dezimal) 10 Milliarden Einträge.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Schlüssel erstellen ABAP

Beitrag von rob_abc (Specialist / 125 / 33 / 50 ) »
Hallo zusammen

Das ist doch ein schöner Anwendungsfall um etwas TTD zu üben. Zum Beispiel nach Woche 2 von dem Kurs: https://learning.sap.com/courses/writin ... e-for-abap
Und die Business-Logik ist mal was anderes als Personaldaten, Handling Units oder irgendwelche Konten =)

Hier mein Konvertierer für Stellwertsysteme. Damit man fürs Hochzählen nicht hin und her konvertieren muss, habe ich noch die Methode get_next_number hinzugefügt.

Code: Alles auswählen.

REPORT.
CLASS lcl_base_converter DEFINITION.
  PUBLIC SECTION.
    CONSTANTS:
      BEGIN OF system,
        binary  TYPE i VALUE 2,
        octal   TYPE i VALUE 8,
        decimal TYPE i VALUE 10,
        hex     TYPE i VALUE 16,
        base36  TYPE i VALUE 36,
        base62  TYPE i VALUE 62,
      END OF system.

    CLASS-METHODS set_base
      IMPORTING i_base TYPE i.

    CLASS-METHODS base_to_decimal
      IMPORTING i_number        TYPE string
      RETURNING VALUE(r_result) TYPE decfloat34.

    CLASS-METHODS decimal_to_base
      IMPORTING i_number        TYPE decfloat34
      RETURNING VALUE(r_result) TYPE string.

    CLASS-METHODS get_next_number
      IMPORTING i_number        TYPE string
      RETURNING VALUE(r_result) TYPE string.

  PRIVATE SECTION.
    CLASS-DATA base TYPE i VALUE 62.

    CONSTANTS c_base_chars TYPE string VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
ENDCLASS.


CLASS lcl_base_converter IMPLEMENTATION.
  METHOD decimal_to_base.
    IF i_number = 0.
      RETURN c_base_chars(1).
    ENDIF.
    DATA(number) = i_number.
    WHILE number > 0.
      DATA(remainder) = number MOD base.
      r_result = c_base_chars+remainder(1) && r_result.
      number = number DIV base.
    ENDWHILE.
  ENDMETHOD.

  METHOD base_to_decimal.
    DATA l_factor TYPE decfloat34 VALUE 1.

    IF NOT ( i_number CA c_base_chars ).
      RETURN.
    ENDIF.
    DATA(len) = strlen( i_number ).
    DO len TIMES.
      len -= 1.
      DATA(char) = i_number+len(1).
      FIND char IN c_base_chars MATCH OFFSET DATA(off).
      r_result += ( off * l_factor ).
      l_factor *= base.
    ENDDO.
  ENDMETHOD.

  METHOD get_next_number.
    DATA overflow TYPE i.

    DATA(len) = strlen( i_number ).
    DO len TIMES.
      DATA(idx) = len - sy-index.
      DATA(char) = i_number+idx(1).
      FIND char IN c_base_chars MATCH OFFSET DATA(off).
      IF off < base - 1.
        off += 1.
        r_result = i_number+0(idx) && c_base_chars+off(1) && r_result.
        EXIT.
      ENDIF.
      overflow += 1.
    ENDDO.
    IF overflow = len.
      r_result = c_base_chars+1(1).
    ENDIF.
    DO overflow TIMES.
      r_result = |{ r_result }{ c_base_chars(1) }|.
    ENDDO.
  ENDMETHOD.

  METHOD set_base.
    base = i_base.
  ENDMETHOD.
ENDCLASS.


CLASS ltc_converter_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.

  PRIVATE SECTION.
    METHODS to_62_1    FOR TESTING.
    METHODS to_62_2    FOR TESTING.
    METHODS to_hex     FOR TESTING.
    METHODS to_binary  FOR TESTING.
    METHODS to_decimal FOR TESTING.
    METHODS to_dec_1   FOR TESTING.
    METHODS to_dec_2   FOR TESTING.
    METHODS to_dec_3   FOR TESTING.
    METHODS next_1     FOR TESTING.
    METHODS next_2     FOR TESTING.
    METHODS next_3     FOR TESTING.
ENDCLASS.


CLASS ltc_converter_test IMPLEMENTATION.
  METHOD next_1.
    lcl_base_converter=>set_base( lcl_base_converter=>system-binary ).
    cl_abap_unit_assert=>assert_equals( exp = '1'
                                        act = lcl_base_converter=>get_next_number( '0' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '11'
                                        act = lcl_base_converter=>get_next_number( '10' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '100'
                                        act = lcl_base_converter=>get_next_number( '11' ) ).
  ENDMETHOD.

  METHOD next_2.
    lcl_base_converter=>set_base( lcl_base_converter=>system-hex ).
    cl_abap_unit_assert=>assert_equals( exp = '10'
                                        act = lcl_base_converter=>get_next_number( 'F' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '100'
                                        act = lcl_base_converter=>get_next_number( 'FF' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '1'
                                        act = lcl_base_converter=>get_next_number( '0' ) ).
  ENDMETHOD.

  METHOD next_3.
    lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
    cl_abap_unit_assert=>assert_equals( exp = '10'
                                        act = lcl_base_converter=>get_next_number( 'z' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '100'
                                        act = lcl_base_converter=>get_next_number( 'zz' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '1'
                                        act = lcl_base_converter=>get_next_number( '0' ) ).
  ENDMETHOD.

  METHOD to_62_1.
    lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
    cl_abap_unit_assert=>assert_equals( exp = '0'
                                        act = lcl_base_converter=>decimal_to_base( 0 ) ).
    cl_abap_unit_assert=>assert_equals( exp = '9'
                                        act = lcl_base_converter=>decimal_to_base( 9 ) ).
    cl_abap_unit_assert=>assert_equals( exp = 'A'
                                        act = lcl_base_converter=>decimal_to_base( 10 ) ).
  ENDMETHOD.

  METHOD to_62_2.
    lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
    cl_abap_unit_assert=>assert_equals( exp = 'z'
                                        act = lcl_base_converter=>decimal_to_base( 61 ) ).
    cl_abap_unit_assert=>assert_equals( exp = '10'
                                        act = lcl_base_converter=>decimal_to_base( 62 ) ).
    cl_abap_unit_assert=>assert_equals( exp = 'KyXecRaPqzvjQ8BcV'
                                        act = lcl_base_converter=>decimal_to_base( 999999999999999999999999999999 ) ).
  ENDMETHOD.

  METHOD to_hex.
    lcl_base_converter=>set_base( lcl_base_converter=>system-hex ).
    cl_abap_unit_assert=>assert_equals( exp = '11'
                                        act = lcl_base_converter=>decimal_to_base( 17 ) ).
    cl_abap_unit_assert=>assert_equals( exp = '611'
                                        act = lcl_base_converter=>decimal_to_base( 1553 ) ).
  ENDMETHOD.

  METHOD to_binary.
    lcl_base_converter=>set_base( lcl_base_converter=>system-binary ).
    cl_abap_unit_assert=>assert_equals( exp = '11'
                                        act = lcl_base_converter=>decimal_to_base( 3 ) ).
    cl_abap_unit_assert=>assert_equals( exp = '10000000000'
                                        act = lcl_base_converter=>decimal_to_base( 1024 ) ).
  ENDMETHOD.

  METHOD to_decimal.
    lcl_base_converter=>set_base( lcl_base_converter=>system-decimal ).
    cl_abap_unit_assert=>assert_equals( exp = '10'
                                        act = lcl_base_converter=>decimal_to_base( 10 ) ).
    cl_abap_unit_assert=>assert_equals( exp = '99'
                                        act = lcl_base_converter=>decimal_to_base( 99 ) ).
  ENDMETHOD.

  METHOD to_dec_1.
    lcl_base_converter=>set_base( lcl_base_converter=>system-hex ).
    cl_abap_unit_assert=>assert_equals( exp = '17'
                                        act = lcl_base_converter=>base_to_decimal( '11' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '1553'
                                        act = lcl_base_converter=>base_to_decimal( '611' ) ).
  ENDMETHOD.

  METHOD to_dec_2.
    lcl_base_converter=>set_base( lcl_base_converter=>system-binary ).
    cl_abap_unit_assert=>assert_equals( exp = '3'
                                        act = lcl_base_converter=>base_to_decimal( '11' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '1024'
                                        act = lcl_base_converter=>base_to_decimal( '10000000000' ) ).
  ENDMETHOD.

  METHOD to_dec_3.
    lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
    cl_abap_unit_assert=>assert_equals( exp = '0'
                                        act = lcl_base_converter=>base_to_decimal( '0' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '61'
                                        act = lcl_base_converter=>base_to_decimal( 'z' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '62'
                                        act = lcl_base_converter=>base_to_decimal( '10' ) ).
    cl_abap_unit_assert=>assert_equals( exp = '999999999999999999999999999999'
                                        act = lcl_base_converter=>base_to_decimal( 'KyXecRaPqzvjQ8BcV' ) ).
  ENDMETHOD.
ENDCLASS.

Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag:
a-dead-trousers


Seite 1 von 1

Vergleichbare Themen

1
Antw.
2883
Views
Schlüssel > 120, generischer Schlüssel vergrößern
von zer0 » 27.01.2014 09:20 • Verfasst in ABAP® Core
6
Antw.
17854
Views
Mit ABAP Zufallszahlen erstellen
von Azreal » 06.02.2009 09:38 • Verfasst in Tips + Tricks & FAQs
1
Antw.
3445
Views
Word Dokument aus ABAP erstellen
von ROL_ABAP » 15.02.2013 13:24 • Verfasst in ABAP® für Anfänger
0
Antw.
1603
Views
Hierarchie-Textknoten mit ABAP erstellen
von sapjob » 12.02.2016 16:52 • Verfasst in Sonstige Module
2
Antw.
1903
Views
Word Dokument mit Wordvorlage aus ABAP erstellen
von msfox » 19.09.2019 11:35 • Verfasst in ABAP® für Anfänger

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.