Report einer Ligatabelle

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

Report einer Ligatabelle

Beitrag von kami123 (ForumUser / 5 / 1 / 0 ) »
Hallo allerseits,

abap ist für mich ein komplett neues themengebiet, wo ich meine ersten erfahrungen machen möchte.

Ziel ist ist eine Bundesligatabelle über eine dynamische Oberfläche auszugeben.

Zunächst habe ich eine Tabelle mit den ganzen Vereinen erstellt. Für die Generierung eines Spieltages gibt es eine Tabelle ZSPIEL wo alle einzelnen Spiele enthalten sind mit der Angabe der Spieltagnummer. zu den Tabellenfelder gehören Der Heim & Auswärtsverein mit den Heim & Auswärtstoren. Anhand der Tordifferenz soll ermittelt werden, ob der Heim oder Gastverein gewonnen hat oder ein Unentschieden erzielt wurde.

Nun erstelle ich ein Report der dann die komplette Tabelle anzeigen soll. Ich habe im Report eine Interne Tabelle erstellt mit den Daten von der Tabelle ZSPIEL. Ausserdem habe ich über den Data Dictionary ein Strukturtyp entwickelt. Ich weiss nun nicht wie ich aus den vorhandenen Daten für jedem Verein einen algorithmus entwickle der die einzelnen Vereine (Heim / Gastverein) aus den Datensatz rausliest , die Punkte berechnen lässt und mit der erstellten Struktur einen Report erstellt.

Ich würde mich über par kleine Tips freuen

Gruß

kami

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


Re: Report einer Ligatabelle

Beitrag von Ratazong (Specialist / 144 / 1 / 14 ) »
Du baust dir eine interne Tabelle mit allen teams auf. dann loopst du über die, und für jedes team loopst du über die spieltage, bei denen heimteam = team oder auswärtsteam = team.
Dann vergleichst Du die Einträge bei den toren und ermittelst daraus die Punkte, diese kannst du dann immer auf deine Tabellenzeile aufsummieren.
Am Ende solltest du dir dann noch die tordifferenz bei jedem verein ermitteln, und anschließend diese tabelle nach punkte absteigend tordifferenz absteigend, tore absteigend sortieren.

Gruß

Rata

Folgende Benutzer bedankten sich beim Autor Ratazong für den Beitrag:
kami123


Re: Report einer Ligatabelle

Beitrag von kami123 (ForumUser / 5 / 1 / 0 ) »
erstmal vielen dank für die Hilfe,

ich hab nun erstmal eine verschachtelte schleife, die über die vereine und über die spiele geht. Den Verein hab ich nun in einer variable initialisiert , wo ich dann die vergleiche machen werde. Nun habe ich bei der Berechnung der punkte einen normalen if vergleich dass wenn das heimteam mehr tore als das auswaertsteam schiesst die 3punkte zugewiesen bekommt. ich hab nun zwar jetzt den verein in einer variable initialisiert.. müsste dann trotzdem immer wieder den vergleich machen, ob es sich um den heim oder auswaertsverein handelt. Habe eine Tabellenstruktur definiert für die Bundesligatabelle definiert. für die summierung der punkte und tore bin ich auf die COLLECT funktion gestossen, die ich in der loop sicherlich anwenden kann. ich hab hier den quellcode vllt. versteht ihr mein problem :).

Code: Alles auswählen.

REPORT  zbliga1.

DATA:
      wa_bl_tab   LIKE zbligatabstr,
      it_bl_tab   TYPE TABLE OF zbligatabstr,
      wa_spiele   LIKE zspiel,
      it_spiele   TYPE TABLE OF zspiel,
      wa_vereine  LIKE zbligaverein,
      it_vereine  TYPE TABLE OF zbligaverein,
      verein      TYPE zbligaverein-vereinskuerzel.

PARAMETERS:
       pa_stag TYPE zspiel-spieltagnr.


START-OF-SELECTION.

  SELECT * FROM zspiel
    INTO TABLE it_spiele
    WHERE spieltagnr <= pa_stag.

  SELECT * FROM zbligaverein
    INTO TABLE it_vereine.

  LOOP AT it_vereine INTO wa_vereine.
    verein = wa_vereine-vereinskuerzel.
    IF verein = wa_spiele-heimteam OR
       verein = wa_spiele-auswaertsteam.
      LOOP AT it_spiele INTO wa_spiele.
        IF wa_spiele-toreheimteam = wa_spiele-toreauswteam.
          wa_bl_tab-verein = verein.
          wa_bl_tab-punkte = 1.
        ELSE.
          IF wa_spiele-toreheimteam < wa_spiele-toreauswteam.
            wa_bl_tab-verein = verein.
            wa_bl_tab-punkte = 0.
          ELSE.
            wa_bl_tab-verein = wa_vereine-vereinskuerzel.
            wa_bl_tab-punkte = 3.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDLOOP.
es sind mir irgendwie zu viel if abfragen das macht mir ein ungutes gefühl :P

mfg

kami

Re: Report einer Ligatabelle

Beitrag von Ratazong (Specialist / 144 / 1 / 14 ) »
SIeht doch schon mal gar nicht schlecht aus, sind nur noch paar kleine Fehler drin. Den Loop über die einzelnen Teams kann man sich aber auch schenken. Und ein paar Ideen, was man noch einbauen kann.

Code: Alles auswählen.

REPORT  zbliga1.
*...
START-OF-SELECTION.

  SELECT * FROM zspiel
    INTO TABLE it_spiele
    WHERE spieltagnr <= pa_stag.

  LOOP AT it_spiele INTO wa_spiele.
    clear wa_bl_tab.
    wa_bl_tab-verein = wa_spiele-heimteam.
    if wa_spiele-toreheimteam > wa_spiele-toreauswteam.
      wa_bl_tab-punkte = 3.
* ADD 1 to SIEGE
    elseif wa_spiele-toreheimteam = wa_spiele-toreauswteam.
      wa_bl_tab-punkte = 1.
* ADD 1 to UNENTSCHIEDEN
    else.
* ADD 1 to NIEDERLAGEN
    endif.
* ADD heimtore zu TOREPLUS
* ADD Auswartstore zu TOREMINUS
    collect wa_bl_tab.
* Das gleiche noch für Auswärtsmannschaften
  ENDLOOP.
Gruß

Rata

Re: Report einer Ligatabelle

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hallo kami,

ich hab eher ein ungutes Gefühl, weil du auf wa_spiele zugreifst, noch ehe du es durchlooped hast. :D
Versuch mal so (ungetestet), kann man dann auch noch weiter optimieren:

Code: Alles auswählen.

LOOP AT it_vereine INTO wa_vereine.
    verein = wa_vereine-vereinskuerzel.
       LOOP AT it_spiele INTO wa_spiele
        WHERE heimteam         = verein. 
       IF wa_spiele-toreheimteam = wa_spiele-toreauswteam.
          wa_bl_tab-verein = verein.
          wa_bl_tab-punkte = 1.
        ELSEIF wa_spiele-toreheimteam < wa_spiele-toreauswteam.
            wa_bl_tab-verein = verein.
            wa_bl_tab-punkte = 0.
        ELSE.
            wa_bl_tab-verein = wa_vereine-vereinskuerzel.
            wa_bl_tab-punkte = 3.
        ENDIF.
      ENDLOOP.
   ENDLOOP.
Auswärtsteam müsstest du noch gesondert betrachten bzw. verbasteln.

Re: Report einer Ligatabelle

Beitrag von kami123 (ForumUser / 5 / 1 / 0 ) »
moin,

vielen dank für die wertvollen antworten,

ich hab es jetzt soweit angepasst. Beim Collect Befehl krieg ich aber die fehlermeldung, dass wa_bl_tab keine Tabelle mit kopfzeile ist :!: . Habe zbligatabstr als Strukturtypen definiert.

Re: Report einer Ligatabelle

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hi kami,

Code: Alles auswählen.

COLLECT  wa_bl_tab INTO it_bl_tab.

Re: Report einer Ligatabelle

Beitrag von kami123 (ForumUser / 5 / 1 / 0 ) »
so ich habe nun das problem dass ich doppelte datensätze bekomme, weil ich eben 2x loope (heim & auswaetsteam)

wenn ich eine per write ausgebe dann werden die spiele überschreiben.

Code: Alles auswählen.

REPORT  zbliga1.

DATA:
      wa_bl_tab   LIKE zbligatabstr,
      it_bl_tab   TYPE TABLE OF zbligatabstr,
      wa_spiele   LIKE zspiel,
      it_spiele   TYPE TABLE OF zspiel,
      wa_vereine  LIKE zbligaverein,
      it_vereine  TYPE TABLE OF zbligaverein,
      verein      TYPE zbligaverein-vereinskuerzel.

PARAMETERS:
       pa_stag TYPE zspiel-spieltagnr.


START-OF-SELECTION.

  SELECT * FROM zspiel
    INTO TABLE it_spiele
    WHERE spieltagnr <= pa_stag.

  SELECT * FROM zbligaverein
    INTO TABLE it_vereine.

  LOOP AT it_vereine INTO wa_vereine.
    verein = wa_vereine-vereinskuerzel.
    LOOP AT it_spiele INTO wa_spiele
     WHERE heimteam = verein.
      IF wa_spiele-toreheimteam = wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreheimteam.
        wa_bl_tab-torebekommen = wa_spiele-toreauswteam.
        wa_bl_tab-punkte = 1.
      ELSEIF wa_spiele-toreheimteam < wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreheimteam.
        wa_bl_tab-torebekommen = wa_spiele-toreauswteam.
        wa_bl_tab-punkte = 0.
      ELSE.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreheimteam.
        wa_bl_tab-torebekommen = wa_spiele-toreauswteam.
        wa_bl_tab-punkte = 3.
      ENDIF.

    ENDLOOP.
    LOOP AT it_spiele INTO wa_spiele
     WHERE auswaertsteam = verein.
      IF wa_spiele-toreheimteam = wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreauswteam.
        wa_bl_tab-torebekommen = wa_spiele-toreheimteam.
        wa_bl_tab-punkte = 1.
      ELSEIF wa_spiele-toreheimteam < wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreauswteam.
        wa_bl_tab-torebekommen = wa_spiele-toreheimteam.
        wa_bl_tab-punkte = 3.
      ELSE.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreauswteam.
        wa_bl_tab-torebekommen = wa_spiele-toreheimteam.
        wa_bl_tab-punkte = 0.
      ENDIF.

    ENDLOOP.

    COLLECT  wa_bl_tab INTO it_bl_tab.
**   loop at it_bl_tab into wa_bl_tab.

    WRITE: / wa_bl_tab-verein,
             wa_bl_tab-toregeschossen,
             wa_bl_tab-torebekommen,
             wa_bl_tab-punkte.
**     endloop.
  ENDLOOP.

ich müsste die tabelle dann nach punkten sortieren das geht mit dem sort befehl. ich kriegs aber nicht hin die internetabelle ohne die reduntaten daten auszugeben. in meine tabellenstruktur hab ich noch das attribut position , wo der tabellenrang ausgegeben wird ich denke mal da müsste ich einfach durch die sortierte tabelle aufzählend reinloopen.

gruß

kami

Re: Report einer Ligatabelle

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hi kami,

das COLLECT muss innerhalb der einzelnen Loops erfolgen. Sonst übreschreibst du dir jedesmal dein wa_bl_tab und collectest nur den letzten.
Eventuelle Duplikate kannst du mit DELETE ADJACENT DUPLICATES FROM it_bl_itab COMPARING felder. entfernen.

Re: Report einer Ligatabelle

Beitrag von Ratazong (Specialist / 144 / 1 / 14 ) »
kami123 hat geschrieben:so ich habe nun das problem dass ich doppelte datensätze bekomme, weil ich eben 2x loope (heim & auswaetsteam)

wenn ich eine per write ausgebe dann werden die spiele überschreiben.

Code: Alles auswählen.

REPORT  zbliga1.

DATA:
      wa_bl_tab   LIKE zbligatabstr,
      it_bl_tab   TYPE TABLE OF zbligatabstr,
      wa_spiele   LIKE zspiel,
      it_spiele   TYPE TABLE OF zspiel,
      wa_vereine  LIKE zbligaverein,
      it_vereine  TYPE TABLE OF zbligaverein,
      verein      TYPE zbligaverein-vereinskuerzel.

PARAMETERS:
       pa_stag TYPE zspiel-spieltagnr.


START-OF-SELECTION.

  SELECT * FROM zspiel
    INTO TABLE it_spiele
    WHERE spieltagnr <= pa_stag.

  SELECT * FROM zbligaverein
    INTO TABLE it_vereine.

  LOOP AT it_vereine INTO wa_vereine.
    verein = wa_vereine-vereinskuerzel.
    LOOP AT it_spiele INTO wa_spiele
     WHERE heimteam = verein.
      IF wa_spiele-toreheimteam = wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreheimteam.
        wa_bl_tab-torebekommen = wa_spiele-toreauswteam.
        wa_bl_tab-punkte = 1.
      ELSEIF wa_spiele-toreheimteam < wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreheimteam.
        wa_bl_tab-torebekommen = wa_spiele-toreauswteam.
        wa_bl_tab-punkte = 0.
      ELSE.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreheimteam.
        wa_bl_tab-torebekommen = wa_spiele-toreauswteam.
        wa_bl_tab-punkte = 3.
      ENDIF.

    ENDLOOP.
    LOOP AT it_spiele INTO wa_spiele
     WHERE auswaertsteam = verein.
      IF wa_spiele-toreheimteam = wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreauswteam.
        wa_bl_tab-torebekommen = wa_spiele-toreheimteam.
        wa_bl_tab-punkte = 1.
      ELSEIF wa_spiele-toreheimteam < wa_spiele-toreauswteam.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreauswteam.
        wa_bl_tab-torebekommen = wa_spiele-toreheimteam.
        wa_bl_tab-punkte = 3.
      ELSE.
        wa_bl_tab-verein = verein.
        wa_bl_tab-toregeschossen = wa_spiele-toreauswteam.
        wa_bl_tab-torebekommen = wa_spiele-toreheimteam.
        wa_bl_tab-punkte = 0.
      ENDIF.

    ENDLOOP.

    COLLECT  wa_bl_tab INTO it_bl_tab.
**   loop at it_bl_tab into wa_bl_tab.

    WRITE: / wa_bl_tab-verein,
             wa_bl_tab-toregeschossen,
             wa_bl_tab-torebekommen,
             wa_bl_tab-punkte.
**     endloop.
  ENDLOOP.

ich müsste die tabelle dann nach punkten sortieren das geht mit dem sort befehl. ich kriegs aber nicht hin die internetabelle ohne die reduntaten daten auszugeben. in meine tabellenstruktur hab ich noch das attribut position , wo der tabellenrang ausgegeben wird ich denke mal da müsste ich einfach durch die sortierte tabelle aufzählend reinloopen.

gruß

kami
Das COLLECT gehört jeweils vor das ENDLOOP (AT SPIELE). Dann passt das schon. Und der loop über IT_BL_TAB gehört hinter den loop über IT_VEREINE.

Gruß

Rata

Seite 1 von 1

Vergleichbare Themen

1
Antw.
6460
Views
Report von einem anderen Report als Hintergrundjob einplanen
von kbit100 » 04.01.2016 09:46 • Verfasst in ABAP® für Anfänger
19
Antw.
12115
Views
Feedback-->Aufruf z-report ein SAP Standard Report
von c oco » 06.02.2013 16:55 • Verfasst in ABAP® für Anfänger
0
Antw.
2415
Views
Nutzung RRI (Report-Report-Schnittstelle) aus ALV-Grid
von donny » 22.11.2007 11:17 • Verfasst in ABAP® Core
22
Antw.
9796
Views
interne Tabelle übergeben von Report zu Report
von cuncon » 26.10.2017 12:27 • Verfasst in ABAP® für Anfänger
0
Antw.
4400
Views
Report aus Report-Painter Bericht aufrufen
von MStumm » 15.12.2006 12:45 • Verfasst in ABAP® Core

Über diesen Beitrag


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

Aktuelle Forenbeiträge

BAPI zur ABSO?
vor 6 Tagen von DeathAndPain 2 / 949
Materialstammerweiterung: Neuer Reiter
vor 2 Wochen von DeathAndPain gelöst 4 / 1632
Ermittlung der Arbeitstage (Mosid)
vor 3 Wochen von Radinator 11 / 47301
LSMW-Problem
vor 4 Wochen von DeathAndPain gelöst 6 / 5197

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

BAPI zur ABSO?
vor 6 Tagen von DeathAndPain 2 / 949
Materialstammerweiterung: Neuer Reiter
vor 2 Wochen von DeathAndPain gelöst 4 / 1632
Ermittlung der Arbeitstage (Mosid)
vor 3 Wochen von Radinator 11 / 47301
LSMW-Problem
vor 4 Wochen von DeathAndPain gelöst 6 / 5197