Code: Alles auswählen.
types: BEGIN OF ty_toa01,
mandt TYPE toa01-mandt,
sap_object TYPE toa01-sap_object,
object_id TYPE toa01-object_id,
archiv_id TYPE toa01-archiv_id,
arc_doc_id TYPE toa01-arc_doc_id,
ar_object TYPE toa01-ar_object,
ar_date TYPE toa01-ar_date,
del_date TYPE toa01-del_date,
reserve TYPE toa01-reserve,
END OF ty_toa01.
types: tty_toa01 TYPE SORTED TABLE OF ty_toa01 WITH NON-UNIQUE KEY arc_doc_id.
FORM f_toa01
CHANGING p_toa01 TYPE tty_toa01
MODIFY toa01 FROM TABLE p_toa01.
endform.
Code: Alles auswählen.
insert toa01 from table p_toa01.
If sy-subrc = 4.
write 'Fehler'.
endif.
In der Hilfe steht:sorry, ich habe "accepting duplicate keys" immer so verstanden, dass ein doppelter Eintrag erzeugt wird.
D.h. es werden keine doppelten Zeilen erzeugt, was auch gar nicht möglich ist. D.h. ACCEPTING DUPLICATE KEYS erzeugt keinen Laufzeitfehler falls einzelne Datensätze bereits in der Datenbanktabelle vorhanden sind.Wenn der Zusatz ACCEPTING DUPLICATE KEYS angegeben ist, werden alle Zeilen eingefügt, für die dies möglich ist. Die restlichen Zeilen werden verworfen und sy-subrc wird auf 4 gesetzt. Das Systemfeld sy-dbcnt wird auf die Anzahl der eingefügten Zeilen gesetzt.
Code: Alles auswählen.
SELECT sap_object, object_id, archiv_id, arc_doc_id
INTO TABLE existing_entries
FROM toa01
FOR ALL ENTRIES IN @p_toa01
WHERE sap_object = @p_toa01-sap_object
AND object_id = @p_toa01-object_id
AND archiv_id = @p_toa01-archiv_id
AND arc_doc_id = @p_toa01-arc_doc_id.
LOOP AT p_toa01 REFERENCE INTO DATA(archive_link).
IF NOT line_exists( existing_entries[ sap_object = @p_toa01-sap_object object_id = @p_toa01-object_id archiv_id = @p_toa01-archiv_id arc_doc_id = @p_toa01-arc_doc_id ] ).
INSERT archive_link INTO TABLE new_archive_link_entries.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
DATA:
lv_archiv_id TYPE toav0-archiv_id, " PI
lv_arc_doc_id TYPE toav0-arc_doc_id, " 0050569B043C1EE99C9C9B7E1977F4A
lv_ar_date TYPE toav0-ar_date, " sy-datum
lv_ar_object TYPE toaom-ar_object, " FIOPAYAVIS
lv_object_id TYPE sapb-sapobjid, " 1057000000082019
lv_sap_object TYPE toaom-sap_object. " BKPF
lv_archiv_id = s_toa-archiv_id.
lv_arc_doc_id = l_doc_id.
lv_ar_date = sy-datum.
lv_ar_object = s_toa-ar_object.
lv_object_id = s_toa-object_id.
lv_sap_object = s_toa-sap_object.
CALL FUNCTION 'ARCHIV_CONNECTION_INSERT'
EXPORTING
archiv_id = lv_archiv_id
arc_doc_id = lv_arc_doc_id
ar_date = lv_ar_date
ar_object = lv_ar_object
object_id = lv_object_id
sap_object = lv_sap_object
EXCEPTIONS
error_connectiontable = 1
OTHERS = 2.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Sonne1234
Code: Alles auswählen.
Loop at p_toa01 ASSIGNING <p_toa01>.
CALL FUNCTION 'ARCHIV_CONNECTION_INSERT'
EXPORTING
ARCHIV_ID = 'FI'
arc_doc_id = <p_toa01>-arc_doc_id
AR_DATE = sy-datum
ar_object = <p_toa01>-ar_object
* DEL_DATE = ' '
* MANDANT = ' '
object_id = <p_toa01>-object_id
sap_object = <p_toa01>-sap_object
DOC_TYPE = 'PDF'
* BARCODE = ' '
* FILENAME = ' '
* DESCR = ' '
* CREATOR = ' '
EXCEPTIONS
ERROR_CONNECTIONTABLE = 1
OTHERS = 2.
If sy-subrc = 0.
<p_toa01>-znachricht = 'Verknüpfung erstellt.'.
elseif
sy-subrc <> 0.
<p_toa01>-znachricht = 'Verknüpfung wurde nicht erstellt.Doppelter Eintrag?'.
ENDIF.
endloop.
Überleg Dir, was Du zu finden erwartest: eine Zeile oder mehrere Zeilen.Aber ich bin mir manchmal irgendwie noch unsicher, ob ich wirklich einen LOOP benötige
LOOP INTO ist relativ veraltet; das braucht man eigentlich gar nicht mehr. ASSIGNING ist schneller, spart Speicher und erspart Dir MODIFYs und DATA-Deklarationen von Workarea-Feldern. ASSIGNING arbeitet direkt mit den Daten aus der Tabelle; INTO erzeugt eine Kopie davon. INTO würdest Du allenfalls dann brauchen, wenn Du den gelesenen Wert aus irgendeinem Grund nach dem Lesen verändern möchtest, ohne dass sich auch die entsprechende Zeile in der internen Tabelle ändern soll. Ein praktischer Anwendungsfall hierfür fällt mir allerdings nicht ein; ich habe schon seit Ewigkeiten keinen LOOP INTO mehr programmiert. An Feldsymbole muss man sich erst gewöhnen, aber dann sind sie viel eleganter als das Hantieren mit Workarea-Feldern.und ob ich diesen dann mit INTO oder ASSIGNING aufbauen sollte
Code: Alles auswählen.
DATA:
lv_archiv_id TYPE toav0-archiv_id, " PI
lv_arc_doc_id TYPE toav0-arc_doc_id, " 0050569B043C1EE99C9C9B7E1977F4A
lv_ar_date TYPE toav0-ar_date, " sy-datum
lv_ar_object TYPE toaom-ar_object, " FIOPAYAVIS
lv_object_id TYPE sapb-sapobjid, " 1057000000082019
lv_sap_object TYPE toaom-sap_object, " BKPF
lv_doc_type TYPE TOADV-DOC value 'PDF'.
Loop at p_toa01 ASSIGNING <p_toa01>.
lv_archiv_id = 'FI'.
lv_arc_doc_id = <p_toa01>-arc_doc_id.
lv_ar_date = sy-datum.
lv_ar_object = <p_toa01>-ar_object.
lv_object_id = <p_toa01>-object_id.
lv_sap_object = <p_toa01>-sap_object.
CALL FUNCTION 'ARCHIV_CONNECTION_INSERT'
EXPORTING
archiv_id = lv_archiv_id
arc_doc_id = lv_arc_doc_id
ar_date = lv_ar_date
ar_object = lv_ar_object
* DEL_DATE = ' '
* MANDANT = ' '
object_id = lv_object_id
sap_object = lv_sap_object
DOC_TYPE = lv_doc_type
* BARCODE = ' '
* FILENAME = ' '
* DESCR = ' '
* CREATOR = ' '
EXCEPTIONS
ERROR_CONNECTIONTABLE = 1
OTHERS = 2.
If sy-subrc = 0.
<p_toa01>-znachricht = 'Verknüpfung erstellt.'.
" elseif
" sy-subrc <> 0.
else.
<p_toa01>-znachricht = 'Verknüpfung wurde nicht erstellt.Doppelter Eintrag?'.
ENDIF.
endloop.
Eine Philosophiefrage. Ich benutze gerne Literale, nicht nur weil es schnell geht, sondern weil ich sogar der Meinung bin, dass der Code bedeutend besser lesbar ist, wenn da konkret das steht, was übergeben werden soll und nicht nur ein ominöser Feldname, bei dem man erst ermitteln muss, was drin steht, nur um dann rauszufinden, dass es eh nur ein konstanter Wert ist, den man auch direkt hätte hinschreiben können. Wenn das Feld mehrfach verwendet wird und man die Möglichkeit sieht, dass irgendwann mal alles auf einen Schlag per Programmkorrektur auf einen anderen Wert umgestellt werden soll, hat so eine Variable vielleicht einen Vorteil. Diese Möglichkeit halte ist aber für sehr theoretisch. Für mich sind literalersetzende Felder in aller Regel nicht mehr als ein Wasserkopf.Bei Funktionsbausteinen würde ich auf Literale verzichten und genau mit dem Datentyp übergeben , den der Baustein erwartet.
Womit Du implizit ausdrückst, dass Du auch keine Workareas mehr benutzt, wenn Du programmierst. Dass man nicht hektisch allen bestehenden Altcode ändert und sich bei der Gelegenheit ohne Not neue Programmierfehler einfängt, ist klar. Da sind wir einer Meinung.Zum Thema Feldsymbole: Verwende ich grundsätzlich, wenn die interne Tabelle zu ändern ist, oder ich neues Coding schreibe. Ansonsten wäre mir der Aufwand zu groß alles umzustellen.