Vorgänger und Nachfolger einer Spalte

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

Vorgänger und Nachfolger einer Spalte

Beitrag von Bjuti (ForumUser / 45 / 14 / 0 ) »
Huhu,

ich würde gerne, wenn ein Feld leer ist, den Mittelwert aus dem Vorgänger und dem Nachfolger dort reinschreiben falls Vorgänger und Nachfolger vorhanden sind.

Tabelle:
2.5
3.8
X
4.4

Nun soll das X durch den Mittelwert vom Vorgänger = 3.8 und Nachfolger = 4.4 ersetzt werden

(3.8 + 4.4)/2 = 4.1 = X

VG Bjuti

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


Re: Vorgänger und Nachfolger einer Spalte

Beitrag von zzcpak (Expert / 673 / 5 / 68 ) »
eigentlich haben vorgekaute Lösungen keinen großen Lerneffekt. Hast du dir denn schon mal überlegt, wie man die Sache angehen könnte?

Re: Vorgänger und Nachfolger einer Spalte

Beitrag von Bjuti (ForumUser / 45 / 14 / 0 ) »
Achso jub, dass habe ich natürlich.

Ich dachte in erster Linie an einem LOOP.

Code: Alles auswählen.

LOOP AT Tabelle ASSIGNING <Tabelle> WHERE Spalte-Wert IS INITIAL.
Spalte-Wert = (Spalte-Wert_VORGÄNGER + Spalte-Wert_NACHFOLGER) / 2.
ENDLOOP.
So die Richtung dachte ich. Nur weiß ich nicht wie ich den Vorgänger so bekommen kann. Vielleicht einen weiteren LOOP in der LOOP? Und dann die Werte immer rausschreiben?

Hmmm, ich überlege aber mal weiter. :)

Re: Vorgänger und Nachfolger einer Spalte

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
EDIT: :oops:
Hab die Frage falsch interprtiert. War ein Blödsinn.
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: Vorgänger und Nachfolger einer Spalte

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Guten Morgen,

also entweder du weißt die Spalte (Spaltenname), dann weißt du ja auch, welche Spalte vorher und welche danach kommt und kannst direkt darauf zugreifen. Wenn du nur nicht weißt, wie die Spaltennamen davor und danach heißen, kannst du dir auch die Struktur der itab/des wa auslesen und darin nachschauen. Falls du pro Zeile einfach jedes Feld prüfen willst, ob dieses leer ist und ggf. den Mittelwert aus Vorgänger und Nachfolger reinschreiben willst würde ich dir eine do-Schleife und ein ASSIGN COMPONENT OF STRUCTURE empfehlen (dazu müsstest du dir aber zuerst einmal Feldsymbole ansehen, was aber generell nie schaden kann:P)

Gruß
Pyro

Re: Vorgänger und Nachfolger einer Spalte

Beitrag von Bjuti (ForumUser / 45 / 14 / 0 ) »
Huhu,

ich habe mir nun eine halbwegs annehmbare Lösung erarbeitet. Ich bin mir aber sicher, dass es an der ein oder anderen Stelle eleganter umgesetzt werden kann.
Bitte schaut es euch. Danke :)

Code: Alles auswählen.

itab_help = itab.
LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
   COUNTER = sy-tabix.
      LOOP AT itab_help ASSIGNING <g_itab_help>.
       IF sy-tabix = COUNTER - 1.
         PREVIOUS = <g_itab_help>-WERT. "Vorgänger
         EXIT.
       ENDIF.
      ENDLOOP.
      LOOP AT itab_help ASSIGNING <g_itab_help>.
       IF sy-tabix = COUNTER + 1.
         FOLLOWING = <g_itab_help>-WERT. "Nachfolger
         EXIT.
       ENDIF.
      ENDLOOP.
    IF PREVIOUS <> '0.00' AND FOLLOWING <> '0.00'.
      <g_itab>-WERT = ( PREVIOUS + FOLLOWING ) / 2.
      <g_itab>-WERT_GESCHAETZT = 'X'.
    ELSEIF PREVIOUS = '0.00' AND FOLLOWING <> '0.00'.
      <g_itab>-WERT = FOLLOWING.
      <g_itab>-WERT_GESCHAETZT = 'X'.
    ELSEIF PREVIOUS <> '0.00' AND FOLLOWING = '0.00'.
      <g_itab>-WERT = PREVIOUS.
      <g_itab>-WERT_GESCHAETZT = 'X'.
    ELSEIF PREVIOUS = '0.00' AND FOLLOWING = '0.00'.
      <g_itab>-WERT = ''.
      <g_itab>-WERT_GESCHAETZT = 'E'. "ERROR, ist aber ok
    ENDIF.
   MODIFY itab_help FROM <g_itab> INDEX sy-tabix TRANSPORTING WERT.
 CLEAR PREVIOUS.
 CLEAR FOLLOWING.
 UNASSIGN <g_itab_help>.
ENDLOOP.
UNASSIGN <g_itab>.

Re: Vorgänger und Nachfolger einer Spalte

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Bjuti hat geschrieben:es an der ein oder anderen Stelle eleganter umgesetzt werden kann.
Anstatt dem LOOP für den Vorgänger/Nachfolger solltest du diese mittels READ TABLE über den errechneten INDEX lesen.
Spart Laufzeit und macht das Coding lesbarer.

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

Gruß Hendrik

Re: Vorgänger und Nachfolger einer Spalte

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Ach ZEILE, nicht SPALTE:D... da hab ich wohl falsch gelesen, dann war das, was ich geschrieben habe, dafür nicht sonderlich hilfreich....

Wie JHM schon sagte brauchst du die ganzen LOOPs nicht... du kannst theoretisch

Code: Alles auswählen.

LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
   COUNTER = sy-tabix.
      LOOP AT itab_help ASSIGNING <g_itab_help>.
       IF sy-tabix = COUNTER - 1.
         PREVIOUS = <g_itab_help>-WERT. "Vorgänger
         EXIT.
       ENDIF.
      ENDLOOP.
      LOOP AT itab_help ASSIGNING <g_itab_help>.
       IF sy-tabix = COUNTER + 1.
         FOLLOWING = <g_itab_help>-WERT. "Nachfolger
         EXIT.
       ENDIF.
      ENDLOOP.
durch das ersetzen:

Code: Alles auswählen.

LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
   counter = sy-tabix - 1.
   READ TABLE itab ASSIGNING <g_itab_help_prev> INDEX counter.
   counter = sy-tabix + 2.
   READ TABLE itab ASSIGNING <g_itab_help_next> INDEX counter.
 
und dann einfach über

Code: Alles auswählen.

IF PREVIOUS <> '0.00' AND FOLLOWING <> '0.00'.
      <g_itab>-WERT = ( <g_itab_help_prev>-wert + <g_itab_help_next>-wert ) / 2.
den Wert setzen/berechnen

Folgende Benutzer bedankten sich beim Autor Pyro für den Beitrag:
Bjuti


Re: Vorgänger und Nachfolger einer Spalte

Beitrag von Bjuti (ForumUser / 45 / 14 / 0 ) »
Herzlichen Dank Euch.

Ich habe das nun wie folgt umgesetzt:

Code: Alles auswählen.

  LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
      counter2 = sy-tabix.
      IF sy-tabix = 1. "erster Eintrag der internen Tabelle
        counter1 = sy-tabix.
      ELSE.
        counter1 = sy-tabix - 1.
      ENDIF.
      READ TABLE itab ASSIGNING <g_itab_prev> INDEX counter1. "Vorgänger

      IF counter2 = 7. "letzter Eintrag der internen Tabelle
        counter1 = counter2.
      ELSE.
        counter1 = counter2 + 1.
      ENDIF.
      READ TABLE itab ASSIGNING <g_itab_next> INDEX counter1. "Nachfolger

      IF <g_itab_prev>-WERT <> '0.00' AND <g_itab_next>-WERT <> '0.00'.
        <g_itab>-WERT = ( <g_itab_prev>-WERT + <g_itab_next>-WERT ) / 2.
        <g_itab>-WERT_GESCHAETZT = 'X'.
      ELSEIF <g_itab_prev>-WERT = '0.00' AND <g_itab_next>-WERT <> '0.00'.
        <g_itab>-WERT = <g_itab_next>-WERT.
        <g_itab>-WERT_GESCHAETZT = 'X'.
      ELSEIF <g_itab_prev>-WERT <> '0.00' AND <g_itab_next>-WERT = '0.00'.
        <g_itab>-WERT = <g_itab_prev>-WERT.
        <g_itab>-WERT_GESCHAETZT = 'X'.
      ELSEIF <g_itab_prev>-WERT = '0.00' AND <g_itab_next>-WERT = '0.00'.
        <g_itab>-WERT = ''. 
        <g_itab>-WERT_GESCHAETZT = 'X'.
      ENDIF.

      UNASSIGN <g_itab_prev>.
      UNASSIGN <g_itab_next>.

  ENDLOOP.
  UNASSIGN <g_itab>.
Da ich weiß wieviele Einträge die interne Tabelle hat, kann ich diese direkt als Zahl angeben. Gibt es da vielleicht eine Möglichkeit das dynamischer zu machen. Sowas wie
Index = First und Index = Last?

Wäre ein CASE besser als die IF-Anweisung mit ELSEIF?

VG Bjuti

Re: Vorgänger und Nachfolger einer Spalte

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
sy-tleng oder lines( itab ).

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Bjuti

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: Vorgänger und Nachfolger einer Spalte

Beitrag von Bjuti (ForumUser / 45 / 14 / 0 ) »
a-dead-trousers hat geschrieben:sy-tleng oder lines( itab ).
Danke für den Hinweis. Für den letzten Eintrag konnte ich nun sy-tfill verwenden. Ich denke das ist nun dynamisch genug.

VG Bjuti

Seite 1 von 1

Vergleichbare Themen

6
Antw.
2143
Views
ALV - Zeile zum Vorgänger einfügen
von Nadine_2706 » 12.09.2011 10:58 • Verfasst in ABAP® für Anfänger
5
Antw.
1864
Views
alv mit vorgänger - zeile vergleichen
von Nadine_2706 » 02.09.2011 08:05 • Verfasst in ABAP® für Anfänger
7
Antw.
3082
Views
Spalte ausblenden
von robin1at » 02.02.2006 09:03 • Verfasst in ABAP® für Anfänger
1
Antw.
2834
Views
Spalte im ALV bestimmen
von Thorsten » 04.04.2005 09:42 • Verfasst in Tips + Tricks & FAQs
2
Antw.
2073
Views
Button in ALV Spalte
von Trulchen » 30.08.2013 11:14 • Verfasst in Web-Dynpro, BSP + BHTML

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 3 Stunden von black_adept gelöst 23 / 3568
User Exit EXIT_RQCPRM10_001
vor 3 Stunden von a-dead-trousers 2 / 182
Trennen Strasse und Hausnummer
vor 9 Stunden von payten 13 / 10483
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1240

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

Dialog-Container mit Toolbar/Status
vor 3 Stunden von black_adept gelöst 23 / 3568
User Exit EXIT_RQCPRM10_001
vor 3 Stunden von a-dead-trousers 2 / 182
Trennen Strasse und Hausnummer
vor 9 Stunden von payten 13 / 10483
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1240

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2790
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9370