Filtern einer Tabelle auf Basis einer anderen

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

Getting started ... Alles für einen gelungenen Start.
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Filtern einer Tabelle auf Basis einer anderen

Beitrag von Gast ( / / 0 / 3 ) »
Hallo,
ich habe eine Tabelle, die vereinfacht so aussieht (ingesamt viele viele Spalten):

Zähler, Preis .......................
---------------------------------------
1, 10
2, 9,95
....

Dann habe ich eine Filtertabelle, die so aussieht:

Feldname, von,bis
-----------------
Zähler, 1 ,2
Preis,10,70
.....

Nun soll die 1.Tabelle mit den Einschränkungen der Tabelle 2 gefiltert werden.
Wie bekomme ich das hin? man muß beachten, dass ja in der Filtertabelle Einträge für jede Spalte enthalten sein könnten....

Für Eure Hilfe vielen Dank....

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


Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hallo Gast,

hier solltest du mit einem dyn. erzeugten Unterprogramm arbeiten:

Code: Alles auswählen.

*Filtertabelle - Prämisse: Feld ist namensgleich zu Spalte in itab
data: begin of filter occurs 100,
      feld type dd03l-fieldname,
      von type string,
      bis type string,
      end of filter.
DATA: BEGIN OF PROG OCCURS 0,
      LINE(72) TYPE C,
      END OF PROG.
DATA GENPROG LIKE TADIR-OBJ_NAME.
DATA LINE TYPE I.
DATA WORD(80) TYPE C.
DATA MESSAGE(99) TYPE C.
DATA ERROR.
data z(5).
include zfilteri1."hier ist itab deklariert !!!
data htab like itab occurs 0 with header line. "Kopie von itab
*Programm create
  append 'REPORT ZFILTER01.' to prog.
  concatenate 'include' 'ZFILTERI1.' into prog-line separated by space.
  append prog.
*Upro create
  append 'form filter_itab tables tab structure itab'  to prog.
  append '                       htab structure itab.' to prog.
  append 'loop at tab' to prog.
*where clause
  loop at filter where von <> space and bis <> space.
    add 1 to z.
    if z = 1.
      concatenate 'where' filter-feld 'between' filter-von
                  'and' filter-bis into prog-line separated by space.
      append prog.
    else.
      concatenate 'and' filter-feld 'between' filter-von
                  'and' filter-bis into prog-line separated by space.
      append prog.
    endif.
  endloop.
*Punkt nicht vergessen...
  append '.' to prog.
*Übegabe an htab
  append 'append tab to htab.' to prog.
*Ende loop / upro.
  append 'endloop.' to prog.
  append 'endform.' to prog.

*GENERIERUNG + ENDE Quellcodeerzeugung
  GENERATE SUBROUTINE POOL PROG NAME GENPROG MESSAGE MESSAGE
                                             LINE LINE WORD WORD.
*evtl. Fehlerausgabe
  IF SY-SUBRC <> 0.
    ERROR = SY-SUBRC.
    LOOP AT PROG.
      WRITE: / SY-TABIX.
      IF SY-TABIX = LINE .
        WRITE:  PROG COLOR 6.
        WRITE:/ LINE , MESSAGE COLOR 6 INTENSIFIED OFF.
      ELSE.
        WRITE:  PROG.
      ENDIF.
    ENDLOOP.
  ENDIF.
*nur weiter wenn upro o.k.
  check error is initial.
*filtern von itab
  PERFORM filter_itab IN PROGRAM (GENPROG) tables itab htab.
Gruß Andreas

Beitrag von Hans-Hermann ( / / 0 / 3 ) »
Du kannst Dir aus der Filtertabelle eine dynmische Where-Klausel basteln,
etwa so:

Code: Alles auswählen.

loop at ftab.
replace ',' with ' BETWEEN ' into ftab.
replace ',' with ' AND ' into ftab.
if sy-tabix ne 1.
concatenate 'AND' ftab into ftab separated by space.
endif.
modify ftab.
endloop.
select * from ztab where (ftab).  

Beitrag von Gast ( / / 0 / 3 ) »
Hi,

danke für Eure Antworten.

Ich habe als erstes mal die Version von Hans-Hermann ausprobiert.

Die zweite Tabelle mit den eigentlichen Daten, d.h. die Tabelle die gefiltert werden muss, ist eine interne Tabelle. Wenn ich hier LOOP At utab where (ftab) mache, dann meckert er rum, dass das Ende unerwartet wäre...

Ist Ihr noch ein Fehler meinerseits...

Gruß

Beitrag von Hans-Hermann ( / / 0 / 3 ) »
Hallo Gast,

WHERE (FTAB) geht leider nur bei SELECT, nicht bei LOOP (zumindest in 4.0b). In diesem Fall bleibt Dir wohl nur Andreas' Lösung.

Beitrag von Gast ( / / 0 / 3 ) »
Hi,

habe mal die Lösung von Andreas ausprobiert. Steige aber nicht wirklich dahinter.

Die Filterung von mir wird in einer Formroutine benötigt. D.h. ein Ereignis löst bei mir die Formroutine aus, die das Filtern übernehmen soll.

Muß ich jetzt das Coding einfügen? Es wird ja dynamisch ein Programm erzeugt, warum ist dies notwendig?

Hoffe vielleicht entwirrt zu werden :-)

Gruß und Danke

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hallo (deinen Namen kennen wir leider noch nicht :idea: ),

1) den include mußt du in deinem Datendeklarationsteil anfügen,
deine Datentabelle (itab) muß in diesem include hinterlegt sein

2) wenn deine Filtertabelle vollständig gefüllt ist ,
kannst du meinen Quellcode (am besten auch als Upro aufrufen)

3) wenn deine Ergebnistabelle (itab) vollständig gefüllt ist ,
rufst du den perform filter_itab .. auf ; du erhäst die gefilterte Tabelle
htab zurück. Mit dieser kanndt du dann weiter arbeiten.
(oder du schreibst das Ergebnis wieder in itab mit
itab[] = htab[]. )

Gruß Andreas

Beitrag von Gast ( / / 0 / 3 ) »

Code: Alles auswählen.

ranges rzahl for itab-zaehler.
ranges rpreis for itab-preis.

loop at filtertab.

  case filtertab-feldname.
  when 'Zähler'.
    rzahl-sign = 'I'.
    rzahl-option = 'BT'.
    rzahl-low = filtertab-von.
    rzahl-high = filtertab-bis.
    append rzahl.
  when 'Preis'.
   "s.o. nur mit Preis
  endcase.
endloop.

loop at itab.

   check not itab-zaehler in rzahl.
   check not itab-preis in rpreis.
   delete itab.

endloop.

Beitrag von Gast ( / / 0 / 3 ) »
Hi,

danke für die Antworten. Meine Name ist Michael.

ie Lösung von Andreas funzt weitesgehend. Eine Frage habe ich noch. Wenn ich zum Beispiel den Raum zwischen ' ' und '2' habe, d.h. ich gebe im Lower Value nichts ein, wie wird das von SAP behandelt. Beim Filtern kann es vorkommen, daß halt nur das High-Value gesetzt ist, bei mir stürzt er dann ab, weil er dann folgendes ausführt "between ' ' and '2'"

Wäre der Lower-Wert immer der Initial-Wert? Wie kann man diesen schnell und unkompliziert ermitteln (ist ja unterschiedlich zwichen Text, Zahlen usw.)

Ist auch wirklich die letzte Frage (aber dann habe ich noch die allerletzte offen) :-)

Gruß

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hallo Michael,

ich muß jetzt nach Hause :D

-schönen Feierabend allerseits,

hier noch ein schnell zus. gestr. Ansatz

Code: Alles auswählen.

    if filter-von is initial.
      concatenate 'ITAB-' filter-feld into hfeld.
      assign (hfeld) to <f>.
      describe field <f> type typ.

      case typ.
        when 'P'.
          <f> = 0."Startwert filter-von in Where-clause ersetzen
*       when....
        when others.
      endcase.
    endif.

-> in den Loop der Where-clause einsetzen

Gruß Andreas

Seite 1 von 1

Vergleichbare Themen

1
Antw.
1230
Views
Tabelle Filtern nach Monaten
von PAGUT » 24.09.2014 15:37 • Verfasst in ABAP® für Anfänger
1
Antw.
1710
Views
nicht doppelte Werte filtern und in interne Tabelle schreibe
von thomasxy » 12.03.2008 13:06 • Verfasst in ABAP® für Anfänger
2
Antw.
1570
Views
Filtern im ALV (OO)
von Betze » 18.05.2006 09:42 • Verfasst in ABAP Objects®
7
Antw.
2093
Views
Auslesen filtern
von cschmoel » 26.09.2012 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

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.