FOR ALL ENTRIES mit GROUP BY Alternativen

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

FOR ALL ENTRIES mit GROUP BY Alternativen

Beitrag von rob_abc (Specialist / 118 / 32 / 48 ) »
Hallo zusammen

ich stehe vor dem Problem, dass ich FOR ALL ENTRIES mit GROUP BY kombinieren müsste, ABAP das aber nicht erlaubt. Jemand eine Idee für eine Alternative?

Habe es nun auf zwei SELECTS aufgeteilt. Im ersten SELECT mache ich den FOR ALL ENTRIES, dann einen LOOP zum Aufbau der Range-Tabelle und dann der SELECT mit dem GROUP BY. Gibt es da schlauere Lösungen? Vermeiden der zwei Selects und das Problem, dass der Select mit der Range-Tabelle dumpt, weil Range-Tabelle zu gros?

Beispielcoding ist in Methode unit_test4

Code: Alles auswählen.

REPORT.

CLASS ltc_unit_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.

  PRIVATE SECTION.
    METHODS unit_test1 FOR TESTING.
    METHODS unit_test2 FOR TESTING.
    METHODS unit_test3 FOR TESTING.
    METHODS unit_test4 FOR TESTING.

    CLASS-METHODS class_setup.
ENDCLASS.


CLASS ltc_unit_test IMPLEMENTATION.
  METHOD class_setup.
    FINAL(t000_double) = cl_osql_test_environment=>create( VALUE #( ( 'VEKP' ) ) ).
    t000_double->insert_test_data( VALUE vekp_t( ( venum = '0000000001' exidv = '00000000000000004711' )
                                                 ( venum = '0000000002' exidv = '00000000000000004711' )
                                                 ( venum = '0000000003' exidv = '00000000000000004712' )
                                                 ( venum = '0000000004' exidv = '00000000000000004712' ) ) ).
  ENDMETHOD.

  METHOD unit_test1.
    " Arrange
    DATA l_exidv TYPE exidv.

    l_exidv = '4711'.
    " Act
    SELECT SINGLE FROM vekp
      FIELDS exidv,
             MAX( venum ) AS venum
      WHERE exidv = @( |{ l_exidv ALPHA = IN }| )
      GROUP BY exidv
      INTO @FINAL(l_vekp).

    " Assert
    cl_abap_unit_assert=>assert_equals( exp = '0000000002'
                                        act = l_vekp-venum ).
  ENDMETHOD.

  METHOD unit_test2.
    " Arrange
    DATA l_exidv TYPE exidv.

    l_exidv = '4712'.
    " Act
    SELECT * FROM vekp
      WHERE exidv = @( |{ l_exidv ALPHA = IN }| )
      ORDER BY venum DESCENDING
      INTO @FINAL(l_result)
      UP TO 1 ROWS. ENDSELECT.
    " Assert
    cl_abap_unit_assert=>assert_equals( exp = '0000000004'
                                        act = l_result-venum ).
  ENDMETHOD.

  METHOD unit_test3.
    " Arrange
    FINAL(l_hus) = VALUE rsdsselopt_t( sign   = 'I'
                                       option = 'EQ'
                                       ( low = '00000000000000004711' )
                                       ( low = '00000000000000004712' ) ).
    " Act
    SELECT FROM vekp
      FIELDS exidv,
             MAX( venum ) AS venum
      WHERE exidv IN @l_hus
      GROUP BY exidv
      INTO TABLE @FINAL(l_result).

    " Assert
    cl_abap_unit_assert=>assert_equals( exp = 2
                                        act = lines( l_result ) ).
    cl_abap_unit_assert=>assert_equals( exp = '0000000002'
                                        act = l_result[ 1 ]-venum ).
    cl_abap_unit_assert=>assert_equals( exp = '0000000004'
                                        act = l_result[ 2 ]-venum ).
  ENDMETHOD.

  METHOD unit_test4.
    " Arrange
    TYPES:
      BEGIN OF ty_hus,
        exidv TYPE exidv,
      END OF ty_hus,
      tty_hus TYPE SORTED TABLE OF ty_hus WITH NON-UNIQUE KEY exidv.
    DATA l_hus TYPE tty_hus.

    l_hus = VALUE #( ( exidv = '00000000000000004711' )
                     ( exidv = '00000000000000004711' )
                     ( exidv = '00000000000000004712' ) ).
    SELECT DISTINCT exidv FROM vekp
      FOR ALL ENTRIES IN @l_hus
      WHERE exidv = @l_hus-exidv
      INTO TABLE @FINAL(l_vekp).
    DATA l_rng_exidv TYPE RANGE OF exidv.
    LOOP AT l_vekp ASSIGNING FIELD-SYMBOL(<row>).
      l_rng_exidv = VALUE #( BASE l_rng_exidv
                             ( sign   = 'I'
                               option = 'EQ'
                               low    = <row>-exidv ) ).
    ENDLOOP.

    " Act
    SELECT FROM vekp
      FIELDS exidv,
             MAX( venum ) AS venum
      WHERE exidv IN @l_rng_exidv
      GROUP BY exidv
      INTO TABLE @FINAL(l_result).

    " Assert
    cl_abap_unit_assert=>assert_equals( exp = 2
                                        act = lines( l_result ) ).
    cl_abap_unit_assert=>assert_equals( exp = '0000000002'
                                        act = l_result[ 1 ]-venum ).
    cl_abap_unit_assert=>assert_equals( exp = '0000000004'
                                        act = l_result[ 2 ]-venum ).
  ENDMETHOD.
ENDCLASS.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: FOR ALL ENTRIES mit GROUP BY Alternativen

Beitrag von jocoder (Specialist / 345 / 3 / 103 ) »
Alternative wäre eine CDS-View oder CDS-View-Entität mit der GROUP BY-Klausel.

Code: Alles auswählen.

define view entity zhandling_unit as select from vekp{
  exidv,
  max( venum )
} group by exidv

Code: Alles auswählen.

SELECT * FROM zhandling_unit
  FOR ALL ENTRIES IN @l_hus
  WHERE exidv = @l_hus-exidv
  INTO TABLE @FINAL(l_result).

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
rob_abc


Re: FOR ALL ENTRIES mit GROUP BY Alternativen

Beitrag von Radinator (ForumUser / 49 / 10 / 7 ) »
Ich würde das Range Table füllen mit einerm SELECT statt mit einer LOOP machen

Code: Alles auswählen.

data l_rng_Exidv type range of exidv.
select
  'I' as sign,
  'EQ' as option,
  exidv as low
from
  @l_vekp as v
into table
  @l_rng_exidv.
Wenn ich deinen Code ummodele:

Code: Alles auswählen.

types:
  begin of ty_hus,
    exidv type exidv,
  end of ty_hus,
  tty_hus type sorted table of ty_hus with non-unique key exidv.
data l_hus type tty_hus.

types:
  begin of t_vekp,
    venum type venum,
    exidv type exidv,
  end of t_vekp,
  tty_vekp type sorted table of t_vekp with UNIQUE key venum.
data vekp type tty_vekp.
data l_exidv type exidv.

vekp = value #(  ( venum = '0000000001' exidv = '00000000000000004711' )
                 ( venum = '0000000002' exidv = '00000000000000004711' )
                 ( venum = '0000000003' exidv = '00000000000000004712' )
                 ( venum = '0000000004' exidv = '00000000000000004713' ) ).

l_hus = value #( ( exidv = '00000000000000004711' )
                 ( exidv = '00000000000000004712' )
                 ( exidv = '00000000000000004713' ) ).

select distinct
    exidv
from
  vekp as vekp
for all entries in
  @l_hus
where
  exidv = @l_hus-exidv
into table
  @final(l_vekp).

data l_rng_Exidv type range of exidv.
select
  'I' as sign,
  'EQ' as option,
  exidv as low
from
  @l_vekp as v
into table
  @l_rng_exidv.

select
  exidv,
  max( venum ) as venum
from
  vekp
where
  exidv in @l_rng_exidv
group by
  exidv
into table
  @final(l_result).

write / lines( l_result ).

Folgende Benutzer bedankten sich beim Autor Radinator für den Beitrag:
rob_abc


Re: FOR ALL ENTRIES mit GROUP BY Alternativen

Beitrag von black_adept (Top Expert / 4118 / 130 / 954 ) »
Ab Release 7.52 kannst du statt "FOR ALL ENTRIES" eine interne Tabelle als Datenquelle angeben.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
rob_abc

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: FOR ALL ENTRIES mit GROUP BY Alternativen

Beitrag von rob_abc (Specialist / 118 / 32 / 48 ) »
Ah, anstatt FOR ALL ENTRIES ein INNER JOIN auf die itab. Das ist ein super Hinweis! Habe ich bisher noch nie gemacht =)

Code: Alles auswählen.

  METHOD unit_test5.
    " Arrang
    TYPES:
      BEGIN OF ty_hus,
        exidv TYPE exidv,
      END OF ty_hus,
      tty_hus TYPE SORTED TABLE OF ty_hus WITH NON-UNIQUE KEY exidv.
    DATA l_hus TYPE tty_hus.

    l_hus = VALUE #( ( exidv = '00000000000000004711' )
                     ( exidv = '00000000000000004711' )
                     ( exidv = '00000000000000004712' ) ).
    " Act
    SELECT
      FROM vekp
             INNER JOIN
               @l_hus AS l_hus ON l_hus~exidv = vekp~exidv
      FIELDS vekp~exidv,
             MAX( venum ) AS venum
      GROUP BY vekp~exidv
      INTO TABLE @FINAL(l_result).

    " Assert
    cl_abap_unit_assert=>assert_equals( exp = 2
                                        act = lines( l_result ) ).
    cl_abap_unit_assert=>assert_equals( exp = '0000000002'
                                        act = l_result[ 1 ]-venum ).
    cl_abap_unit_assert=>assert_equals( exp = '0000000004'
                                        act = l_result[ 2 ]-venum ).
  ENDMETHOD.

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1601
Views
Personalnummernkopierer Alternativen
von Spring » 23.07.2019 15:38 • Verfasst in SAP - Allgemeines
3
Antw.
4446
Views
Alternativen zu Feldkatalog
von newbie007 » 28.11.2011 00:08 • Verfasst in ABAP® für Anfänger
0
Antw.
2255
Views
Alternativen zu Webdynpro
von olli-x » 04.12.2007 15:17 • Verfasst in Web Application Server
0
Antw.
1992
Views
Logische Datenbanken Alternativen
von SaskuAc » 28.06.2017 14:10 • Verfasst in ABAP® Core
11
Antw.
5257
Views
Alternativen zu FM POPUP_GET_VALUES / POPUP_TO_CONFIRM...
von Nescio » 29.06.2018 12:06 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

FOR ALL ENTRIES mit GROUP BY Alternativen
vor 2 Stunden von rob_abc gelöst 5 / 99
Texttabelle Wert ändern
vor 10 Stunden von qyurryus gelöst 2 / 66
Feldwerte vergleichen
Gestern von Formularius gelöst 7 / 2014
Arbeitszeiten zum Arbeitsplatz
Gestern von wolli 2 / 2112

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

FOR ALL ENTRIES mit GROUP BY Alternativen
vor 2 Stunden von rob_abc gelöst 5 / 99
Texttabelle Wert ändern
vor 10 Stunden von qyurryus gelöst 2 / 66
Feldwerte vergleichen
Gestern von Formularius gelöst 7 / 2014
Arbeitszeiten zum Arbeitsplatz
Gestern von wolli 2 / 2112

Unbeantwortete Forenbeiträge

OPD Druck im SPOOL
vor einer Woche von Manfred K. 1 / 2339
Export von Spools in XLSX
vor 3 Wochen von abapamateur 1 / 3971
Feldberechnung ME32K
vor 3 Wochen von ZF_SAPler 1 / 4231