Verstehe ich das richtig: Du möchtest eine komplette Datenbanktabelle anlegen und darauf bei jedem Geburtsdatum zugreifen, nur um nicht jedesmal CL_ABAP_RANDOM_INT rufen zu müssen? Datenbankzugriffe sind das Teuerste, was es in ABAP gibt. Insofern glaube ich nicht, dass die Rechnung aufgeht.Um bei mehrmaliger Transformation zu verhindern, dass der Wert dann nochmal verfremdet wird, habe ich mir überlegt, eine Look-Up Tabelle anzulegen mit date_old und date_new.
Code: Alles auswählen.
CALL METHOD /xxx/cl_ano_service_map_date=>get_date
EXPORTING
iv_date = IV_SOURCE
RECEIVING
rv_date_new = EV_RESULT
.
Code: Alles auswählen.
CLASS /xxx/CL_ANO_SERVICE_MAP_DATE IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method /xxx/CL_ANO_SERVICE_MAP_DATE=>GET_DATE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_DATE TYPE DATS
* | [<-()] RV_DATE_NEW TYPE DATS
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_date.
DATA: it_maptable TYPE SORTED TABLE OF /xxx/ano_dat_map WITH NON-UNIQUE KEY date_old.
IF it_maptable IS INITIAL.
SELECT date_old date_new
FROM /xxx/ano_dat_map
INTO TABLE it_maptable.
ENDIF.
READ TABLE it_maptable ASSIGNING FIELD-SYMBOL(<ls_map>)
WITH TABLE KEY date_old = rv_date_new.
IF sy-subrc = 0.
rv_date_new = <ls_map>-date_new.
kann zum rest wenig beitragen, gerade weil ich, wie vermutlich jeder andere, sehr verwirrt über den kontext und sinn bin ..
Nein, das wäre nur Doktern an den Symptomen. Er prüft ja auf den SUBRC, und der READ TABLE setzt den SUBRC, also sollte sein Ansatz genauso gut sein.SaskuAc hat geschrieben:ABER zum Feldsymbol folgendes... prüfe nicht auf sy-subrc ob es zugewiesen ist sondern "if <ls_map> is assigned." dann dürfte das problem wenigstens behoben sein.
Bleib entspannt; ich bin doch schon dabei.vielleicht kann ja trotzdem jemand einem verzweifelten anfänger unter die Arme greifen^^
Mir ging es bei meinen Fragen weniger um die Performance und mehr um den Sinn des Ganzen. Aber wenn es natürlich eine Übungsaufgabe ist, dann stellt sich die Frage nach dem Sinn nicht.Wie (in-)performant die ganze Geschichte ist, wage ich nicht zu beurteilen, aber das war erstmal die Aufgabe, die ich so in Angriff nehmen sollte.
Das habe ich verstanden. Und genau daraus haben sich für mich die Fragen ergeben, die ich in meiner vorigen Antwort gestellt habe. Weshalb ist es wichtig, dass es für jedes Geburtsdatum nur ein neues Zufallsdatum gibt? (Außer die Frage ist irrelevant, weil die Aufgabe halt so lautet.)Die Tabelle soll eigentlich nur dazu dienen, zu gewährleisten, dass es für jedes Geburtsdatum nur ein neues Zufallsdatum gibt, welches ihm zugeordnet ist. Also dass bei erneuter Beladung oder Transformation im weiteren Datenfluss verhindert wird, dass einem date_old ein anderes date_new zugeordnet wird, als zuvor.
Das kann eigentlich nicht sein, denn Du fragst ja den SY-SUBRC des READ TABLE ab. Allerdings hast Du da einen Syntaxfehler drin. Bei WITH TABLE KEY erwartet ABAP einen explizit benannten Schlüssel. Du gibst aber einfach nur die Schlüsselbedingung basierend auf Deinem Primärschlüssel an. Das ist zulässig, aber dann musst Du WITH KEY statt WITH TABLE KEY schreiben!das löst aber momentan im debugging noch einen Dump aus, weil das Feldsymbol noch nicht zugewiesen ist...
Code: Alles auswählen.
IF it_maptable IS INITIAL.
SELECT date_old date_new
FROM /xxx/ano_dat_map
INTO TABLE it_maptable.
ENDIF.
Code: Alles auswählen.
READ TABLE it_maptable ASSIGNING FIELD-SYMBOL(<ls_map>)
WITH TABLE KEY date_old = rv_date_new.
IF sy-subrc = 0.
rv_date_new = <ls_map>-date_new.
Code: Alles auswählen.
rv_date_new = VALUE #( it_maptable[ date_old = rv_date_new ]-date_new DEFAULT rv_date_new ).
Code: Alles auswählen.
rv_date_new = VALUE #( it_maptable[ date_old = rv_date_new ]-date_new OPTIONAL ).
IF rv_date_new IS INITIAL.
" Generate new mapping value here
ENDIF.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
black_adept
Also das einzige, was mir da einfallen würde, wäre, dass ihr doch noch kein SAP-Release >= 7.40 habt. Dann geht nämlich die ganze Syntax ASSIGNING FIELD-SYMBOL() nicht, sondern dann musst Du das Feldsymbol auf herkömmliche Weise mit dem FIELD-SYMBOLS-Befehl am Anfang des Programms deklarieren. In dem Fall würden meine übrigen Syntaxvorschläge größtenteils natürlich auch nicht funktionieren.( leider bisher ohne Erfolg, irgendwas gefällt ihm mit dem Feldsymbol nicht )
Code: Alles auswählen.
READ TABLE it_maptable ASSIGNING FIELD-SYMBOL(<ls_map>)
WITH TABLE KEY date_old = rv_date_new.