Einträge zählen interne Tabelle


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

Moderatoren: Jan, Steff

Einträge zählen interne Tabelle

Beitragvon L0w-RiDer » 08.11.2018, 18:58

Hallo,

ich bin gerade an einem Programm dran, bei dem ich die gleichen Nummernfolgen in einer internen Tabelle zählen lassen möchte.

Also ich möchte wissen, wieviele Einträge habe ich in meiner Tabelle die die Ziffernfolge DE888677 haben z.B. und diesen Wert möchte ich dann in das entsprechende Feld rechts von der internen Tabelle schreiben. Z.B. die Ziffernfolge DE888677 kommt 50 mal vor in der internen Tabelle. Die Ziffernfolge DE777555 kommt 20 mal vor usw.

Die interne Tabelle habe ich vorher nach den Nummern sortieren lassen. Somit stehen nun gleiche Nummern in einer Folge.

Ich bin schon mal an einer Schleife dran, glaube aber dass das Ganze zu kompliziert ist und leider funktioniert es auch noch nicht ganz wie ich mir das vorstelle.

Also :

Code: Alles auswählen

Data: gt_itab type table of ty_tab
         gs_itab type ty_tab
        gt_merk type table of ty_tab
        gs_merk type ty_tab
        gt_ausgabe type table of ty_tab
       gs_ausgabe type ty_tab
       lv_anz type i.


Loop at gt_itab into gs_itab
        if sy-tabix = 1.
        gs_merk = gs_itab.
        lv_anz = 1.
        else.
        if gs_itab-wert = gs_merk-wert
        lv_anz = lv_anz + 1.
        else.
        gs_merk = gs_itab.
        gs_ausgabe-wert = gs_merk-wert.
        gs_ausgabe-anzahl = lv_anz.
        append gs_ausgabe to gt_ausgabe.
        endif.
        endif.

 


Leider funktioniert das Ganze so nicht, aber im Ansatz sollte es so richtig sein. Irgendwelche Verbesserungsvorschläge oder Ideen wie es anders gelöst werden könnte?

Vielen Dank im Voraus.

L0w-Rider
L0w-RiDer
ForumUser
 
Beiträge: 28
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

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

Re: Einträge zählen interne Tabelle

Beitragvon nickname8 » 08.11.2018, 19:54

Sowas?
Hab grad kein SAP-System zur Hand, aber in die Richtung sollte es gehen...

Code: Alles auswählen
types:
 beginn of ty_count,
  wert type string,
  count type i,
end of ty_count.  

data:
  lt_count  type hashed table of ty_count with unique key wert,
  lr_count  type reference of ty_count,
  ls_count  type ty_count.

sort gt_itab by wert.
LOOP AT gt_itab into gs_itab.
  read table  lt_count reference into lr_count with table key wert = gs_itab-wert.
  if sy-subrc ne 0.
    clear ls_count.
    ls_count-wert = gs_itab-wert.
    insert ls_count into table lt_count reference into lr_count.
  endif.
  lr_count->count = lr_count->count + 1.
endloop.
 


Oder ohne hashed table und dann mit einer struktur, in der man count immer hochzählt und nur beim ändern des wertes appended.
Zuletzt geändert von nickname8 am 09.11.2018, 12:27, insgesamt 1-mal geändert.
nickname8
ForumUser
 
Beiträge: 41
Registriert: 18.07.2015, 08:22
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon black_adept » 08.11.2018, 20:32

Doku lesen zu den Befehlen "AT NEW" und "SUM"
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 3074
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 522 mal
Ich bin: Freiberufler/in

Re: Einträge zählen interne Tabelle

Beitragvon mfromg » 09.11.2018, 05:18

Eine weitere elegante Möglichkeit bietet der Collect-Befehl.
Hier ein kleines Demo-Programm (es geht hier nicht um den Sinn, sondern um den Coollect-Befehl)

Code: Alles auswählen
types: begin of ty_spras,
         spras type spras,
         count type i,
       end of ty_spras.
types: ty_spras_tab type standard table of ty_spras.

data: ls_ty_spras type ty_spras.
data: lt_ty_spras type ty_spras_tab.
data: ls_006t type t006t.

select * from t006t into ls_006t.
  move ls_006t-spras to ls_ty_spras-spras.
  move 1             to ls_ty_spras-count.
  collect ls_ty_spras into lt_ty_spras.
endselect.
mfromg
ForumUser
 
Beiträge: 16
Registriert: 03.01.2017, 13:50
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon nickname8 » 09.11.2018, 08:44

IIIhhhh, Gruppenstufenwechsel und COLLECT. ;-)

Wenn du ein neues SAP Release hast, guck dir mal die GROUPING-Funktionalität von LOOPs an. Das ist eigentlich genau für sowas gebaut.

LG
nickname8
ForumUser
 
Beiträge: 41
Registriert: 18.07.2015, 08:22
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon L0w-RiDer » 09.11.2018, 10:14

"At end of" würde funktionieren, aber leider habe ich zwei Kriterien und da funktioniert es leider nicht, da das zweite Kriterium dann immer *** bekommt.

Gibt es sowas wie AT END OF auch mit zweit Kriterien??

Oder eine andere Möglichkeit.

Also ich möchte nach Ziffern DE224555 und Buchstabenfolge D22 sortieren.
L0w-RiDer
ForumUser
 
Beiträge: 28
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon deejey » 09.11.2018, 11:38

na das ist jetzt aber ziemlich gedengelt, da musst du eigene Sortfelder für alle Konstellationen bauen und nach denen sortieren
deejey
ForumUser
 
Beiträge: 84
Registriert: 31.07.2016, 11:20
Dank erhalten: 6 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon DeathAndPain » 09.11.2018, 12:19

Wenn Du kein Affentheater mit irgendwelchen Sonderfunktionen des LOOP-Befehls machen möchtest, dann geht durchaus auch Dein Ansatz, es "zu Fuß" aufzusummieren. Nur gefällt mir Dein Code nicht, da er viel zu umständlich ist, erkennbar auch an überflüssigen Feldern wie lv_anz. Kein Wunder, dass Du Dir damit eine (unnötige) Komplexität einhandelst, durch die der Code nicht fehlerfrei funktioniert.

Hier ist eine einfache Lösung in alter Syntax:

Code: Alles auswählen
Data: gt_itab type table of ty_tab,
        gs_itab type ty_tab,
      gs_merk type ty_tab,
      gt_ausgabe type table of ty_tab,
      gs_ausgabe type ty_tab.


clear gs_merk. " unter der Maßgabe, dass es keine Zeile in gt_itab mit initialem wert gibt
Loop at gt_itab into gs_itab
  if gs_itab-wert <> gs_merk-wert.

    if sy-tabix > 1.
      append gs_ausgabe to gt_ausgabe.
    endif.

    clear gs_ausgabe.
    gs_ausgabe-wert = gs_itab-wert.
  endif.

  add 1 to gs_ausgabe-anzahl.

endloop.
append gs_ausgabe to gt_ausgabe.

Sollte Dein SAP-Release schon 7.40 oder höher sein, dann sag das bitte immer dazu, da es dann schönere und modernere Syntaxformen gibt. (Die alte Syntax funktioniert da aber auch.)
DeathAndPain
Expert
 
Beiträge: 775
Registriert: 05.05.2006, 10:14
Dank erhalten: 173 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon a-dead-trousers » 09.11.2018, 12:29

L0w-RiDer hat geschrieben:"At end of" würde funktionieren, aber leider habe ich zwei Kriterien und da funktioniert es leider nicht, da das zweite Kriterium dann immer *** bekommt.
Gibt es sowas wie AT END OF auch mit zweit Kriterien??

Die "alten" Gruppenstufen funktionieren "von links nach rechts". Das heißt wenn man in der Struktur fünf Felder hat und mit AT das dritte Feld anspricht, werden auch Änderungen in den zwei Feldern links davon als Gruppenstufenwechsel erkannt.
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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3055
Registriert: 07.02.2011, 13:40
Dank erhalten: 756 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon L0w-RiDer » 09.11.2018, 13:40

okay, es passt jetzt :)
danke.
L0w-RiDer
ForumUser
 
Beiträge: 28
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon L0w-RiDer » 12.11.2018, 11:39

hmm wenn ich mit Loop gt_itab into gs_itab Group by wert.

Dann sortiert mir der Loop es automatisch, aber wie könnte ich nun die Gruppeneinträge zählen lassen?
L0w-RiDer
ForumUser
 
Beiträge: 28
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon a-dead-trousers » 12.11.2018, 11:41

L0w-RiDer hat geschrieben:hmm wenn ich mit Loop gt_itab into gs_itab Group by wert.

Dann sortiert mir der Loop es automatisch, aber wie könnte ich nun die Gruppeneinträge zählen lassen?

Schau dir mal den Zusatz GROUP SIZE bei LOOP AT ... GROUP BY an.
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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3055
Registriert: 07.02.2011, 13:40
Dank erhalten: 756 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon L0w-RiDer » 13.11.2018, 13:18

LOOP AT spfli_tab INTO wa
GROUP BY ( key1 = wa-carrid key2 = wa-airpfrom
index = GROUP INDEX size = GROUP SIZE )
WITHOUT MEMBERS
INTO DATA(keysplus).

So hab ich es nun gefunden.

ich Loope über meine interne Tabelle (spfli_tab ) in eine Struktur (wa) und dann gruppiere ich. Was meinen die hier bei diesem Beispiel mit key1 oder key2?? also die Spalten/Felder nach denen gruppiert werden soll?
L0w-RiDer
ForumUser
 
Beiträge: 28
Registriert: 26.10.2018, 09:52
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Einträge zählen interne Tabelle

Beitragvon a-dead-trousers » 13.11.2018, 13:47

L0w-RiDer hat geschrieben:LOOP AT spfli_tab INTO wa
GROUP BY ( key1 = wa-carrid key2 = wa-airpfrom
index = GROUP INDEX size = GROUP SIZE )
WITHOUT MEMBERS
INTO DATA(keysplus).

So hab ich es nun gefunden.

ich Loope über meine interne Tabelle (spfli_tab ) in eine Struktur (wa) und dann gruppiere ich. Was meinen die hier bei diesem Beispiel mit key1 oder key2?? also die Spalten/Felder nach denen gruppiert werden soll?

Die Felder "key1", "key2" usw. sind die Namen der Felder in der Struktur die die Gruppenstufe identifizieren. Mit "index" hat man einen Zähler die wievielte Gruppe gerade durchlaufen wird und mit "size" die Anzahl der Elemete in der Gruppe.
Umgelegt auf deine Tabelle im Ausgangspost:
Code: Alles auswählen
LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<ls_itab>)
  GROUP BY ( wert_gruppe = <ls_itab>-wert index = group index size = group size ) ASSIGNING FIELD-SYMBOL(<ls_itab_group>).
 
* Beispiele für die Verwendung
  WRITE <ls_itab_group>-wert_gruppe. "Der aktuelle Wert, entspricht gt_itab-wert.
  WRITE <ls_itab_group>-index. "Der aktuelle Index der Gruppe
  WRITE <ls_itab_group>-size. "Die anzahl der Einträge in der Gruppe
 
* Die "Anzahl" in das erste Tabellenfeld der ursprünglichen Tabelle schreiben
  LOOP AT GROUP <ls_itab_group> ASSIGNING FIELD-SYMBOL(<ls_itab_member>).
    <ls_itab_member>-anzahl = <ls_itab_group>-size.
    exit.
  ENDLOOP.
ENDLOOP.
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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3055
Registriert: 07.02.2011, 13:40
Dank erhalten: 756 mal
Ich bin: Entwickler/in


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

  Aktuelle Beiträge   
Java & Bildbearbeitung
vor 13 Stunden von Madredure 0 Antw.
Call Transaction WE20 mit Werteübergabe
vor 11 Stunden von ewx 1 Antw.
Vergleich Customizing Tabellen auf zwei Systemen
vor 13 Stunden von ewx 2 Antw.
Empfehlung Antiviren-Programm?
vor 14 Stunden von Madredure 2 Antw.
BADI im Customizing finden
Gestern von Romaniac 0 Antw.

  Ähnliche Beiträge beta
Einträge einer Tabelle zählen ...
17.09.2007, 09:19 von anonymizer2002 6 Antw.
verschiedene Werte zählen aus interne Tab
29.08.2005, 10:56 von zwiback 3 Antw.
Datensätze einer Tabelle zählen
15.12.2006, 11:08 von ICER 11 Antw.
In interner Tabelle Datensätze zählen?
06.06.2008, 16:04 von ewx 6 Antw.
Smartforms: Zahlen in der Tabelle nicht linksbündig
20.09.2007, 10:27 von TWP 1 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]