Select über mehrere Tabellen

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

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

Select über mehrere Tabellen

Beitrag von ChrissixD (ForumUser / 27 / 17 / 0 ) »
Hallo Leute,
ich bin gerade angefangen mir die ABAP Programmierung ein bisschen anzugucken.
Jetzt komm ich leider nicht mehr weiter. Ich hatte bisher auch weniger mit Datenbanken und Tabellen zutun, deswegen ist das schon was neues.

Das Programm soll aus der einen Tabelle eine Kennzahl und die entsprechende Beschreibung zu der Kennzahl selektieren und aus der anderen Tabelle (Kundennummern) wieviele Kunden diese Kennzahl vergeben haben.
Also soll nachher ausgegeben werden: Kennzahl ; Kenzahlbezeichnung ; Anzahl der Kunden mit dieser Kennzahl

Ich habe es hinbekommen dass alle Kunden mit der entsprechenden Kennzahl in eine internen Tabelle übergeben werden und mit:

Code: Alles auswählen.

LINES( itab )
habe ich die Zeilen der internen Tabelle gezählt und dann gibt das Programm auch die richtige Anzahl an Kunden mit der Kennzahl an. Somit habe ich alle Werte, aber wie klappt das mit dem Ausgeben aller Werte zusammen?
Der Benutzer kann in seiner selektierung auch Kennzahl von-bis angeben, dann sollen natürlich alle entsprechenden Kennzahlen ausgebeben werden mit der Bezeichnung und Anzahl der Kunden.

Wie muss ich da vorgehen? Könnte das jemand für ein Leien erkären?

Freue mich auf euere antworten :)
MfG

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


Re: Select über mehrere Tabellen

Beitrag von JHM (Top Expert / 1188 / 1 / 195 ) »
ChrissixD hat geschrieben:Wie muss ich da vorgehen? Könnte das jemand für ein Leien erkären?
Schau dir in der Hilfe JOIN, GROUP BY und COUNT an.

In etwa (wäre einfacher wenn man deine Tabellennamen hätte):

Code: Alles auswählen.

SELECT kennzahl~key
       kennzahl~bezeichnung
       COUNT(kunde~key)
  INTO TABLE itab
  FROM Kennzahl
  JOIN kunde
    ON kunde~kennzahlkey = Kennzahl~key
  WHERE Kennzahl~key IN selopt_kennzahl
  GROUP BY Kennzahl~key Kennzahl~bezeichnung.

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
ChrissixD

Gruß Hendrik

Re: Select über mehrere Tabellen

Beitrag von ChrissixD (ForumUser / 27 / 17 / 0 ) »
Hallo JHM,
danke erstmal für deine schnelle Antwort.
Leider komm ich mit dem Code noch nicht ganz klar. Ich schreib dir mal meine Tabellennamen:

Kennzahl und Kennzahlbezeichnung:
t016t~brsch
t016t~brtxt
Kundennummer und Kennzahl zum Kunden:
kna1~kunnr
kna1~brsch

T016T ist eine Pool und Clustertabelle und bei deinem Code kommt die Fehlermeldung:
Bei Pool- und Cluster-Tabellen sind Vergleiche mit Spaltenreferenzen nicht möglich: "T016T~BRSCH".

Wie gehe ich da jetzt vor?
Danke für eure Hilfe

Re: Select über mehrere Tabellen

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Da bei Clustertabellen kein Join gemacht werden kann musst du halt 2-stufig arbeiten .

Code: Alles auswählen.

SELECT kennzahl~key
       kennzahl~bezeichnung
  INTO CORRESPONDING FIELDS OF TABLE itab
  FROM Kennzahl
  WHERE Kennzahl~key IN selopt_kennzahl.

loop at itab assigning fieldsymbol(<ls_itab>).
SELECT  COUNT( * )
  INTO <ls_itab>-...
  FROM kunde
   WHERE Kennzahl~key = <ls_itab>-key.
endloop.

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

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Select über mehrere Tabellen

Beitrag von ChrissixD (ForumUser / 27 / 17 / 0 ) »
Hallo Stefan,
vom Prinzip her Verstehe ich es doch was soll das mit dem fieldsymbol. Ich werde leider auch nicht durch google oder der SAP Hilfe schlauer..
Das ist mein erstes ABAP Programm und ich habe bishher nur grobe Erfahrungen in C# und JavaScript.

Es wäre sehr nett wenn mir jemand etwas ausführlicher erklären könnte wie man hier vorgeht und was man alles braucht (Also vielleicht auch die DATA deklaration oder wie man die interne Tabelle definiert).
An sich sollte/scheint es kein kompliziertes Programm (zu) sein, doch ich versteh die ABAP Sprache leider noch nicht so ganz.

Vielen Dank für Eure Geduld :oops: :wink:

Re: Select über mehrere Tabellen

Beitrag von PeterPaletti (Specialist / 336 / 29 / 96 ) »
Mein Coding sieht so aus:

Code: Alles auswählen.

TYPES: BEGIN OF ty_kunden_kennzahl,
         brsch  TYPE t016t-brsch,
         brtxt  TYPE t016t-brtxt,
         anzahl TYPE i,
       END OF ty_kunden_kennzahl,
       tt_kunden_kennzahl TYPE TABLE OF ty_kunden_kennzahl.

DATA: gt_kunden_kennzahl TYPE tt_kunden_kennzahl.
DATA: gs_kunden_kennzahl TYPE ty_kunden_kennzahl.
FIELD-SYMBOLS: <gs_kunden_kennzahl> TYPE ty_kunden_kennzahl.

SELECT-OPTIONS: so_brsch FOR  gs_kunden_kennzahl-brsch.

START-OF-SELECTION.

  SELECT brsch brtxt FROM t016t
  INTO CORRESPONDING FIELDS OF TABLE gt_kunden_kennzahl
  WHERE brsch IN so_brsch.

  LOOP AT gt_kunden_kennzahl ASSIGNING  <gs_kunden_kennzahl>.
    SELECT COUNT( * ) FROM kna1
    INTO <gs_kunden_kennzahl>-anzahl
    WHERE brsch =  <gs_kunden_kennzahl>-brsch.
  ENDLOOP.

  LOOP AT  gt_kunden_kennzahl ASSIGNING <gs_kunden_kennzahl>.
    WRITE: / <gs_kunden_kennzahl>-brtxt, <gs_kunden_kennzahl>-anzahl.
  ENDLOOP.
Beim ersten LOOP mit ASSIGNING könnte man auch LOOP AT gt_kunden_kennzahl INTO gs_kunden_kennzahl setzen. allerdings müsste man dann ein MODIFY setzen, das spart man sich beim LOOP mit ASSIGNING.

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
ChrissixD


Re: Select über mehrere Tabellen

Beitrag von ChrissixD (ForumUser / 27 / 17 / 0 ) »
Super, Danke PeterPaletti
Dein Code klappt wunderbar, ich werde mir den morgen mal in Ruhe anschauen und versuchen nachzuvollziehen, weil so ganz versteh ich den Code noch nicht:D
Wahrscheinlich hab ich dann noch die ein oder andere Frage

Gruß

Re: Select über mehrere Tabellen

Beitrag von ChrissixD (ForumUser / 27 / 17 / 0 ) »
Ist es jetzt noch möglich bei Peters Code zusätzlich nach der Kundennummer zu selektieren?

Re: Select über mehrere Tabellen

Beitrag von PeterPaletti (Specialist / 336 / 29 / 96 ) »
Meinst du so in etwa?

Code: Alles auswählen.

TYPES: BEGIN OF ty_kunden_kennzahl,
         brsch  TYPE t016t-brsch,
         brtxt  TYPE t016t-brtxt,
         anzahl TYPE i,
       END OF ty_kunden_kennzahl,
       tt_kunden_kennzahl TYPE TABLE OF ty_kunden_kennzahl.

DATA: gt_kunden_kennzahl TYPE tt_kunden_kennzahl.
DATA: gs_kunden_kennzahl TYPE ty_kunden_kennzahl.
DATA: gs_kna1 TYPE kna1.
FIELD-SYMBOLS: <gs_kunden_kennzahl> TYPE ty_kunden_kennzahl.

SELECT-OPTIONS: so_brsch FOR gs_kunden_kennzahl-brsch.
SELECT-OPTIONS: so_kunnr FOR gs_kna1-kunnr.

START-OF-SELECTION.

  SELECT brsch brtxt FROM t016t
  INTO CORRESPONDING FIELDS OF TABLE gt_kunden_kennzahl
  WHERE brsch IN so_brsch
  AND spras = sy-langu.

  LOOP AT gt_kunden_kennzahl ASSIGNING  <gs_kunden_kennzahl>.
    SELECT COUNT( * ) FROM kna1
    INTO <gs_kunden_kennzahl>-anzahl
    WHERE brsch =  <gs_kunden_kennzahl>-brsch
      AND kunnr IN so_kunnr. .
  ENDLOOP.

  LOOP AT  gt_kunden_kennzahl ASSIGNING <gs_kunden_kennzahl>.
    WRITE: / <gs_kunden_kennzahl>-brtxt, <gs_kunden_kennzahl>-anzahl.
  ENDLOOP.
Oder was verstehst du unter "selektieren"?

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
ChrissixD


Re: Select über mehrere Tabellen

Beitrag von ChrissixD (ForumUser / 27 / 17 / 0 ) »
Guten Morgen Peter,
ich hätte da noch Fragen zu deinem Code ;)
Von der Funktion her ist der Code gut, macht genau das was passieren soll, mit ausnahme von einer Warnung:
"Der Arbeitsbereich "gt_kunden_kennzahl" hat mehr Felder als selektiert werden."
Aber das Programm funktioniert ja trotzdem , deswegen ist das ja nicht schlimm.

Also erstmal meinem Verständnis von dem Programm:
ty_kunden_kennzahl ist eine Tabellenzeile?? Mit dem Inhalt brsch, brtxt und anzahl i.
Daraufhin wird die Tabellenzeile ty_... auf tt_kunden_kenzahl kopiert. Also sind im Programm jetzt 2 mal die gleiche Zeile. Macht man das um die Struktur der Tabelle festzulegen? Oder werden hier bereits Daten aus der Tabelle T016T gespeichert?

Bei der DATA Deklaration werden zwei interne Tabellen erstellt nach der Struktur der gerade erstellten Zeilen. Bei der dritten DATA Answeisung wird eine Variable für die Tabelle kna1 vergeben.
Nach Fieldsymbols habe ich gegoogelt aber wirklich schlau geworden bin ich daraus nicht.

Select-Options ist klar, für die Selektierungssicht.
Dann werden brsch & brtxt in die interne Tabelle gt_kunden_kennzahl geschrieben aber nur die, die auch in der Selektierungssicht vorgegeben wurden (und Systemsprache Check)

Ich versteh was die Schleife macht, doch den Code genau nachvollziehen kann ich leider nicht. Also es werden die Kunden gezählt, welche mit der Branche und der Kundennummer aus SELECT-OPTIONS übereinstimmen. Diese anzahl wird in der Variable fieldsymbol-anzahl gespeichert. Was bedeutet hier das "ASSIGNING fieldsymbol" im Schleifenkopf?

Bei der Ausgabeschleife frag ich mich wieder die Daten alle im Fieldsymbol hinterlegt sind. Kommt das durch das ASSIGNING?
Es wäre sehr nett wenn mir das jemand erklären würde (Peter? :wink: ), ich weiß aber auch dass es ziemlich anstrengend sein kann einen Anfänger wie mir alles zu erklären, weils für euch wahrscheinlich Basics sind.
Gruß
Christian

Re: Select über mehrere Tabellen

Beitrag von PeterPaletti (Specialist / 336 / 29 / 96 ) »
Ja, die Warnung kommt, weil die Tabelle noch das Feld anzahl hat, das aber im ersten Schritt nicht selektiert wird, sondern erst im zweiten Schritt gefüllt werden kann.
Man könnte dem entgehen, in dem man eine Tabelle baut mit den Feldern brsch und brtxt (ohne anzahl) und selektiert in diese aus der Tabelle t016t. Dann baut man sich eine zweite Tabelle mit brsch, brtxt und anzahl. Und im zweiten Schritt loopt man über die erste Tabelle, ermittelt die Anzahl und füllt die zweite Tabelle, Das ist natürlich etwas aufwendiger und da nur eine Warnung kommt auch eigentlich unnötig.

ty_kunden_kennzahl ist eine Tabellenzeile?? Mit dem Inhalt brsch, brtxt und anzahl i. tt_kunden_kennzahl ist ein Tabellentyp mit der Struktur von ty_kunden_kennzahl, also mit den Spalten brsch, brtxt und anzahl. Man hat also einmal den Typ einer Zeile (ty) und einmal den Typ einer Tabelle (tt). Daten sind da nicht drin.

Bei der Datendeklaration haben wir mit
gt_kunden_kennzahl eine Tabelle
gs_kunden_kennzahl eine Tabellenzeile (auch Arbeitsbereich oder Workarea oder Struktur genannt)
und mit
gs_kna1 ebenfalls eine Tabellenzeile (auch Arbeitsbereich oder Workarea oder Struktur genannt)

Die letzten beiden werden eigentlich nur dazu verwendet um das SELECT-OPTIONS zu setzen.

Feldsymbole werden eigentlich in der Hauptsache für die dynamische Programmierung verwendet. Hier hat es einfach nur den Zweck das MODIFY zu sparen.
Angeblich soll ein LOOP ASSIGNING auch schneller gehen als ein LOOP INTO.

Statt:

Code: Alles auswählen.

  LOOP AT gt_kunden_kennzahl ASSIGNING  <gs_kunden_kennzahl>. "Feldsymbol
    SELECT COUNT( * ) FROM kna1
    INTO <gs_kunden_kennzahl>-anzahl
    WHERE brsch =  <gs_kunden_kennzahl>-brsch
      AND kunnr IN so_kunnr. .
  ENDLOOP.
könntest du auch

Code: Alles auswählen.

DATA: gv_tabix TYPE sy-tabix.
  LOOP AT gt_kunden_kennzahl INTO gs_kunden_kennzahl.  "Workarea  (ohne eckige Klammern)
    gv_tabix = sy-tabix.
    SELECT COUNT( * ) FROM kna1
    INTO gs_kunden_kennzahl-anzahl
    WHERE brsch =  gs_kunden_kennzahl-brsch
      AND kunnr IN so_kunnr. .
    MODIFY gt_kunden_kennzahl FROM  gs_kunden_kennzahl INDEX sy-tabix.
  ENDLOOP.
schreiben,

Das ASSIGNING braucht man in der Syntax beim Feldsymbol, das INTO bei einer Workarea.

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
ChrissixD


Re: Select über mehrere Tabellen

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
PeterPaletti hat geschrieben:Angeblich soll ein LOOP ASSIGNING auch schneller gehen als ein LOOP INTO.
Zumindest wird das überall so behauptet und macht ja auch Sinn, weil beim INTO ein Wert/Struktur/Tabelle von einer Speicherstelle auf eine andere kopiert werden muss, was beim ASSIGNING halt wegfällt.
Allerdings habe ich mal irgendwo gehört ( finde das aber nicht mehr - hat zufällig jmd einen Link dazu oder kann das widerlegen) dass bei einem Methodenaufruf mittels Call-by-value das Kopieren erst dann stattfindet, sobald eine Schreiboperation auf die Variable stattfindet. Und wenn ein Compiler/Kernel das bei Methoden hinbekommt könnte das analog auch für LOOPs gelten.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Select über mehrere Tabellen

Beitrag von PeterPaletti (Specialist / 336 / 29 / 96 ) »
Ja okay, beim INTO wird kopiert und beim ASSIGNING habe ich einen Zeiger, weswegen im 2. Fall das MODIFY fehlen kann. Das ist wohl schneller. Allerdings, wie viele Branchenschlüssel hat der TE wohl auf seinem System 20? 30? Das wird wohl nicht gleich in die Tausende gehen. Von daher vermute ich mal dass der Performancegewinn durch das ASSIGNING nicht so überragend groß ausfallen wird. Im übrigen scheint der TE mit ABAP noch nicht so viel zu tun zu haben. Ihn da gleich mit Feldsymbolen und Performanceproblemen zu überfallen, wirkt doch eher abschreckend.

Re: Select über mehrere Tabellen

Beitrag von JHM (Top Expert / 1188 / 1 / 195 ) »
PeterPaletti hat geschrieben: Allerdings, wie viele Branchenschlüssel hat der TE wohl auf seinem System 20? 30? Das wird wohl nicht gleich in die Tausende gehen. Von daher vermute ich mal dass der Performancegewinn durch das ASSIGNING nicht so überragend groß ausfallen wird.
Wenn wir schon über Performance reden, würde wahrscheinlich Sinn machen zu erst alle Branchen incl. Bezeichnung zu selektieren und dann mit einem Select und FOR ALL ENTRIES auf die KNA1 zu zugreifen. Dies sollte schneller sein, als 20-30 einzel Selects.

Damit die anschließende Verknüpfung der beiden internen Tabellen dann noch möglichst schnell ist, mit SORTED TABEL oder READ BINARY arbeiten.

Aber ob das etwas für den Anfänger taugt?
Gruß Hendrik

Seite 1 von 1

Vergleichbare Themen

13
Antw.
7735
Views
Select auf 2 große Tabellen
von ann_bine » 01.06.2012 14:56 • Verfasst in ABAP® für Anfänger
7
Antw.
8358
Views
Select auf zwei Tabellen
von mip » 27.03.2008 16:05 • Verfasst in ABAP® für Anfänger
9
Antw.
4129
Views
Select über 3 Tabellen
von Papst BenR » 08.09.2014 21:36 • Verfasst in ABAP® für Anfänger
2
Antw.
2365
Views
SELECT über 6 DB-Tabellen
von Mavrix » 14.06.2007 07:48 • Verfasst in ABAP® für Anfänger
6
Antw.
3307
Views
select mehrere tabellen
von thr-hn » 04.04.2014 13:39 • 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

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

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

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140