Select im loop alternative


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

Select im loop alternative

Beitragvon kaufmann123 » 17.05.2018, 09:04

Guten Tag,

ich möchte auf die interne tablle zugreifen, die ich vorher von mhnk mit daten aus einem selektionsbildschirm gefüllt habe. als nächstes soll aus der nächsten tabelle nur das befüllt werden, was auch den inhalten in where entsricht. jedoch wird viel mehr selektiert als im selektionsbildschirm ausgewählt, außerdem bekomme ich den hinweis, das man innerhalpt eines loops eine tabelle nicht überschreiben soll. wie kann ich das anders umsetzen?

Code: Alles auswählen
  SELECT * FROM mhnk INTO CORRESPONDING FIELDS OF TABLE i_mahn
              WHERE bukrs EQ p_bukrs
              AND   laufd EQ p_laufd
              AND   laufi EQ p_laufi

  LOOP AT i_mahn TRANSPORTING NO FIELDS WHERE
       ( mahna EQ 'MAH3' AND mahns >= '4' )
  OR ( mahna EQ 'MAH2' AND mahns >= '3' )
  OR ( mahna EQ 'IHW'  AND mahns >= '3' )
  OR ( mahna EQ 'OMNI' AND mahns >= '4' ).

    SELECT * FROM mhnd INTO CORRESPONDING FIELDS OF TABLE itab_mahn
                FOR ALL ENTRIES IN itab_mahn
                WHERE bukrs EQ i_mahn-bukrs
kaufmann123
ForumUser
 
Beiträge: 13
Registriert: 13.02.2018, 11:15
Dank erhalten: 0 mal
Ich bin: Student/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Select im loop alternative

Beitragvon DeathAndPain » 17.05.2018, 09:52

Dein LOOP macht überhaupt keinen Sinn, allein schon deshalb, weil Du infolge von TRANSPORTING NO FIELDS keine Ergebnisse bekommst, mit denen Du weiterarbeiten könntest. Außerdem macht ein LOOP über eine interne Tabelle keinen Sinn, bei dem Du dann im Inneren des LOOPS per FOR ALL ENTRIES IN doch wieder auf alle Zeilen der Tabelle zugreifst. Zumal Du FOR ALL ENTRIES IN falsch verwendest, da Du in der WHERE-Bedingung gar nicht auf die Spalten der Tabelle prüfst. Offenbar hast Du bei den ganzen Befehlen gar nicht verstanden, wie sie funktionieren.

Da Du offenbar die Tabellen mhnk und mhnd verknüpfen möchtest, wäre die beste Lösung ein JOIN. Alternativ ein LOOP, bei dem Du dann einen SELECT machst, in dem Du aber auf alle relevanten Spalten aus der mhnk prüfst.

Ich bin kein Mahnexperte, aber nach meinem Dafürhalten müsstest Du die ganzen Spalten

LAUFD
LAUFI
KOART
BUKRS
KUNNR
LIFNR
CPDKY
SKNRZE
SMABER
SMAHSK
BBUKRS
BELNR
GJAHR

von mhnk und mhnd auf Gleichheit verknüpfen, damit Du in der mhnd nur nach den Zeilen suchst, die Deiner mhnk-Auswahl entsprechen. mhnk und mhnd haben ja einen sehr langen Primärschlüssel.
DeathAndPain
Expert
 
Beiträge: 641
Registriert: 05.05.2006, 10:14
Dank erhalten: 149 mal
Ich bin: Entwickler/in

Re: Select im loop alternative

Beitragvon kaufmann123 » 17.05.2018, 12:54

Code: Alles auswählen
  SELECT * FROM mhnk INTO CORRESPONDING FIELDS OF TABLE i_mahn
              WHERE bukrs EQ p_bukrs
              AND   laufd EQ p_laufd
              AND   laufi EQ p_laufi.

  SELECT * FROM mhnd INTO CORRESPONDING FIELDS OF TABLE i_mahn
               FOR ALL ENTRIES IN i_mahn
               WHERE bukrs EQ i_mahn-bukrs.

  DELETE i_mahn WHERE NOT
     ( mahna EQ 'MAH3' AND mahns >= '4' )
OR ( mahna EQ 'MAH2' AND mahns >= '3' )
OR ( mahna EQ 'IHW'  AND mahns >= '3' )
OR ( mahna EQ 'OMNI' AND mahns >= '4' ).


ich hab das jetzt anderes gelöst, aber gibt es da nicht einen performanteren weg, weil join geht ja nur bei datenbanktabellen und nicht bei einem bestimmten wert in einer internen tabelle?
kaufmann123
ForumUser
 
Beiträge: 13
Registriert: 13.02.2018, 11:15
Dank erhalten: 0 mal
Ich bin: Student/in

Re: Select im loop alternative

Beitragvon MrBojangles » 18.05.2018, 08:13

Hallo Kaufmann123,

DeathAndPain hat Dir eigentlich schon Steigbügel & Sattel bereitet, Du müsstest jetzt aber noch aufs Pferd aufsteigen...
Code: Alles auswählen
   SELECT * FROM mhnd
      INNER JOIN MAHNK ON MHND~BUKRS = MHNK~BUKRS
                                    AND alle_anderen_schlüsselfelder der MHNK
      INTO CORRESPONDING FIELDS OF TABLE i_mahn
      where MHND~bukrs = p_...
         AND haste_nicht_gesehen
         AND ( ( MHNK~MAHNA = '...'  AND MHND~MAHNS >= ...) OR
                  ( nochmal_was_anderes ) ).
 


Noch einfacher geht es, wenn Du Deinen Report mit der logischen Datenbank MAF verknüpfst, dann bekommst Du die Selektion des Mahnbestandes praktisch hinterher geschmissen. Beispielcoding s. Report RFMAHN01.
Weiterhin viel Freude mit SAP...
Cheers
MrB.
MrBojangles
Specialist
 
Beiträge: 355
Registriert: 09.03.2006, 13:19
Dank erhalten: 25 mal
Ich bin: Berater/in


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
gelöst Dump bei Methode ADD_FUNCTION
vor 2 Stunden von mareikemei92 2 Antw.
gelöst Feld sperren, wenn in and. Feld gerade etwas eingegeben wird
vor 2 Stunden von a-dead-trousers 2 Antw.
Wiederholungsnachricht für Lieferung
vor 36 Minuten von wreichelt 1 Antw.
gelöst Aus einer OO-Transaktion Dynpro aufrufen und wieder zurück
vor 2 Stunden von a-dead-trousers 7 Antw.
gelöst Umwandeln string <-> xstring OHNE Codepagekonvertierung
vor 6 Stunden von a-dead-trousers 5 Antw.

  Ähnliche Beiträge beta
loop inkl. Select
03.05.2011, 16:09 von Ratazong 4 Antw.
Loop mit Select-Options in der Where-Bedingung
14.11.2005, 07:55 von olli-x 1 Antw.
LOOP in einem LOOP
19.09.2013, 10:21 von Bjuti 4 Antw.
Alternative zu COLLECT
05.10.2007, 10:03 von black_adept 2 Antw.
gelöst Alternative zum INNER JOIN
05.02.2016, 11:24 von treyfifty 2 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Google Adsense [Bot]