Code: Alles auswählen.
TYPE-POOLS: vrm.
TYPES:
BEGIN OF ty_rsdodso,
odsobject TYPE rsdodso-odsobject,
objvers TYPE rsdodso-objvers,
txtlg TYPE rsdodsot-txtlg,
END OF ty_rsdodso,
BEGIN OF ty_rsdodsot,
txtlg TYPE rsdodsot-txtlg,
END OF ty_rsdodsot.
DATA:
l_s_rsdodso TYPE ty_rsdodso,
l_t_rsdodso TYPE STANDARD TABLE OF ty_rsdodso,
l_s_rsdodsot TYPE ty_rsdodsot,
l_t_rsdodsot TYPE STANDARD TABLE OF ty_rsdodsot,
param TYPE vrm_id,
values TYPE vrm_values,
value LIKE LINE OF values,
odsobject TYPE rsdodso-odsobject.
FIELD-SYMBOLS:
<rsdodso_fields> TYPE ty_rsdodso,
<rsdodsot_fields> TYPE ty_rsdodsot,
<fs_structure> TYPE ty_rsdodso.
SELECT-OPTIONS: so_odsob FOR <rsdodso_fields>-odsobject.
PARAMETERS : layer TYPE char30 AS LISTBOX VISIBLE LENGTH 30 USER-COMMAND dummy ,
modul TYPE char30 AS LISTBOX VISIBLE LENGTH 30 MODIF ID ID1 USER-COMMAND dummy ,
gruppe(30) AS LISTBOX VISIBLE LENGTH 30 MODIF ID ID2,
zaehler as checkbox.
AT SELECTION-SCREEN OUTPUT.
param = 'layer'.
value-key = 'L01'.
value-text = 'Layer 1 Extraktion'.
APPEND value TO values.
value-key = 'L02'.
value-text = 'Layer 3 Harmonisierung'.
APPEND value TO values.
value-key = 'L03'.
value-text = 'Layer 5 Datamart'.
APPEND value TO values.
value-key = 'L04'.
value-text = 'Layer 7 Präsentation'.
APPEND value TO values.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = param
values = values.
Refresh values.
param = 'modul'.
value-key = 'M01'.
value-text = 'Modul CO'.
APPEND value TO values.
value-key = 'M02'.
value-text = 'Modul CP'.
APPEND value TO values.
value-key = 'M03'.
value-text = 'Modul CS'.
APPEND value TO values.
value-key = 'M04'.
value-text = 'Modul DP'.
APPEND value TO values.
value-key = 'M05'.
value-text = 'Modul FI'.
APPEND value TO values.
value-key = 'M06'.
value-text = 'Modul HR'.
APPEND value TO values.
value-key = 'M07'.
value-text = 'Modul LE'.
APPEND value TO values.
value-key = 'M07'.
value-text = 'Modul MD'.
APPEND value TO values.
value-key = 'M08'.
value-text = 'Modul MM'.
APPEND value TO values.
value-key = 'M09'.
value-text = 'Modul PM'.
APPEND value TO values.
value-key = 'M10'.
value-text = 'Modul PP'.
APPEND value TO values.
value-key = 'M11'.
value-text = 'Modul PS'.
APPEND value TO values.
value-key = 'M12'.
value-text = 'Modul QM'.
APPEND value TO values.
value-key = 'M13'.
value-text = 'Modul SD'.
APPEND value TO values.
value-key = 'M14'.
value-text = 'Modul SN'.
APPEND value TO values.
value-key = 'M15'.
value-text = 'Modul TD'.
APPEND value TO values.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = param
values = values.
Refresh values.
param = 'gruppe'.
value-key = 'G01'.
value-text = 'Gruppe SL'.
APPEND value TO values.
value-key = 'G02'.
value-text = 'Gruppe BI'.
APPEND value TO values.
value-key = 'G03'.
value-text = 'Gruppe SH'.
APPEND value TO values.
value-key = 'G04'.
value-text = 'Gruppe PU'.
APPEND value TO values.
value-key = 'G05'.
value-text = 'Gruppe IM'.
APPEND value TO values.
value-key = 'G06'.
value-text = 'Gruppe GL'.
APPEND value TO values.
value-key = 'G07'.
value-text = 'Gruppe AP'.
APPEND value TO values.
value-key = 'G08'.
value-text = 'Gruppe AR'.
APPEND value TO values.
value-key = 'G09'.
value-text = 'Gruppe OM'.
APPEND value TO values.
value-key = 'G09'.
value-text = 'Gruppe PC'.
APPEND value TO values.
value-key = 'G10'.
value-text = 'Gruppe 0G'.
APPEND value TO values.
value-key = 'G11'.
value-text = 'Gruppe PA'.
APPEND value TO values.
value-key = 'G12'.
value-text = 'Gruppe PT'.
APPEND value TO values.
value-key = 'G13'.
value-text = 'Gruppe PY'.
APPEND value TO values.
value-key = 'G14'.
value-text = 'Gruppe TA'.
APPEND value TO values.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = param
values = values.
LOOP AT SCREEN.
IF screen-group1 EQ 'ID1'.
IF NOT layer IS INITIAL.
screen-input = 1.
ELSE.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
ENDIF.
IF screen-group1 EQ 'ID2'.
IF NOT layer IS INITIAL AND
NOT modul IS INITIAL.
screen-input = 1.
ELSE.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
START-OF-SELECTION.
PERFORM infos.
if zaehler = 'X'.
SORT l_t_rsdodso BY odsobject+6(2) DESCENDING.
READ TABLE l_t_rsdodso ASSIGNING <fs_structure> INDEX 1 .
ENDIF.
CASE layer.
WHEN 'L01'.
DELETE l_t_rsdodso WHERE odsobject(2) <> 'D1' .
WHEN 'L02'.
DELETE l_t_rsdodso WHERE odsobject(2) <> 'D3'.
WHEN 'L03'.
DELETE l_t_rsdodso WHERE odsobject(2) <> 'D5' .
WHEN 'L04'.
DELETE l_t_rsdodso WHERE odsobject(2) <> 'D7' .
ENDCASE.
CASE modul.
WHEN 'M01' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'CO'.
WHEN 'M02' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'CP'.
WHEN 'M03' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'CS'.
WHEN 'M04' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'DP'.
WHEN 'M05' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'FI'.
WHEN 'M06' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'HR'.
WHEN 'M07' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'LE'.
WHEN 'M08' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'MD'.
WHEN 'M09' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'MM'.
WHEN 'M10' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'PM'.
WHEN 'M11' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'PP'.
WHEN 'M12' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'PS'.
WHEN 'M13' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'QM'.
WHEN 'M14' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'SD'.
WHEN 'M15' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'SN'.
WHEN 'M16' .
DELETE l_t_rsdodso Where odsobject+2(2) <> 'TD'.
ENDCASE.
CASE gruppe .
WHEN 'G01'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'SL'.
WHEN 'G02'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'BI'.
WHEN 'G03'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'SH'.
WHEN 'G04'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'PU'.
WHEN 'G05'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'IM'.
WHEN 'G06'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'GL'.
WHEN 'G07'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'AP'.
WHEN 'G08'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'AR'.
WHEN 'G09'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'OM'.
WHEN 'G10'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'PC'.
WHEN 'G11'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> '0M'.
WHEN 'G12'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'PA'.
WHEN 'G13'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'PT'.
WHEN 'G14'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'PY'.
WHEN 'G15'.
DELETE l_t_rsdodso WHERE odsobject+4(2) <> 'TA'.
ENDCASE.
PERFORM ausgabe.
*&---------------------------------------------------------------------*
*& Form infos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM infos.
SELECT odsobject objvers FROM rsdodso
INTO CORRESPONDING FIELDS OF TABLE l_t_rsdodso
WHERE odsobject in so_odsob and objvers = 'A'.
SELECT txtlg FROM rsdodsot
INTO CORRESPONDING FIELDS OF TABLE l_t_rsdodsot.
LOOP AT l_t_rsdodso ASSIGNING <rsdodso_fields>.
SELECT SINGLE txtlg FROM rsdodsot
INTO <rsdodso_fields>-txtlg
WHERE odsobject = <rsdodso_fields>-odsobject.
ENDLOOP.
ENDFORM. "infos
"infos
*&---------------------------------------------------------------------*
*& Form ausgabe
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM ausgabe.
DELETE l_t_rsdodso WHERE odsobject(1) = '0'.
LOOP AT l_t_rsdodso ASSIGNING <rsdodso_fields>.
WRITE:/ <rsdodso_fields>-odsobject,
<rsdodso_fields>-txtlg,
<rsdodso_fields>-objvers.
ENDLOOP.
ENDFORM. "ausgabe
Dann pass die Ausgabe auf deine Wünsche/Anforderungen an!patlau hat geschrieben:Habe es nun genauso gemacht, allerdings werden mir weiterhin alle Objekte angezeigt???
Code: Alles auswählen.
LOOP AT l_t_rsdodso ASSIGNING <rsdodso_fields>.
WRITE:/ <rsdodso_fields>-odsobject,
<rsdodso_fields>-txtlg,
<rsdodso_fields>-objvers.
* Wenn der User nur den größten Eintrag haben will, Ausgabe nach dem erste beenden:
IF zahler = 'X' and sy-tabix = 1.
EXIT.
ENDIF.
ENDLOOP.
Folgende Benutzer bedankten sich beim Autor Thanatos82 für den Beitrag:
patlau
Was sagt den die F1-Hilfe dazupatlau hat geschrieben:Was macht denn dieses sy-tabix =1?
technich gesehen ja (Buchstaben werden nach Alphabet sortiert, eigentlich genauso wie in Excel)patlau hat geschrieben:Nein aber ich will ja leiglich nach den letzten beiden Stellen also dem Zähler sortieren, wenn ich das weglassen würde, würde er dann genauso sorteiren ?
patlau hat geschrieben:habe einen der beiden zugriffe auf rsdodsot entfernt, weiss leider nicht wo der Fehler bei der gestrigen join-verknüpfung lag.
Code: Alles auswählen.
* gestern:
SELECT rsdodso~odsobject
rsdodsot~txtlg
rsdodso~objvers
INTO TABLE gt_rsdodso
FROM rsdodso
INNER JOIN rsdodsot
ON rsdodsot~odsobject = rsdodso~odsobject
WHERE rsdodso~objvers = 'A'
AND rsdodso~odsobject IN so_odsob.
* Sprache mit in den Join aufgenommen (hier als LEFT JOIN, falls kein text in Anmeldesprache gepflegt ist, wird der Satz trotzdem ausgeben
SELECT rsdodso~odsobject
rsdodsot~txtlg
rsdodso~objvers
INTO TABLE gt_rsdodso
FROM rsdodso
LEFT JOIN rsdodsot
ON rsdodsot~odsobject = rsdodso~odsobject
AND rsdodsot~langu = sy-langu
WHERE rsdodso~objvers = 'A'
AND rsdodso~odsobject IN so_odsob.
Wenn du über die SelOpt einsteigst, dann funktioniert der Select ja vernünftig (es wird nur das gelesen, was in die SelOpt eingegeben wurde). Wenn der Einstieg jetzt über die Listboxen erfolgt, dann sollte das Programm den Eintrag in die SelOpt machen, damit dann nur genau das gelesen wird, was der User auch haben will. Gestern gab es einen Vorschlag dies mit CONCATENATE zu lösen, hier mal ein Beispiel dazu:aber das wichtigste, wie kann ich dafür sorgen dass nicht alles eingelsen wird und dann weider gelöscht sondern gezielt reingelesen wird?
Code: Alles auswählen.
FORM create_selopt.
* Listboxen in eine SelOpt überführen, damit zu lesende Daten eingegrenzt werden!
CLEAR so_odsob.
CASE layer.
WHEN 'L01'.
so_odsob-low = 'D1' .
WHEN 'L02'.
so_odsob-low = 'D3'.
WHEN 'L03'.
so_odsob-low = 'D5'.
WHEN 'L04'.
so_odsob-low = 'D7'.
ENDCASE.
CASE modul.
WHEN 'M01'.
so_odsob-low+2(2) = 'CO'.
WHEN 'M02'.
so_odsob-low+2(2) = 'CP'.
WHEN 'M03'.
so_odsob-low+2(2) = 'CS'.
WHEN 'M04'.
so_odsob-low+2(2) = 'DP'.
WHEN 'M05'.
so_odsob-low+2(2) = 'FI'.
WHEN 'M06'.
so_odsob-low+2(2) = 'HR'.
WHEN 'M07'.
so_odsob-low+2(2) = 'LE'.
WHEN 'M08'.
so_odsob-low+2(2) = 'MD'.
WHEN 'M09'.
so_odsob-low+2(2) = 'MM'.
WHEN 'M10'.
so_odsob-low+2(2) = 'PM'.
WHEN 'M11'.
so_odsob-low+2(2) = 'PP'.
WHEN 'M12'.
so_odsob-low+2(2) = 'PS'.
WHEN 'M13'.
so_odsob-low+2(2) = 'QM'.
WHEN 'M14'.
so_odsob-low+2(2) = 'SD'.
WHEN 'M15'.
so_odsob-low+2(2) = 'SN'.
WHEN 'M16'.
so_odsob-low+2(2) = 'TD'.
ENDCASE.
CASE gruppe.
WHEN 'G01'.
so_odsob-low+4(2) = 'SL'.
WHEN 'G02'.
so_odsob-low+4(2) = 'BI'.
WHEN 'G03'.
so_odsob-low+4(2) = 'SH'.
WHEN 'G04'.
so_odsob-low+4(2) = 'PU'.
WHEN 'G05'.
so_odsob-low+4(2) = 'IM'.
WHEN 'G06'.
so_odsob-low+4(2) = 'GL'.
WHEN 'G07'.
so_odsob-low+4(2) = 'AP'.
WHEN 'G08'.
so_odsob-low+4(2) = 'AR'.
WHEN 'G09'.
so_odsob-low+4(2) = 'OM'.
WHEN 'G10'.
so_odsob-low+4(2) = 'PC'.
WHEN 'G11'.
so_odsob-low+4(2) = '0G'.
WHEN 'G12'.
so_odsob-low+4(2) = 'PA'.
WHEN 'G13'.
so_odsob-low+4(2) = 'PT'.
WHEN 'G14'.
so_odsob-low+4(2) = 'PY'.
WHEN 'G15'.
so_odsob-low+4(2) = 'TA'.
ENDCASE.
* SelOpt füllen
IF so_odsob-low IS NOT INITIAL.
so_odsob-sign = 'I'.
so_odsob-option = 'CP'.
CONCATENATE so_odsob-low '*' INTO so_odsob-low.
APPEND so_odsob.
ENDIF.
man kann dafür die impizierte Typumwandlung benutzenpatlau hat geschrieben:Und zu meinem anderen Problem, will ich im Prinzip wie bei zaehler das letzt erstellte Objekt ausgeben nur noch eines dazuzählen. Geht das dann über eine Summe der letzten beiden Stellen weiss auch nicht wie mir da die F1 Hilfe helfen soll....Bitte um Vorschlag
Code: Alles auswählen.
LOOP AT l_t_rsdodso ASSIGNING <rsdodso_fields>.
WRITE:/ <rsdodso_fields>-odsobject,
<rsdodso_fields>-txtlg,
<rsdodso_fields>-objvers.
* Wenn der User nur den größten Eintrag haben will, Ausgabe nach dem erste beenden:
IF zahler = 'X' and sy-tabix = 1.
IF neu = 'X'. "Der User will die nächste Objektnummer haben
<rsdodso_fields>-odsobject+7(2) = <rsdodso_fields>-odsobject+7(2) + 1.
WRITE: / 'neue Objektnummer lautet:', <rsdodso_fields>-odsobject.
ENDIF.
EXIT.
ENDIF.
ENDLOOP.