SELECT-Abfrage bei der DB-Tabelle TADIR

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

SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
Hallo zusammen.

Ich versuche momentan die Anzahl der Vorkommen der einzelnen Objekte in der Spalte OBJECT in TADIR ausgeben zu lassen. Leider ohne großen Erfolg. Irgendetwas will da einfach nicht. Ich wollte eigentlich die Datensätze gruppenweise sortiert nach ihren Eintrag in der Spalte OBJECT ausgeben lassen und anschließend dann noch einmal die Anzahl der zu der Objektbezeichnung gehörenden Datensätze. Ich drehe mich da etwas im Kreis. Kurz zuvor hatte ich noch darüber etwas nachgelesen, wie man Daten von einer DB-Tabelle in eine interne Tabelle überträgt. Jetzt jedoch weiss ich u.a. nicht so recht ob man das bei so einer Art Abfrage dann auch macht. Mein nächstes Gedankenproblem besteht darin, wie die SQL-Anfrage nun endgültig dann aussehen soll. Mir kam der Gedanke:

SELECT COUNT(OBJECT)FROM TADIR GROUP BY OBJECT
INTO wa_tadir.
WRITE:/ wa_tadir-PGMID,
wa_tadir-OBJECT,
wa_tadir-OBJ_NAME,
wa_tadir-SRCSYSTEM,
wa_tadir-AUTHOR,
wa_tadir-DEVCLASS.
ENDSELECT.
IF sy-subrc <> 0.
WRITE:/ 'Keine Datensätze vorhanden'.
ENDIF.

Allerdings muss ich selbst dazu sagen, eigentlich würde ich lieber gern eine ganze Feldliste in die SELECT eintragen. Jedoch egal wie ich versuche die SELECT zu schreiben, ich erhalte jedes mal mehr oder weniger einen Fehler nach dem anderen. Ich wollte eigentlich auch vor die SELECT noch SELECT-OBJECTS für die ersten drei Spalten der TADIR hängen. Jedoch bin ich noch nicht so recht dahinter gestiegen, wie ich das dadurch pro Spalte Intervall dann richtig in der Eingabemaske befüllen kann. Auch da bekam ich am Ende immer die ganze Tabelle ausgegeben. Es wäre Klasse, wenn mich jemand hier erleuchten könnte. Mir lässt das einfach keine Ruhe.

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


Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
hi!

Versuchs mal hiermit:

Code: Alles auswählen.

DATA:
  ld_object TYPE sobj_nam
  ld_count TYPE i.

SELECT object COUNT(*) 
  INTO (ld_object,ld_count)
  FROM tadir
  GROUP BY object.
  new-line.
  write: ld_object, ld_count.
ENDSELECT.
Dann solltest du bemerken was du falsch machst ;)

lg ADT.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
Hmm ja. Jetzt kriege ich das auch richtig ausgegeben. Aber gibt es auch noch einen Weg, der performant ist um sich nach jedem Objekt mit seiner ausgegebenen Häufigkeit dann auch noch die entsprechenden Datensätze direkt ausgeben zu lassen? Also bei mir verreckt SAP dann erst einmal gnadenlos, da ich es auf die unschönste unperformanteste Form (geschachtelte SELECT-Abfragen) versucht habe. Danach mag mich mein Notebook erst einmal nicht mehr.

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
hi!

Wenn du dir die Zahlen anschaust, die bei der Abfrage ausgegeben werden, solltest du bereits merken, dass die Ausgabe von derart vielen Objekten schon eine Zeit dauern wird :P

Du könntest anstatt einer verschachtelten Abfrage ja auch nur eine Abfrage mit allen Objekten machen und dann die Zählung selbst programmieren.
Um die Datenbank-Abfrage zu optimieren könntest du auch noch OPEN CURSOR und FETCH mit PACKAGE SIZE verwenden. Dann wird immer nur eine kleine Teilmenge von der Datenbank abgefragt und du musst nicht den kompletten Inhalt in dein Programm laden. (232 Bytes x 2,5 Mio ~ 500MB)

lg ADT

EDIT: Ach, ja. Wenn du dazu noch im SELECT-Statement nur die wirklich benötigten Felder angibst sparst du dir wiederum einiges an Übertragungszeit von der Datenbank. Dann solltest du aber auch INTO CORRESPONDING FIELDS OF verwenden, oder du musst dir eine eigene Struktur erstellen, die die benötigten Felder in der richtigen Reihenfolge beinhaltet.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
In einem anderen Versuchsprogramm hatte ich mir von der Tadir die ersten 6 Spalten ausgeben lassen. Das Ganze hatte ich zuerst in eine interne Tabelle laden lassen. Nur kann ich nicht das neben der Abfrage nach der Anzahl ja jetzt laufen lassen. Dann würden nicht Pro Objektart die Anzahl und direkt die dazu gehörenden Datensätze angezeigt werden. Das wäre dann wieder mehr oder weniger voneinander optisch getrennt. Meine letzte Überlegung war gewesen mit dem aktuellen Objekt der Select-Anfrage direkt halt eine Anfrage innerhalb der SELECT zu machen, die das Ganze dann dem Objekt entsprechend ausgibt. Mit dem FETCH-Befehl hatte ich allerdings noch nichts bis jetzt gemacht. Weisst du, ob er dazu im Stande wäre alle Objekte des passenden Typs zu laden? So dass ich dann wirklich Objektanzahl und die Datensätze von genau dem Typ da stehen habe pro Objektdurchgang?

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
cyb1982 hat geschrieben:Ich wollte eigentlich die Datensätze gruppenweise sortiert nach ihren Eintrag in der Spalte OBJECT ausgeben lassen
denn benutze doch den SELECT-Zusatz "GROUP BY"...

Code: Alles auswählen.

SELECT pgmid object COUNT( * ) FROM tadir
  INTO TABLE lt_data
 WHERE obj_name LIKE 'Z%'
 GROUP BY pgmid object.

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
Oh, das muss ich gleich mal ausprobieren. :)

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
So, jetzt habe ich mal eine Weile herum probiert. Allerdings ist mir die Art der SELECT COUNT- Anweisung noch immer nicht ganz verständlich. Ich bekomme bei Abänderungen der SELECT COUNT Meldungen wie, dass die Elemente der Feldliste und der INTO-Liste übereinstimmen müssen.

SELECT object COUNT(*)
INTO (ld_count)
* INTO (ld_object,ld_count)
FROM tadir
GROUP BY object.
new-line.
write: ld_count.
* write: ld_object, ld_count.
ENDSELECT.

Dann habe ich versucht die SELECT COUNT mit einem anderen Mini-Programm zu mergen mit dem Erfolg, dass ich dadurch wieder erreiche, dass ich einen TIMEOUT produziere. Nur weiss ich an der Stelle immer noch nicht genau wie ich das da weiter handlen kann. Jedes der beiden Programme hat einen Teil von dem, was ich am Ende haben möchte. Das eine Programm gibt mir die TADIR über eine interne Tabelle sortiert aus. Das anderre wäre der SELECT COUNT-Part, den ich ja noch nicht so ganz verstanden habe, wie ich die Feldlisten und die INTO-Listen jeweils aneinander anpassen muss. In meinem Merge-Versuch kam folgendes als Code bei raus. Bitte net lachen. Ich gelobe Besserung.

DATA:
o_name(20) TYPE c,
count TYPE i,

BEGIN OF it_tadir,
PGMID TYPE TADIR-PGMID,
OBJECT TYPE TADIR-OBJECT,
OBJ_NAME TYPE TADIR-OBJ_NAME,
SRCSYSTEM TYPE TADIR-SRCSYSTEM,
AUTHOR TYPE TADIR-AUTHOR,
DEVCLASS TYPE TADIR-DEVCLASS,
END OF it_tadir.

SELECT-OPTIONS:
ProgID FOR it_tadir-pgmid NO INTERVALS NO-EXTENSION,
Objekt FOR it_tadir-object NO INTERVALS NO-EXTENSION,
Ob_Name FOR it_tadir-obj_name NO INTERVALS NO-EXTENSION.

*Beachte: AND-Verknüpfung in der WHERE-Klausel. Erst Spaltennamen der Tabelle, dann die unter SELECT-OPTIONS vereinbarten.
SELECT PGMID OBJECT OBJ_NAME SRCSYSTEM AUTHOR DEVCLASS FROM TADIR
INTO CORRESPONDING FIELDS OF it_tadir
WHERE PGMID IN ProgID
AND OBJECT IN Objekt
AND OBJ_NAME IN Ob_Name
ORDER BY PGMID OBJECT OBJ_NAME.
WRITE:/ it_tadir-PGMID LEFT-JUSTIFIED, it_tadir-OBJECT LEFT-JUSTIFIED, it_tadir-OBJ_NAME, it_tadir-SRCSYSTEM, it_tadir-AUTHOR, it_tadir-DEVCLASS.
SELECT OBJECT COUNT(*)
INTO (o_name, count)
FROM TADIR
GROUP BY OBJECT.
NEW-LINE.
WRITE:/ 'Summe: ', count.
ENDSELECT.
ENDSELECT.
IF sy-subrc <> 0.
WRITE:/ 'Keine Datensätze vorhanden'.
ENDIF.

Mein Ziel war es ja, dass nach jeder gruppe von objekten noch einmal in einer separaten Zeile die Anzahl der Datensätze, die zu diesem Objekt gehören, ausgegeben werden. die äußere Schleife gibt erst einmal sortiert nach PGMID, OBJECT und OBJ_NAME die Tabelle aus. Ich habe da irgendwo immer noch ein Brett vor dem Kopf. :/

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
hi!

Kann es sein, dass du auf der Suche nach einer Gruppenstufen-Verarbeitung bist?
Du möchtest ZUERST alle Objekte (OBJ_NAME) einer Art (OBJECT) ausgeben und im Anschluss eine Zeile mit der Anzahl der Objekte oder?

Code: Alles auswählen.

DATA: ld_count TYPE I.
SORT it_tadir.
CLEAR ld_count.
LOOP AT it_tadir ASSIGNING <ls_tadir>.
  AT NEW OBJECT.
    IF ld_count IS NOT INITIAL.
      NEW-LINE.
      WRITE: 'Anzahl', ld_count.
    ENDIF.
    CLEAR ld_count.
  ENDAT.
  ADD 1 TO ld_count.
  NEW-LINE.
  WRITE: <ls_tadir>-PGMID LEFT-JUSTIFIED, <ls_tadir>-OBJECT LEFT-JUSTIFIED, <ls_tadir>-OBJ_NAME, <ls_tadir>-SRCSYSTEM, <ls_tadir>-AUTHOR, <ls_tadir>-DEVCLASS.
ENDLOOP.
IF ld_count IS NOT INITIAL.
  NEW-LINE.
  WRITE: 'Anzahl', ld_count.
ENDIF.
Wenn du mehr als ein Feld für die Gruppenverarbeitung brauchst, musst du eine Variable von Typ der Tabellenstruktur verwenden und bei jedem Schleifendurchlauf vergleichen. Ungefähr so:

Code: Alles auswählen.

LOOP AT it_tadir ASSIGNING <ls_tadir>.
  IF ls_tadir-PGMID NE <ls_tadir>-pgmid OR ls_tadir-OBJECT NE <ls_tadir>-OBJECT.
    ...
  ENDIF.
  ls_tadir = <ls_tadir>.
  ...
ENDLOOP.
lg ADT.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
Tut mir leid, ich weiss nicht ob man das so nennt :/

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
ok, ja! hehe... Ich mit meinen Fremdwörter! Ich versuch immer allen damit zu imprägnieren :P

Aber, ist es das was du gesucht hast?
a-dead-trousers hat geschrieben:Du möchtest ZUERST alle Objekte (OBJ_NAME) einer Art (OBJECT) ausgeben und im Anschluss eine Zeile mit der Anzahl der Objekte oder?
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
Also es ist teilweise richtig, glaube ich. Ich möchte die Spalten PGMID, OBJECT, OBJ_NAME, SRCSYSTEM, AUTHOR und DEVCLASS zunächst für eine ART (OBJECT) ausgeben lassen und danach die Anzahl der Datensätze, die da zuvor ausgegeben worden sind. Mein Gedanke eben war evtl mit Array-Fetch alle Datensätze einer Objektart jetzt erst einmal in eine interne Tabelle zu schaufeln und dann die Anzahl der Datensätze dort zählen zu lassen. Nur dann hab ich wieder das Problem, dass ich nicht weiss, wie ich dann den Schritt zur nächsten Objektart vollführe. Das Ganze müsste ja auch irgendwie in einer Art Schleife hängen und immer einen Schritt zur nächsten Objektart weitergehen. Aber wie das Ganze? :/

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
okay!

Ist genau das was ich oben bereits gepostet hab. Also entweder AT .... END AT oder das ganze mit der eigenen Struktur, wenn du mehrere Felder prüfen musst.

Als erstes selektierst du ALLE Daten aus der Datenbank.
Dann Sortieren (Bitte mit SORT in ABAP und NICHT mit ORDER BY auf der Datenbank --> Performance)
Zählvariable rücksetzten.
Dann LOOP über alle Datensätze.
Wobei bei jedem Beginn (AT NEW) bzw. jeder Änderung der gewünschten Felder der Struktur das Ergebnis der letzten Zählung ausgegeben wird und die Zählung wieder von neuem beginnt.
Das IF bewirkt, dass beim allerersten Durchlauf NICHTS für die Zählung ausgegeben wird.
Dann werden alle Zeilen ausgegeben und der Zähler um 1 erhöht.
Am Schluss musst du noch das Ergebnis der noch laufenden Zählung ausgeben.

Dieses Coding ist jetzt nichts spezielles was es nur in ABAP gibt und kann eigenlich auf jede andere Programmiersprache angewendet werden.
Hierbei handelt es sich um eine gruppierte Ausgabe von Daten

Bei jedem Beginn einer Gruppe kannst du noch den Titel der Gruppe (ls-tdir-OBJECT) und vlt. noch ein paar Leerzeilen ausgeben lassen, dann ist es obtisch noch besser getrennt.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SELECT-Abfrage bei der DB-Tabelle TADIR

Beitrag von cyb1982 (ForumUser / 18 / 3 / 0 ) »
Hi,

nach viel zu langer Zeit melde ich mich dann doch noch mal. Leider habe ich in der Zwischenzeit immer wieder was anderes noch zutun gehabt, so dass ich nur bedingt mich weiter mit der Angelegenheit weiter beschäftigen konnte. Ich habe meine vorherigen versuche so mehr oder weniger über den Haufen geworfen und habe noch einmal neu angefangen um die Materie vielleicht dabei besser verstehen zu können. Aktuell hänge ich (hoffentlich) nur noch an dem Teil mit dem Counter fest. Mein Code sieht momentan so aus:

Code: Alles auswählen.

REPORT  Z00_LOOPSPIEL3.

*OBJECT deswegen am Ende, da es Gruppenschlüssel ist und sonst alle Felder rechts von OBJECT zeichenartig behandelt werden und nur als **** ausgegeben werden.
DATA: BEGIN OF line,
        PGMID TYPE TADIR-PGMID,
        OBJ_NAME TYPE TADIR-OBJ_NAME,
        SRCSYSTEM TYPE TADIR-SRCSYSTEM,
        AUTHOR TYPE TADIR-AUTHOR,
        DEVCLASS TYPE TADIR-DEVCLASS,
        OBJECT TYPE TADIR-OBJECT,
      END OF line,

      itab LIKE STANDARD TABLE OF line,
      temp(20) TYPE c,
      count TYPE i VALUE 0.

SELECT PGMID OBJECT OBJ_NAME SRCSYSTEM AUTHOR DEVCLASS FROM TADIR
  INTO CORRESPONDING FIELDS OF TABLE itab.

*Daten korrekt übertragen
*LOOP AT itab INTO line.
*  WRITE:/ line-PGMID.
*ENDLOOP.

SORT itab BY OBJ_NAME.


*LOOP AT itab INTO line.
*  WRITE:/ line-PGMID, line-OBJECT, line-OBJ_NAME, line-SRCSYSTEM, line-AUTHOR, line-DEVCLASS.
*ENDLOOP.

LOOP AT itab INTO line.
*  CLEAR count.
  AT FIRST.
    WRITE:/ 'Start'.
    ULINE.
    WRITE:/ 'PGMID', 'Object', 'Obj_Name', 'SRCSYSTEM', 'AUTHOR', 'DEVCLASS'.
  ENDAT.
  AT NEW OBJECT.
    WRITE:/ line-PGMID, line-OBJECT, line-OBJ_NAME, line-SRCSYSTEM, line-AUTHOR, line-DEVCLASS.
    count = count + 1.
  ENDAT.
*  WRITE:/ 'Anzahl: ', count.
*  WRITE:/ 'test: ', SY-TABIX.
ENDLOOP.

*WRITE:/ 'test: ', count.
Ich muss dabei gestehen. Ich hatte auch schon andere kleine Programme wo mir der Counter dann pro Datensatz einen Wert um die Ohren geschmissen hatte und nur bei dem ersten Objekttypen (in dem Fall waren es als Beispiel Nachnamen gewesen) mir eine Gesamtzahl ausgegeben hatte.
Es sah sehr kryptisch aus.
Zur Erläuterung, warum ich in der internen Tabelle OBJECT an das Ende gesetzt habe:
Da ich gerne die Werte alle ordentlich anzeigen lassen möchte und sonst nur alle Werte die optisch rechts von der Spalte OBJECT stehen als Sternchen ausgegeben werden, habe ich diese "Ordnung" gewählt und lasse es hinterher bei der grafischen Ausgabe dann wieder in korrekter Reihenfolge ausgeben. Man kann anhand der auskommentierten Zeilen sehen, dass ich mit verschiedenen Denkansätzen an den neu überarbeiteten Code ran gegangen bin.
Es wäre wirklich sehr schön, wenn mir jemand vielleicht den (hoffentlich) finalen Denkanreiz geben könnte.

Mit freundlichem Gruß,

cyb1982

Seite 1 von 1

Vergleichbare Themen

2
Antw.
3440
Views
SELECT - Options & SELECT Abfrage
von Mavrix » 14.05.2007 08:41 • Verfasst in ABAP® für Anfänger
2
Antw.
1668
Views
select abfrage
von anki_86 » 13.06.2007 09:51 • Verfasst in ABAP® für Anfänger
9
Antw.
3579
Views
spezielle select-abfrage
von TobiB » 30.11.2007 16:29 • Verfasst in ABAP® Core
3
Antw.
2765
Views
Select Abfrage - For all Entries
von Cargo2 » 09.12.2016 10:56 • Verfasst in ABAP® Core
5
Antw.
2406
Views
Select Abfrage mit Ausschlusskriterien
von tmxx » 01.04.2008 10:34 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor einer Stunde von Patrick1982 gelöst 5 / 57
alv_grid aktualisieren
vor 6 Stunden von Egzon gelöst 4 / 82

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

SELECT CHAR16 in CHAR12-Feld
vor einer Stunde von Patrick1982 gelöst 5 / 57
alv_grid aktualisieren
vor 6 Stunden von Egzon gelöst 4 / 82

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170