Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report Z_KOPIEREN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z_kopieren.
INCLUDE zdata010.
""Und irgendetwas passt bei den Select-Options noch nicht""""""""""""""""""""""""""""""""""""
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.
PARAMETERS: pa_matnr TYPE mara-matnr.
"Hier fehlt noch die passenden F4 suchhilfen""""""""""""""""""""""""""""""""""
SELECT-OPTIONS : so_mtart FOR wa_mara-mtart. "DEFAULT 'ROH'.
SELECTION-SCREEN BEGIN OF BLOCK werksueb WITH FRAME.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
r2 RADIOBUTTON GROUP rad1,
r3 RADIOBUTTON GROUP rad1,
r4 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK werksueb.
"""""""""""""""""" hier soll in eine Internetabelle alle Werte geschrieben werden """""""""""""""""""""""""
"""""""""""""""""" zb. zwerstat """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""""""" AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1."""""""""""""""""""""""""""""
LOOP AT SCREEN.
IF r1 = 'X'.
SELECT * FROM mara INTO wa_mara
WHERE ersda = so_ersda.
* SELECT SINGLE * FROM mara INTO wa_mara
* WHERE matnr = pa_matnr.
SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
WHERE matnr = wa_mara AND
sobsl = '20' OR sobsl = '30'.
ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
"
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
OR wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
check wa_cdpos-value_new = 0.
ENDSELECT.
ENDSELECT.
"endselect.
ENDIF.
ENDLOOP.
LOOP AT SCREEN.
IF r2 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT SINGLE * FROM marc INTO wa_marc
WHERE matnr = pa_matnr AND
sobsl = '10' OR sobsl = '50'.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
"
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
LOOP AT SCREEN.
IF r3 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT * FROM marc INTO wa_marc
WHERE matnr = pa_matnr AND
sobsl = '10' .
ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '2'
OR wa_cdpos-value_old = '2' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '2'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
LOOP AT SCREEN.
IF r4 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT * FROM marc INTO wa_marc
WHERE matnr = pa_matnr AND
sobsl = '10' OR sobsl = '30' OR sobsl = '50'.
ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr." AND
"
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
"ENDSELECT.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = matnr
IMPORTING
output = wa_cdhdr-objectid
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ELSE.
wa_cdhdr-objectid = matnr.
*[/Ergänzung]
ENDIF.
LOOP AT SCREEN.
IF r1 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
WHERE matnr = pa_matnr AND
sobsl = '20' OR sobsl = '30'.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
"
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
OR wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
LOOP AT SCREEN.
IF r2 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT SINGLE * FROM marc INTO wa_marc
WHERE matnr = pa_matnr AND
sobsl = '10' OR sobsl = '50'.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
"
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
LOOP AT SCREEN.
IF r3 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT * FROM marc INTO wa_marc
WHERE matnr = pa_matnr AND
sobsl = '10' .
ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '2'
OR wa_cdpos-value_old = '2' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '2'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
LOOP AT SCREEN.
IF r4 = 'X'.
SELECT SINGLE * FROM mara INTO wa_mara
WHERE matnr = pa_matnr.
SELECT * FROM marc INTO wa_marc
WHERE matnr = pa_matnr AND
sobsl = '10' OR sobsl = '30' OR sobsl = '50'.
ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr." AND
"
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
WHERE matnr = wa_mara AND
sobsl = '20' OR sobsl = '30'.
hier bei where matnr = wa_mara ????? wa_mara-matnr meinst du wohl eher.
ENDSELECT.Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus
Danke für deine gute Antwort.Alexander D. hat geschrieben:hallo commolus,
hier auf die Schnelle man ein paar Anmerkungen zu Deinem Beispielcode:
- auf SELECT * würde ich versuchen zu verzichten, wenn du aus der MARA nur drei Felder benötigst, dann lies auch nur diese
- beim Select auf MARC bedienst du nicht den vollen Schlüssel, WERKS ist nämlich ein Teil davon. Ich weiss jetzt nicht mit wievielen Werken ihr arbeitet, eventuell hilft hier auch ein neuer Index auf der DB
- weiterhin würde ich versuchen die in sich verschachtelten Selects aufzubrechen. mara-->marc und cdhdr-->cdpos. Schau doch mal, ob du da nicht mit einem JOIN alle benötigten Sätze auf ein Mal in eine interne Tabelle lesen kannst (Stichwort APPENDING TABLE)
über die Transaktionen ST05 (SQL-Trace) und SE30 (Laufzeitanalyse) lässt es sich gut nach den Stellen forschen wo die meisste Zeit verbraucht wird
hoffe das hilft erstmal ein wenig weiter
Gruss
Alexander
Das AND bindet stärker als das OR, Deine Bedingung liest also entweder alle passenden MATNR mit SOBSL = '20' oder ALLE Materialnummern mit SOBSL = '30'.SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
WHERE matnr = wa_mara AND
sobsl = '20' OR sobsl = '30'.
Code: Alles auswählen.
SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
WHERE matnr = wa_mara AND (sobsl = '20' OR sobsl = '30').
Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus
Code: Alles auswählen.
*--------------------------------------------------------------------*
* Report Z_KOPIEREN
*--------------------------------------------------------------------*
REPORT z_kopieren.
TABLES: mara.
"### wurde nicht verwendet
*INCLUDE zdata010.
"### Deklaration der Workarea´s
DATA: wa_mara LIKE mara,
wa_marc LIKE marc,
wa_cdhdr LIKE cdhdr,
wa_cdpos LIKE cdpos.
"Deklaration einer Tabelle für die Zwischenspeicherung MARA+MARC
TYPES: BEGIN OF t_itab,
matnr LIKE mara-matnr,
sobsl LIKE marc-sobsl,
ersda LIKE mara-ersda,
ernam LIKE mara-ernam,
objectid LIKE cdhdr-objectid,
END OF t_itab.
DATA: gt_itab TYPE SORTED TABLE OF t_itab
WITH NON-UNIQUE KEY matnr sobsl,
wa_itab LIKE LINE OF gt_itab.
FIELD-SYMBOLS: <itab> TYPE t_itab.
"Deklaration einer Tabelle für die Zwischenspeicherung CDHDR
TYPES: BEGIN OF t_cdhdr,
objectid LIKE cdhdr-objectid,
changenr LIKE cdhdr-changenr,
udate LIKE cdhdr-udate,
username LIKE cdhdr-username,
END OF t_cdhdr.
DATA: gt_cdhdr TYPE HASHED TABLE OF t_cdhdr
WITH UNIQUE KEY objectid changenr,
wa_cdhdr2 LIKE LINE OF gt_cdhdr.
"Deklaration einer Tabelle für die Zwischenspeicherung CDPOS
TYPES: BEGIN OF t_cdpos,
objectid LIKE cdhdr-objectid,
changenr LIKE cdhdr-changenr,
value_old LIKE cdpos-value_old,
value_new LIKE cdpos-value_new,
udate LIKE cdhdr-udate,
username LIKE cdhdr-username,
END OF t_cdpos.
DATA: gt_cdpos TYPE SORTED TABLE OF t_cdpos
WITH NON-UNIQUE KEY objectid,
wa_cdpos2 LIKE LINE OF gt_cdpos.
FIELD-SYMBOLS: <cdpos> TYPE t_cdpos.
""Und irgendetwas passt bei den Select-Options noch nicht
"### was genau passt denn nicht?
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.
PARAMETERS: pa_matnr TYPE mara-matnr.
"### F4-Hilfe bekommt man, wenn man auf mara-mtart verweist
"### mtart wird nicht verwendet
"Hier fehlt noch die passenden F4 suchhilfen""""""""""""""""""""""
SELECT-OPTIONS : so_mtart FOR mara-mtart. "DEFAULT 'ROH'.
SELECTION-SCREEN BEGIN OF BLOCK werksueb WITH FRAME.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
r2 RADIOBUTTON GROUP rad1,
r3 RADIOBUTTON GROUP rad1,
r4 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK werksueb.
START-OF-SELECTION.
"Materialnummern passend zur Selektion lesen --> GT_ITAB
PERFORM lesen_daten.
IF r1 = 'X'.
* SELECT * FROM mara INTO wa_mara
* WHERE ersda = so_ersda.
"### da so_ersda eine Range ist müsste es hier richtigerweise WHERE ersda IN so_ersda heissen
"gecashte Materialnummern lesen mit sobsl passend zu R1
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '20' OR sobsl = '30'.
"### hier zumindest über OBJECTCLAS, OBJECTID selektieren!!!
"###und wenn du über pa_matnr selektierst, dann stell sicher, daß
"das Feld auch gefüllt ist:
" PARAMETERS: pa_matnr TYPE mara-matnr OBLIGATORY.
"Sonst liest du ALLE Änderungsbelege
"an diese Stelle statt diesem Code hier kommt nun ein LOOP über
"GT_CDPOS...
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
"### auch hier reicht die CHANGENR allein nicht aus!
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
"
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
OR wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.
WRITE: 'Erstellt am:', wa_itab-ersda, wa_itab-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
CHECK wa_cdpos-value_new = 0.
ENDSELECT.
ENDSELECT.
ENDLOOP.
ELSEIF r2 = 'X'.
* SELECT SINGLE * FROM mara INTO wa_mara
* WHERE matnr = pa_matnr.
*
*
* SELECT SINGLE * FROM marc INTO wa_marc
* WHERE matnr = pa_matnr AND
* sobsl = '10' OR sobsl = '50'.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
"
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ELSEIF r3 = 'X'.
"### SELECT-ENDSELECT auf MARC macht keinen Sinn. es kommt nur ein
"Treffer
* SELECT SINGLE * FROM mara INTO wa_mara
* WHERE matnr = pa_matnr.
*
*
* SELECT * FROM marc INTO wa_marc
* WHERE matnr = pa_matnr AND
* sobsl = '10' .
* ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '2'
OR wa_cdpos-value_old = '2' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '2'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ELSEIF r4 = 'X'.
* SELECT SINGLE * FROM mara INTO wa_mara
* WHERE matnr = pa_matnr.
*
*
* SELECT * FROM marc INTO wa_marc
* WHERE matnr = pa_matnr AND
* sobsl = '10' OR sobsl = '30' OR sobsl = '50'.
* ENDSELECT.
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr." AND
"
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDSELECT.
ENDSELECT.
ENDIF.
"### wo kommt matnr her?
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = pa_matnr
IMPORTING
output = wa_cdhdr-objectid
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ELSE.
wa_cdhdr-objectid = pa_matnr.
ENDIF.
*&---------------------------------------------------------------------*
*& Form LESEN_DATEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM lesen_daten .
"erster Step - cashen von MARA+MARC mit Einschränkung auf so_ersda
"bei AND marc~werks = 'MET' muss natürlich euer Werk stehen
SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
APPENDING TABLE gt_itab
FROM mara JOIN marc ON mara~matnr = marc~matnr
AND marc~werks = 'MET'
WHERE mara~ersda IN so_ersda.
"umschaufeln der Matnr nach objectid
LOOP AT gt_itab ASSIGNING <itab>.
<itab>-objectid = <itab>-matnr.
ENDLOOP.
"zweiter Step - cashen von cdhdr für alle MATNR in GT_ITAB
"hier ist kein Join auf CDHDR+CDPOS möglich
IF gt_itab IS NOT INITIAL.
SELECT objectid changenr udate username
APPENDING TABLE gt_cdhdr
FROM cdhdr
FOR ALL ENTRIES IN gt_itab
WHERE cdhdr~objectclas = 'MATERIAL'
AND cdhdr~objectid = gt_itab-objectid.
ENDIF.
"dritter Step - cashen von cdpos für alle objectid in CDHDR
IF NOT gt_cdhdr IS INITIAL.
SELECT objectid changenr value_old value_new
FROM cdpos APPENDING TABLE gt_cdpos
FOR ALL ENTRIES IN gt_cdhdr
WHERE objectclas = 'MATERIAL'
AND objectid = gt_cdhdr-objectid.
ENDIF.
" zu den Änderungspositionen die Werte aus CDHDR dazu lesen
LOOP AT gt_cdpos ASSIGNING <cdpos>.
CLEAR wa_cdhdr2.
READ TABLE gt_cdhdr INTO wa_cdhdr2
WITH TABLE KEY objectid = <cdpos>-objectid
changenr = <cdpos>-changenr.
<cdpos>-username = wa_cdhdr2-username.
<cdpos>-udate = wa_cdhdr2-udate.
ENDLOOP.
ENDFORM. " LESEN_DATEN
Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus
Code: Alles auswählen.
.
""Und irgendetwas passt bei den Select-Options noch nicht
"### was genau passt denn nicht?
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.
PARAMETERS: pa_matnr TYPE mara-matnr.
[u]Antwort[/u]
[color=#FF0000] ”### was genau past denn nicht
*#* Es sollte die erste Selektion auf das Datum gehen, nur wenn das
*#* Datumsfeld leer bleibt sollte die Selektion auf eine Materialnummer
*#* gehen. [/color]@
.
.
.
IF r1 = 'X'.
* SELECT * FROM mara INTO wa_mara
* WHERE ersda = so_ersda.
"### da so_ersda eine Range ist müsste es hier richtigerweise WHERE ersda IN so_ersda heissen
*#* Sobald ich die obrige Selections aktiviere kommt es zu einer
*#* Fehlermeldung weil die IF und ELSEIF-Anweisungen nicht mehr passt. Ich *#* glaub ich brauche aber diese Selektion auf das Datum, weil dies die *#* Hauptabfrage sein sollte.
"gecashte Materialnummern lesen mit sobsl passend zu R1
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '20' OR sobsl = '30'.
"### hier zumindest über OBJECTCLAS, OBJECTID selektieren!!!
"###und wenn du über pa_matnr selektierst, dann stell sicher, daß
"das Feld auch gefüllt ist:
" PARAMETERS: pa_matnr TYPE mara-matnr OBLIGATORY.
"Sonst liest du ALLE Änderungsbelege
"an diese Stelle statt diesem Code hier kommt nun ein LOOP über
"GT_CDPOS...
SELECT * FROM cdhdr INTO wa_cdhdr
WHERE objectid = pa_matnr.
"### auch hier reicht die CHANGENR allein nicht aus!
SELECT * FROM cdpos INTO wa_cdpos
WHERE changenr = wa_cdhdr-changenr.
[u]Antwort[/u]
[color=#FF0000]*#* SELECT * FROM cdpos INTO wa_cdpos
*#* WHERE objectclas = wa_cdhdr-objectclas
*#* AND changenr = wa_cdhdr-changenr.
*#* Wie dies mit dem Loop gemeint ist leuchtet mir leider nicht ganz ein. *#* Sollte dieser im Ansatz so aussehen wie der LOOP AT gt_itab? [/color]@
.
.
.
ELSEIF r2 = 'X'.
* SELECT SINGLE * FROM mara INTO wa_mara
* WHERE matnr = pa_matnr.
*
*
* SELECT SINGLE * FROM marc INTO wa_marc
* WHERE matnr = pa_matnr AND
* sobsl = '10' OR sobsl = '50'.
[color=#FF0000]
*#* Sollten hier die gleichen Veränderungen vorgenommen warden wie bei dem *#* ersten Auswahlbutton? Ich habe noch nicht so viel mit IF und ELSEIF
*#* gearbeitet. Deshalb sieht meine Selectanweisung auch so verwirrend aus. [/color]@
"### wo kommt matnr her?
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = pa_matnr
IMPORTING
OUTPUT = wa_cdhdr-objectid
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ELSE.
wa_cdhdr-objectid = pa_matnr.
ENDIF.
[color=#FF0000]
*#* Die Materialnummer sollte aus der PARAMETERSselektion kommen falls das *#* Eingabefeld auf das Datum nicht befüllt wurde.
[/color]@
*&---------------------------------------------------------------------*
*& Form LESEN_DATEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM lesen_daten .
"erster Step - cashen von MARA+MARC mit Einschränkung auf so_ersda
"bei AND marc~werks = 'MET' muss natürlich euer Werk stehen
SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
APPENDING TABLE gt_itab
FROM mara JOIN marc ON mara~matnr = marc~matnr
AND marc~werks = '130'
WHERE mara~ersda IN so_ersda.
"umschaufeln der Matnr nach objectid
LOOP AT gt_itab ASSIGNING <itab>.
<itab>-objectid = <itab>-matnr.
ENDLOOP.
"zweiter Step - cashen von cdhdr für alle MATNR in GT_ITAB
"hier ist kein Join auf CDHDR+CDPOS möglich
IF gt_itab IS NOT INITIAL.
SELECT objectid changenr udate username
APPENDING TABLE gt_cdhdr
FROM cdhdr
FOR ALL ENTRIES IN gt_itab
WHERE cdhdr~objectclas = 'MATERIAL'
AND cdhdr~objectid = gt_itab-objectid.
ENDIF.
"dritter Step - cashen von cdpos für alle objectid in CDHDR
IF NOT gt_cdhdr IS INITIAL.
SELECT objectid changenr value_old value_new
FROM cdpos APPENDING TABLE gt_cdpos
FOR ALL ENTRIES IN gt_cdhdr
WHERE objectclas = 'MATERIAL'
AND objectid = gt_cdhdr-objectid.
ENDIF.
" zu den Änderungspositionen die Werte aus CDHDR dazu lesen
LOOP AT gt_cdpos ASSIGNING <cdpos>.
CLEAR wa_cdhdr2.
READ TABLE gt_cdhdr INTO wa_cdhdr2
WITH TABLE KEY objectid = <cdpos>-objectid
changenr = <cdpos>-changenr.
<cdpos>-username = wa_cdhdr2-username.
<cdpos>-udate = wa_cdhdr2-udate.
ENDLOOP.
ENDFORM.
[color=#FF0000]
*#* Mit den letzten Zeilen die hier im Code stehen sollte doch eine Ausgabe *#* mittels ALV auch leichter möglich sein als mit meinem ursprünglichen *#* Coding oder?
[/color]@
dies könntest du beim Lesen der Daten aus der MARA+MARC in FORM lesen_daten berücksichtigen.”### was genau past denn nicht
*#* Es sollte die erste Selektion auf das Datum gehen, nur wenn das
*#* Datumsfeld leer bleibt sollte die Selektion auf eine Materialnummer
*#* gehen. @
Code: Alles auswählen.
"erster Step - cashen von MARA+MARC mit Einschränkung auf so_ersda
"bei AND marc~werks = 'MET' muss natürlich euer Werk stehen
if so_ersda is initial.
"es ist kein Datum angegeben, lesen über die Materialnummer
SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
APPENDING TABLE gt_itab
FROM mara JOIN marc ON mara~matnr = marc~matnr
AND marc~werks = 'MET'
WHERE mara~matnr = pa_matnr.
else.
"über Datum selektieren
SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
APPENDING TABLE gt_itab
FROM mara JOIN marc ON mara~matnr = marc~matnr
AND marc~werks = 'MET'
WHERE mara~ersda IN so_ersda.
endif.
mit*#* Wie dies mit dem Loop gemeint ist leuchtet mir leider nicht ganz ein. *#* Sollte dieser im Ansatz so aussehen wie der LOOP AT gt_itab? @
Code: Alles auswählen.
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '20' OR sobsl = '30'.
....
ENDLOOP.
ja. für jeden Radiobutton unterscheiden sich nur die Bedingungen für den LOOP.*#* Sollten hier die gleichen Veränderungen vorgenommen warden wie bei dem *#* ersten Auswahlbutton? Ich habe noch nicht so viel mit IF und ELSEIF
*#* gearbeitet. Deshalb sieht meine Selectanweisung auch so verwirrend aus. @
dein Beispiel war bei mir so nicht lauffähig. Bei CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' verwendest du eine Variable mit dem Namen matnr, welche aber nicht deklariert ist. ich habe den Namen daher in pa_matnr abgewandelt.*#* Die Materialnummer sollte aus der PARAMETERSselektion kommen falls das *#* Eingabefeld auf das Datum nicht befüllt wurde.
die Ausgabe wäre somit in der Tat leichter. Die Daten sind zZ in zwei Tabellen abgelegt, sie müssten dann noch in einer auszugebenden Tabelle zusammengefügt werden.Mit den letzten Zeilen die hier im Code stehen sollte doch eine Ausgabe *#* mittels ALV auch leichter möglich sein als mit meinem ursprünglichen *#* Coding oder?
Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus
Code: Alles auswählen.
*--------------------------------------------------------------------*
* Report Z_KOPIEREN
*--------------------------------------------------------------------*
REPORT z_kopieren.
TABLES: mara.
"### Deklaration der Workarea´s
DATA: wa_mara LIKE mara,
wa_marc LIKE marc,
wa_cdhdr LIKE cdhdr,
wa_cdpos LIKE cdpos.
"Deklaration einer Tabelle für die Zwischenspeicherung MARA+MARC
TYPES: BEGIN OF t_itab,
matnr LIKE mara-matnr,
sobsl LIKE marc-sobsl,
ersda LIKE mara-ersda,
ernam LIKE mara-ernam,
objectid LIKE cdhdr-objectid,
END OF t_itab.
DATA: gt_itab TYPE SORTED TABLE OF t_itab
WITH NON-UNIQUE KEY matnr sobsl,
wa_itab LIKE LINE OF gt_itab.
FIELD-SYMBOLS: <itab> TYPE t_itab.
"Deklaration einer Tabelle für die Zwischenspeicherung CDHDR
TYPES: BEGIN OF t_cdhdr,
objectid LIKE cdhdr-objectid,
changenr LIKE cdhdr-changenr,
udate LIKE cdhdr-udate,
username LIKE cdhdr-username,
END OF t_cdhdr.
DATA: gt_cdhdr TYPE HASHED TABLE OF t_cdhdr
WITH UNIQUE KEY objectid changenr,
wa_cdhdr2 LIKE LINE OF gt_cdhdr.
"Deklaration einer Tabelle für die Zwischenspeicherung CDPOS
TYPES: BEGIN OF t_cdpos,
objectid LIKE cdhdr-objectid,
changenr LIKE cdhdr-changenr,
value_old LIKE cdpos-value_old,
value_new LIKE cdpos-value_new,
objectclas LIKE cdpos-objectclas,
udate LIKE cdhdr-udate,
username LIKE cdhdr-username,
END OF t_cdpos.
DATA: gt_cdpos TYPE SORTED TABLE OF t_cdpos
WITH NON-UNIQUE KEY objectid,
wa_cdpos2 LIKE LINE OF gt_cdpos.
FIELD-SYMBOLS: <cdpos> TYPE t_cdpos.
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.
PARAMETERS: pa_matnr TYPE mara-matnr. "OBLIGATORY.
SELECT-OPTIONS : so_mtart FOR mara-mtart. "DEFAULT 'ROH'.
SELECTION-SCREEN BEGIN OF BLOCK werksueb WITH FRAME.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
r2 RADIOBUTTON GROUP rad1,
r3 RADIOBUTTON GROUP rad1,
r4 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK werksueb.
START-OF-SELECTION.
"Materialnummern passend zur Selektion lesen --> GT_ITAB
PERFORM lesen_daten.
IF r1 = 'X'.
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '20' OR sobsl = '30'.
"an diese Stelle statt diesem Code hier kommt nun ein LOOP über
"GT_CDPOS...
LOOP AT gt_cdpos INTO wa_cdpos2
WHERE objectid = pa_matnr
AND objectclas = wa_cdhdr-objectclas
AND changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
OR wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.
WRITE: 'Erstellt am:', wa_itab-ersda, wa_itab-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDLOOP.
CHECK wa_cdpos-value_new = 0.
ENDLOOP.
ELSEIF r2 = 'X'.
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '10' OR sobsl = '50'.
LOOP AT gt_cdpos INTO wa_cdpos2
WHERE objectid = pa_matnr
AND objectclas = wa_cdhdr-objectclas
AND changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = 'G'
OR wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDLOOP.
ENDLOOP.
ELSEIF r3 = 'X'.
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '10'.
LOOP AT gt_cdpos INTO wa_cdpos2
WHERE objectid = pa_matnr
AND objectclas = wa_cdhdr-objectclas
AND changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '2'
OR wa_cdpos-value_old = '2' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '1'
OR wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '2'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDLOOP.
ENDLOOP.
ELSEIF r4 = 'X'.
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '20' OR sobsl = '30' OR sobsl = '50'.
LOOP AT gt_cdpos INTO wa_cdpos2
WHERE objectid = pa_matnr
AND objectclas = wa_cdhdr-objectclas
AND changenr = wa_cdhdr-changenr.
IF wa_cdpos-value_new = '4'
OR wa_cdpos-value_old = '4'
AND wa_cdpos-value_new = '1'.
WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
WRITE: / wa_cdhdr-changenr,
wa_cdhdr-udate,
wa_cdhdr-username,
wa_cdhdr-objectid .",
ULINE.
WRITE: / wa_cdpos-value_old,
/ wa_cdpos-value_new.
ULINE.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = pa_matnr
IMPORTING
output = wa_cdhdr-objectid
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ELSE.
wa_cdhdr-objectid = pa_matnr.
ENDIF.
*&---------------------------------------------------------------------*
*& Form LESEN_DATEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM lesen_daten .
IF so_ersda IS INITIAL.
SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
APPENDING TABLE gt_itab
FROM mara JOIN marc ON mara~matnr = marc~matnr
AND marc~werks = '130'
WHERE mara~matnr = pa_matnr.
ELSE.
SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
APPENDING TABLE gt_itab
FROM mara JOIN marc ON mara~matnr = marc~matnr
AND marc~werks = '130'
WHERE mara~ersda IN so_ersda.
ENDIF.
"umschaufeln der Matnr nach objectid
LOOP AT gt_itab ASSIGNING <itab>.
<itab>-objectid = <itab>-matnr.
ENDLOOP.
IF gt_itab IS NOT INITIAL.
SELECT objectid changenr udate username
APPENDING TABLE gt_cdhdr
FROM cdhdr
FOR ALL ENTRIES IN gt_itab
WHERE cdhdr~objectclas = 'MATERIAL'
AND cdhdr~objectid = gt_itab-objectid.
ENDIF.
"dritter Step - cashen von cdpos für alle objectid in CDHDR
IF NOT gt_cdhdr IS INITIAL.
SELECT objectid changenr value_old value_new
FROM cdpos APPENDING TABLE gt_cdpos
FOR ALL ENTRIES IN gt_cdhdr
WHERE objectclas = 'MATERIAL'
AND objectid = gt_cdhdr-objectid.
ENDIF.
" zu den Änderungspositionen die Werte aus CDHDR dazu lesen
LOOP AT gt_cdpos ASSIGNING <cdpos>.
CLEAR wa_cdhdr2.
READ TABLE gt_cdhdr INTO wa_cdhdr2
WITH TABLE KEY objectid = <cdpos>-objectid
changenr = <cdpos>-changenr.
<cdpos>-username = wa_cdhdr2-username.
<cdpos>-udate = wa_cdhdr2-udate.
ENDLOOP.
ENDFORM. " LESEN_DATEN
Code: Alles auswählen.
IF r1 = 'X'.
"### wir LOOPEN über alle selektierte Materialnummern, die jeweiligen Werte stehen in WA_ITAB
LOOP AT gt_itab INTO wa_itab
WHERE sobsl = '20' OR sobsl = '30'.
"ein LOOP über GT_CDPOS für das jeweilige Material
"### wir wollen die Änderungsbelege zu der jeweils aktuellen MATNR in der Schleife lesen. Mit der
"### Anweisung WHERE objectid = pa_matnr liest du immer nur die Belege zu einer MATNR aus deinem Selektionsbild
"### richtig wäre hier WHERE objectid = wa_itab-objectid
"### Des weiteren hat die Tabelle gt_cdpos nur einen Schlüssel, das ist objectid. Die beiden weiteren AND-Bedingungen
"### hätten aber auch so nicht funktioniert, da Du wa_cdhdr garnicht gefüllt hast
* LOOP AT gt_cdpos INTO wa_cdpos2
* WHERE objectid = pa_matnr
* AND objectclas = wa_cdhdr-objectclas
* AND changenr = wa_cdhdr-changenr.
LOOP AT gt_cdpos INTO wa_cdpos2
WHERE objectid = wa_itab-objectid.
"### es heisst ja LOOP AT gt_cdpos INTO wa_cdpos2, also musst du hier auch auf Werte in
"### wa_cdpos2 und nicht in wa_cdpos zugreifen.
"### Spätestens hier kann ich das nicht mehr testen, wir haben keine Daten die auf diese Bedingungen zutreffen
"### schau dir einfach die Tabelle gt_cdpos als Ganzes an, und prüfe, ob da Werte vorliegen die Du überhaupt
"### selektieren möchtest
IF wa_cdpos2-value_new = 'G' OR
wa_cdpos2-value_old = 'G' AND wa_cdpos2-value_new = 'F' OR
wa_cdpos2-value_old = 'F' AND wa_cdpos2-value_new = 'B'.