gelöst Selektion aus Datenbanktabelle mithilfe von interner Tabelle


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

Moderatoren: Jan, Steff

gelöst Selektion aus Datenbanktabelle mithilfe von interner Tabelle

Beitragvon Legxis » 15.03.2018, 10:09

Hallo!

Ich muss einen sehr ausführlichen Report erstellen. Bisher habe ich immer Joins benutzt, dies ist aber in dem Fall nicht möglich, da es zu viele Tabellen und Vorraussetzungen gibt. Daher benötige ich eine Methode, wie man nach und nach die Daten selektieren kann.

Ich habe mit einem Select circa ein Drittel der Daten selektiert, jetzt möchte ich die anderen hinzufügen, allerdings kann man ja bei einem Selekt nicht die interne Tabelle als WHERE Bedingung nehmen, um mit den Daten aus der internen Tabelle zu vergleichen.

Zum Verständnis der Code:

Code: Alles auswählen
TYPES: BEGIN OF lty_gt_vbakvbap,
  vbeln TYPE vbeln,      " Vertriebsbelegnummer (VBAK)
  auart TYPE auart,      " Verkaufsbelegart (VBAK)
  erdat TYPE erdat,      " Angelegt am (VBAK)
  vkorg TYPE vkorg,      " Verkaufsorganisation (VBAK)
  vkbur TYPE vkbur,      " Verkaufsbüro (VBAK)
  vkgrp TYPE vkgrp,      " Verkäufergruppe (VBAK)
  posnr TYPE posnr_va,   " Position (VBAP)
  matnr TYPE matnr,      " Materialnnummer (VBAP)
  arktx TYPE arktx,      " Bezeichnung (VBAP)
  werks TYPE werks_ext,  " Werk (VBAP)
  kwmeng TYPE kwmeng,    " kumulierte Menge (VBAP)
  meins TYPE meins,      " Basismengeneinheit (VBAP)
END OF lty_gt_vbakvbap.

DATA: gt_vbakvbap TYPE SORTED TABLE OF lty_gt_vbakvbap WITH NON-UNIQUE KEY vbeln.

SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_vbakvbap
  FROM vbak AS a
  INNER JOIN vbap AS b ON a~vbeln = b~vbeln
WHERE a~audat IN s_audat
  AND a~auart IN s_auart
  AND b~werks IN s_werks
ORDER BY a~vbeln.


Nun hätte ich z.B. noch gerne Daten aus der EKBE wie EBELN, EBEP und BUDAT. (Und VGABE muss auf 1 gesetzt sein, da es nur Wareneingang sein soll.) Die EBELN zu meinen VBELN kann ich über die Tabelle EKKN finden.
Aber wie setze ich das um, da meine VBELN doch in einer internen Tabelle stehen, wie selektiere ich anhand davon von einer Datenbanktabelle?

Ich danke im Vorraus für Hilfe, ich bin noch sehr neu in ABAP und habe wie gesagt bisher immer nur Joins benutzt.
Ich bin Neuling und für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele dankbar^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )
Legxis
Specialist
 
Beiträge: 100
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 17 mal
Ich bin: Student/in

Sponsor

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

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon ewx » 15.03.2018, 10:14

ewx
Top Expert
 
Beiträge: 3707
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 282 mal

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon Legxis » 15.03.2018, 16:27

Ich bin nun soweit gekommen:

Code: Alles auswählen
* Bestelldaten aus EKBE (mithilfe von EKKN) selektieren
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_ekbeekkn
  FROM ekbe AS a
  INNER JOIN ekkn AS b ON a~ebeln = b~ebeln AND a~ebelp = b~ebelp
FOR ALL ENTRIES IN gt_vbakvbap
  WHERE b~vbeln = gt_vbakvbap-vbeln
    AND a~bewtp = 'E'.                    " Bestellentwicklungstyp: nur Wareneingang

SORT gt_ekbeekkn BY vbeln ebeln ebelp.

* Zusammenführen der beiden internen Tabellen
LOOP AT gt_vbakvbap INTO wa_vbakvbap.

  wa_outtab-vbeln = wa_vbakvbap-vbeln.
  wa_outtab-vbeln = wa_vbakvbap-vbeln.
  wa_outtab-auart = wa_vbakvbap-auart.
  wa_outtab-audat = wa_vbakvbap-audat.
  wa_outtab-vkorg = wa_vbakvbap-vkorg.
  wa_outtab-vkbur = wa_vbakvbap-vkbur.
  wa_outtab-vkgrp = wa_vbakvbap-vkgrp.
  wa_outtab-posnr = wa_vbakvbap-posnr.
  wa_outtab-matnr = wa_vbakvbap-matnr.
  wa_outtab-arktx = wa_vbakvbap-arktx.
  wa_outtab-werks = wa_vbakvbap-werks.
  wa_outtab-kwmeng = wa_vbakvbap-kwmeng.
  wa_outtab-meins = wa_vbakvbap-meins.

  LOOP AT gt_ekbeekkn INTO wa_ekbeekkn WHERE vbeln = wa_vbakvbap-vbeln.   " Bestellung zur VBELN vorhanden, Daten einfügen

       wa_outtab-budat = wa_ekbeekkn-budat.
       wa_outtab-ebeln = wa_ekbeekkn-ebeln.
       wa_outtab-ebelp = wa_ekbeekkn-ebelp.                               " keine Bestellung vorhanden, Felder leer lassen

  ENDLOOP.

  APPEND wa_outtab TO gt_outtab.
  CLEAR  wa_outtab.

ENDLOOP.


Mein Problem ist jetzt, dass in meiner outtab (wenn Bestelldaten eingefügt werden) EBELP immer die letzte Positionsnummer ist, weil immer mehrmals durch den inneren Loop gegangen wird, bis die VBELN unterschiedlich sind.
Aber wenn ich in den inneren Loop einen Append tue, dann wird, nachdem der Loop verlassen wird, nochmal Appended, also doppelte Einträge gemacht.
Ich weiß nicht, wie ich das jetzt lösen soll.
Ich bin Neuling und für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele dankbar^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )
Legxis
Specialist
 
Beiträge: 100
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 17 mal
Ich bin: Student/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon ralf.wenzel » 15.03.2018, 20:22

Der APPEND unter dem LOOP muss raus, so einfach ist das.


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3093
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 176 mal
Ich bin: Freiberufler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon DeathAndPain » 16.03.2018, 18:43

Und dafür muss er in den inneren LOOP rein, da Du, wenn ich Dich richtig verstanden habe, alle Positionen in Deiner Ausgabetabelle haben willst.

Warum hast Du eigentlich den Schlüssel von gt_vbakvbap als non-unique definiert? Der ist doch garantiert unique, da Du Aufträge aus der VBAK liest, und die hat vbeln als Primärschlüssel!
DeathAndPain
Expert
 
Beiträge: 709
Registriert: 05.05.2006, 10:14
Dank erhalten: 168 mal
Ich bin: Entwickler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon Legxis » 21.03.2018, 12:43

Ich wollte in der Endtabelle auch die Einträge der ersten Tabelle haben, bei denen es keine Daten aus der zweiten gab, nicht nur die Einträge, zu denen beide Tabellen Daten haben.
Deshalb funktionierte es nicht, das APPEND in den inneren LOOP zu tun.
Mein Problem wurde gelöst indem ich auch die Positionsnummer geprüft habe (dafür muss Länge angepasst werden).

Code: Alles auswählen
  LOOP AT gt_ekbeekkn INTO wa_ekbeekkn WHERE vbeln = wa_vbakvbap-vbeln AND ebelp = wa_vbakvbap-posnr+1(5).  

Die Daten aus weiteren Tabellen habe ich dann ebenfalls mit einen SELECT FOR ALL ENTRIES und den geschachtelten LOOPS umgesetzt, dann allerdings statt APPEND natürlich MODIFY verwendet.
Ich bin noch nicht ganz fertig, mal schauen ob alles richtig ist.

DeathAndPain hat geschrieben:Warum hast Du eigentlich den Schlüssel von gt_vbakvbap als non-unique definiert? Der ist doch garantiert unique, da Du Aufträge aus der VBAK liest, und die hat vbeln als Primärschlüssel!

Ich habe das Konzept von unique und non-unique noch nicht ganz verstanden.
Ich bin Neuling und für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele dankbar^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )
Legxis
Specialist
 
Beiträge: 100
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 17 mal
Ich bin: Student/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon ralf.wenzel » 21.03.2018, 12:55

Ein NON-UNIQUE-Schlüssel darf mehrfach vorkommen.


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3093
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 176 mal
Ich bin: Freiberufler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon DeathAndPain » 21.03.2018, 13:03

...während es bei einem unique-Schlüssel nur einen einzigen Eintrag mit diesem Schlüssel (d.h. dieser Kombination von Spaltenwerten) in Deiner internen Tabelle geben darf, sonst dumpt's. Das ist sehr nützlich zum Auffinden von Programmierfehlern: Mich haben schon häufig Dumps wegen mehrfacher Einträge mit demselben Schlüssel, die ich bei Programmerstellung für unmöglich gehalten habe, auf programmlogikrelevante Denkfehler meinerseits gebracht.

In Deinem Fall ist der Schlüssel VBELN. Das ist der Primärschlüssel der Tabelle VBAK, soll heißen, es kann in der VBAK keine zwei Einträge mit demselben VBELN geben (da Datenbank-Primärschlüssel immer unique sind). Da Du Deine interne Tabelle aus der VBAK füllst, ist dies daher auch für Deine interne Tabelle garantiert, und Du solltest den Schlüssel als unique definieren.

Klar, non-unique funktioniert immer, aber man beraubt sich damit eines wertvollen Kontrollmechanismusses.

Für diese Nachricht hat DeathAndPain einen Dank bekommen :
Legxis
DeathAndPain
Expert
 
Beiträge: 709
Registriert: 05.05.2006, 10:14
Dank erhalten: 168 mal
Ich bin: Entwickler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon ralf.wenzel » 21.03.2018, 14:16

DeathAndPain hat geschrieben:...während es bei einem unique-Schlüssel nur einen einzigen Eintrag mit diesem Schlüssel (d.h. dieser Kombination von Spaltenwerten) in Deiner internen Tabelle geben darf, sonst dumpt's. Das ist sehr nützlich zum Auffinden von Programmierfehlern: Mich haben schon häufig Dumps wegen mehrfacher Einträge mit demselben Schlüssel, die ich bei Programmerstellung für unmöglich gehalten habe, auf programmlogikrelevante Denkfehler meinerseits gebracht.


Das ist ein nicht zu unterschätzender Vorteil von internen Tabellen mit qualifiziertem Schlüssel.

Ralf *kann Standardtabellen nicht leiden
ralf.wenzel
Top Expert
 
Beiträge: 3093
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 176 mal
Ich bin: Freiberufler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon DeathAndPain » 21.03.2018, 15:40

Bei Standardtabellen kannste auch einen qualifizierten Schlüssel angeben. :P
DeathAndPain
Expert
 
Beiträge: 709
Registriert: 05.05.2006, 10:14
Dank erhalten: 168 mal
Ich bin: Entwickler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon ralf.wenzel » 21.03.2018, 16:02

DeathAndPain hat geschrieben:Bei Standardtabellen kannste auch einen qualifizierten Schlüssel angeben. :P


Ich meinte so das Übliche "marctab type standard table of marc". Aber war klar, dass der Einwand kommt ;)


Ralf
ralf.wenzel
Top Expert
 
Beiträge: 3093
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 176 mal
Ich bin: Freiberufler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon DeathAndPain » 21.03.2018, 16:13

Ich auch. Du kannst ja Deinen Code erweitern:

Code: Alles auswählen
DATA MARCTAB TYPE STANDARD TABLE OF MARC WITH KEY MATNR.

Dann ist es syntaktisch wie bei sortierten Tabellen (mal abgesehen vom nicht verwendbaren Schlüsselwort unique). Einen Nutzen habe ich bei Schlüsseln auf Standardtabellen freilich nie so recht gesehen. Ich glaube, bei den AT-Events in LOOPs oder bei COLLECT bringen sie was. Ansonsten ist es aber eigentlich Speicherverschwendung, dass bei Standardtabellen defaultmäßig ein Schlüssel angelegt wird. Ich habe es mir zur Angewohnheit gemacht, bei der Definition von Standardtabellen WITH EMPTY KEY dazuzuschreiben. Bringt Klarheit und spart ein paar Bytes. :)

Ab und zu braucht man Standardtabellen ja doch, etwa für Table Controls, ALV-Ausgabetabellen oder wenn man CSV-Dateien einliest oder ausgibt.
DeathAndPain
Expert
 
Beiträge: 709
Registriert: 05.05.2006, 10:14
Dank erhalten: 168 mal
Ich bin: Entwickler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon black_adept » 21.03.2018, 18:37

DeathAndPain hat geschrieben:...Ich habe es mir zur Angewohnheit gemacht, bei der Definition von Standardtabellen WITH EMPTY KEY dazuzuschreiben. Bringt Klarheit und spart ein paar Bytes. :)
Wann war Speicherverbrauch bzw. der Gewinn den du hier erzielst das letzte Mal ein Faktor für dich?
DeathAndPain hat geschrieben:Ab und zu braucht man Standardtabellen ja doch, etwa für Table Controls, ALV-Ausgabetabellen oder wenn man CSV-Dateien einliest oder ausgibt.
Die braucht man eigentlich dauernd, wenn man dem User die Möglichkeit einer Sortierung geben will. Oder wenn die Reihenfolge einfach wichtig ist aber eben nicht dem (üblichen) Schlüssel entspricht (z.B. ATP-Rückgabe von SAP-StandardFuBa ). Oder wenn man schlüsselverändernde Operationen erlauben will. Oder , oder , oder.....
Jede Tabellenart hat ihre Daseinsberechtigung, man muss nur wissen was man vorhat und dann den richtigen Typ auswählen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Für diese Nachricht hat black_adept 3 Dankeschön bekommen :
a-dead-trousers, DeathAndPain, gtoXX
black_adept
Top Expert
 
Beiträge: 3014
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 506 mal
Ich bin: Freiberufler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon DeathAndPain » 22.03.2018, 10:51

Wann war Speicherverbrauch bzw. der Gewinn den du hier erzielst das letzte Mal ein Faktor für dich?

Ich habe das immer im Auge, auch wenn es nur um Kleinkram geht. Ist ein Stück Perfektionismus auf meiner Seite. Aber natürlich nur, wenn der Aufwand im überschaubaren Rahmen liegt. "WITH EMPTY KEY" hinzuschreiben ist wenig aufwendig genug für meinen Geschmack. Auch den FREE-Befehl setze ich dann und wann mal ein, um Puffertabellen zu leeren, die ihren Zweck für die Berechnung meiner Ergebnisse erfüllt haben.

Die braucht man eigentlich dauernd, wenn man dem User die Möglichkeit einer Sortierung geben will.

Was eigentlich nur in den von mir genannten Fällen, nämlich bei Ausgabetabellen, der Fall ist.

Oder wenn man schlüsselverändernde Operationen erlauben will.

Bei Datenbanktabellen gehen die nicht, aber sind die auch bei internen Tabellen nicht zulässig? Wäre ich zumindest nie drüber gestolpert, dass mir deswegen ein MODIFY auf die Bretter gegangen wäre. Wobei es natürlich auch sein kann, dass ich sowas nie versucht habe, weil es inhaltlich nur selten Sinn machen dürfte.

Jede Tabellenart hat ihre Daseinsberechtigung, man muss nur wissen was man vorhat und dann den richtigen Typ auswählen.

Im Prinzip würde ich das auch so sehen, nur bei den Hashtabellen habe ich große Zweifel am Sinn. Nachdem ich seinerzeit meine Performance-Tests durchgeführt habe (ich berichtete hier) und dabei zu dem Ergebnis gelangt bin, dass das Füllen von Hashtabellen so lange dauert, dass man im Verhältnis zu der Zeilenanzahl irrsinnig viele Lesezugriffe brauchen würde, um verglichen mit sortierten Tabellen durch Lesezeitersparnis die zum Füllen der Tabelle (Berechnen der Hashwerte) benötigte Zeit wieder reinzuholen, bin ich überzeugt, dass es in meinen Programmen niemals einen Fall geben wird, bei dem die Hashtabelle die bessere Wahl wäre. Zumal ich feststellen musste, dass die Suchzeit in Hashtabellen noch nicht mal ganz konstant ist, sondern gleichfalls mit der Zeilenanzahl ansteigt, was von der Theorie her ja nicht so sein sollte (wenn auch nur in sehr moderatem Umfang).
DeathAndPain
Expert
 
Beiträge: 709
Registriert: 05.05.2006, 10:14
Dank erhalten: 168 mal
Ich bin: Entwickler/in

Re: Selektion aus Datenbanktabelle mithilfe von interner Tab

Beitragvon Legxis » 22.03.2018, 16:58

DeathAndPain hat geschrieben:In Deinem Fall ist der Schlüssel VBELN. Das ist der Primärschlüssel der Tabelle VBAK, soll heißen, es kann in der VBAK keine zwei Einträge mit demselben VBELN geben (da Datenbank-Primärschlüssel immer unique sind)


Aber die anderen Tabellen, die ich benutze, haben Positionsnummern und damit mehrere Einträge mit derselben VBELN.
Ich bin Neuling und für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele dankbar^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )
Legxis
Specialist
 
Beiträge: 100
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 17 mal
Ich bin: Student/in

Nächste

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

  Aktuelle Beiträge   
gelöst Nachricht nach Beendigung der Verbuchung
vor 2 Stunden von ewx 2 Antw.
BCS sendet Mails immer als express?
vor 3 Stunden von Legxis 2 Antw.
Zuordnung in Grid (Screen)
vor 7 Stunden von HH_ABAP 0 Antw.
FBL3N ---> FB60
vor 8 Stunden von HH_ABAP 2 Antw.
Klasse zum lesen der Adressdaten
vor 7 Stunden von AdrianSchm 2 Antw.

  Ähnliche Beiträge beta
Selektion aus Tabelle
02.09.2003, 14:17 von tom 3 Antw.
Types mit interner Tabelle?
20.07.2005, 10:45 von Spaulding 3 Antw.
Select bei interner Tabelle
11.07.2007, 10:19 von khb 6 Antw.
Select mit interner Tabelle
13.11.2013, 15:20 von a-dead-trousers 10 Antw.
gelöst Löschen aus interner Tabelle
21.11.2014, 12:08 von Beginner014 14 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder