Code: Alles auswählen.
REPORT.
CLASS lcl_demo DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF mts_data,
msehi TYPE t006-msehi,
msehl TYPE t006a-msehl,
zaehl TYPE t006-zaehl,
nennr TYPE t006-nennr,
txdim TYPE t006t-txdim,
dimid TYPE t006-dimid,
END OF mts_data.
CLASS-METHODS:
method1,
method2.
CLASS-DATA:
mt_data TYPE STANDARD TABLE OF mts_data WITH EMPTY KEY.
ENDCLASS.
SELECTION-SCREEN BEGIN OF BLOCK choose_method WITH FRAME.
PARAMETERS: method1 RADIOBUTTON GROUP rb1,
method2 RADIOBUTTON GROUP rb1.
SELECTION-SCREEN END OF BLOCK choose_method.
PARAMETERS: rb_all RADIOBUTTON GROUP rb2,
rb_yes RADIOBUTTON GROUP rb2,
rb_no RADIOBUTTON GROUP rb2.
END-OF-SELECTION.
CASE 'X'.
WHEN method1. lcl_demo=>method1( ).
WHEN method2. lcl_demo=>method2( ).
ENDCASE.
* Ausgabe
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(go_salv)
CHANGING t_table = lcl_demo=>mt_data ).
go_salv->get_functions( )->set_all( ).
go_salv->display( ).
CLASS lcl_demo IMPLEMENTATION.
METHOD method1.
CASE 'X'.
WHEN rb_all. " Alles - keine DIMID und DIMID-Text
SELECT tab1~msehi, tab1~zaehl, tab1~nennr, texttab~msehl
FROM t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras
ORDER BY tab1~msehi
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
WHEN rb_yes. " nur, wenn es MIND. EINE andere Mengeneinheit mit gleicher Dimension gibt. Dann mit DIMID und DIMID-Text und nach DIMID sortieren
SELECT tab1~msehi, tab1~dimid, tab1~zaehl, tab1~nennr, texttab~msehl, textdim~txdim
FROM t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras
JOIN t006t AS textdim ON tab1~dimid = textdim~dimid AND 'D' = textdim~spras
WHERE EXISTS ( SELECT * FROM t006 WHERE dimid = tab1~dimid AND msehi <> tab1~msehi )
ORDER BY tab1~dimid, tab1~msehi
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
WHEN rb_no. " nur, wenn es KEINE andere Mengeneinheit mit gleicher Dimension gibt. Dann nur mit DIMID ohne text
SELECT tab1~msehi,
tab1~dimid,
tab1~zaehl,
tab1~nennr ,
texttab~msehl
FROM t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras
WHERE NOT EXISTS ( SELECT * FROM t006 WHERE dimid = tab1~dimid AND msehi <> tab1~msehi )
ORDER BY tab1~dimid, tab1~msehi
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
ENDCASE.
ENDMETHOD.
METHOD method2.
* Allgemein gültig
data(lv_fieldlist) = 'tab1~msehi,tab1~zaehl,tab1~nennr,texttab~msehl'.
data(lv_datasource) = |t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras|.
data(lv_where) = ''.
data(lv_order) = 'tab1~msehi'.
CASE 'X'.
WHEN rb_all. " Alles - keine DIMID und DIMID-Text
WHEN rb_yes. " nur, wenn es MIND. EINE andere Mengeneinheit mit gleicher Dimension gibt. Dann mit DIMID und DIMID-Text und nach DIMID sortieren
lv_fieldlist &&= ',tab1~dimid, textdim~txdim'.
lv_datasource &&= | JOIN t006t AS textdim ON tab1~dimid = textdim~dimid AND 'D' = textdim~spras|.
lv_where = 'EXISTS ( SELECT * FROM t006 WHERE dimid = tab1~dimid AND msehi <> tab1~msehi )'.
lv_order = |tab1~dimid,{ lv_order }|.
WHEN rb_no. " nur, wenn es KEINE andere Mengeneinheit mit gleicher Dimension gibt. Dann nur mit DIMID ohne text
lv_fieldlist &&= ',tab1~dimid'.
lv_where = 'NOT EXISTS ( SELECT * FROM t006 WHERE dimid = tab1~dimid AND msehi <> tab1~msehi )'.
lv_order = |tab1~dimid,{ lv_order }|.
ENDCASE.
SELECT (lv_fieldlist)
FROM (lv_datasource)
WHERE (lv_where)
ORDER BY (lv_order)
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
CLASS lcl_demo IMPLEMENTATION.
METHOD method1.
CASE abap_true.
WHEN rb_all.
read_all_units( ).
WHEN rb_yes.
read_units_multiple_dimensions( ).
WHEN rb_no.
read_units_unique_dimensions( ).
ENDCASE.
ENDMETHOD.
METHOD read_all_units.
" Alles - keine DIMID und DIMID-Text
SELECT tab1~msehi, tab1~zaehl, tab1~nennr, texttab~msehl
FROM t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras
ORDER BY tab1~msehi
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
ENDMETHOD.
METHOD read_units_multiple_dimension.
" nur, wenn es MIND. EINE andere Mengeneinheit mit gleicher Dimension gibt. Dann mit DIMID und DIMID-Text und nach DIMID sortieren
SELECT tab1~msehi, tab1~dimid, tab1~zaehl, tab1~nennr, texttab~msehl, textdim~txdim
FROM t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras
JOIN t006t AS textdim ON tab1~dimid = textdim~dimid AND 'D' = textdim~spras
WHERE EXISTS ( SELECT * FROM t006 WHERE dimid = tab1~dimid AND msehi <> tab1~msehi )
ORDER BY tab1~dimid, tab1~msehi
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
ENDMETHOD.
METHOD read_units_unique_dimension.
" nur, wenn es KEINE andere Mengeneinheit mit gleicher Dimension gibt. Dann nur mit DIMID ohne text
SELECT tab1~msehi,
tab1~dimid,
tab1~zaehl,
tab1~nennr ,
texttab~msehl
FROM t006 AS tab1 JOIN t006a AS texttab ON tab1~msehi = texttab~msehi AND 'D' = texttab~spras
WHERE NOT EXISTS ( SELECT * FROM t006 WHERE dimid = tab1~dimid AND msehi <> tab1~msehi )
ORDER BY tab1~dimid, tab1~msehi
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
SELECT...
FROM MARA
WHERE MATNR in S_MATNR
AND ( lv_where_1 )
AND ( lv_where_2 )
...
Geht mir in der Theorie ähnlich. Aber auf HANA-Systemen stelle ich fest, dass es in der Praxis in die andere Richtung bei mir geht.a-dead-trousers hat geschrieben: ↑05.10.2021 08:23Ich merke gerade, dass ich in den letzten Jahren immer weniger Komplexität in meinen SELECTs haben möchte. 😅
Und bei 2 "EXIST/NOT EXISTS/EGAL" Bedingungen würdest du dann 9 CDS-Views bauen?a-dead-trousers hat geschrieben: ↑05.10.2021 11:37In deinem Beispielfall würde ich einen CDS-View für die Grundmenge ("READ_UNITS") anlegen und je einen mit EXIST und NOT EXISTS der auf der Grundmenge aufbaut.
Dann würde ich mal anfangen mich zu fragen, ob man das nicht irgendwie weniger kompliziert lösen kann. 😉black_adept hat geschrieben: ↑05.10.2021 11:42Und bei 2 "EXIST/NOT EXISTS/EGAL" Bedingungen würdest du dann 9 CDS-Views bauen