Laufvariable / Index Thema ist als GELÖST markiert

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

Laufvariable / Index

Beitrag von Lbyte (ForumUser / 18 / 0 / 0 ) »
Hallo zusammen,

ich habe mit der unten stehenden Tabelle folgendes Problem:

Ich habe die Tabelle so sortiert dass die Prozessketten mit ihren jeweiligen Unterprozessen gelistet werden. Nun möchte ich in der Spalte Index eine Laufvariable haben die mir die Nummer des jeweiligen Prozesses anzeigt und bei der nächsten Prozesskette wieder von vorne beginnt.
Beispiel wäre dass bei der Kette CFS_UPLOAD_D30 der Trigger den Index 1 bekommt, ODSACTIVAT bekommt die 2, DTP_LOAD die 3 usw. bei dem Trigger von RTF/INIT_P01 soll der Index dann wieder bei 1 anfangen.

Ich hab das so versucht, aber man sieht ja dass das Quatsch ist ;-)

Code: Alles auswählen.


SORT RESULT_PACKAGE  STABLE BY /bic/prz_be ASCENDING
                                   /bic/prz_eg ASCENDING.

    LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.

      IF lv_old ne <result_fields>-/BIC/PRZ_TN.

        lv_index = lv_index + 1.
        lv_old = <result_fields>-/BIC/PRZ_TN.

      ENDIF.

      <Result_Fields>-/BIC/PRZ_IN = lv_index.

    ENDLOOP.

Hat jemand ne Idee wie ich das hinbekomme?


Re: Laufvariable / Index

Beitrag von wreichelt (Expert / 833 / 20 / 142 ) »
Hallo,

schaue Dir mal
Loop ... AT New an. Da könnte die Variable auf eins gesetzt werden.
und beim nächsten Durchlauf um eins erhöht werden.

Gruß Wolfgang

Re: Laufvariable / Index

Beitrag von Lbyte (ForumUser / 18 / 0 / 0 ) »
Also ich will eigentlich ja gar nicht dass ein nächster Durchlauf stattfindet. Meine Idee ist, dass überprüft werden soll ob sich der technische Name geändert hat.
Ich speichere quasi den technischen Namen in einer Variable Name_old und setze den Zähler Index auf 1. Jetzt soll er die Liste runtergehen und solange PRZ_TN = Name_Old soll Index = Index + 1 ausgeführt werden. Wenn er dann bei der nächsten Kette ankommt und PRZ_TN ne Name_Old ist, soll der Index gecleared und erneut auf 1 gesetzt werden.

Wie krieg ich das in der Endroutine formuliert?

Re: Laufvariable / Index

Beitrag von a-dead-trousers (Top Expert / 3590 / 124 / 933 ) »
Der Teil mit "lv_index = lv_index + 1" gehört außerhalb der IF-Abfrage und stattdessen ein "CLEAR lv_index" dorthin.

Code: Alles auswählen.

IF lv_old ne <result_fields>-/BIC/PRZ_TN.
  CLEAR lv_index.
  lv_old = <result_fields>-/BIC/PRZ_TN.
ENDIF.
lv_index = lv_index + 1.
Damit beginnt bei jedem neuen Wert in "/BIC/PRZ_TN" die Zählung von neuem. Das ist doch was du willst, oder?

Der Vorschlag mit AT NEW von Wolfgang ist nur bedingt brauchbar, da AT NEW auch bei Feldänderungen "links" (in der Reihenfolge der Felder in der Struktur) vom Wert der verglichen werden soll anspringt. Solange also die Definition der Struktur nicht bekannt ist, ist das Verhalten von AT NEW nicht bestimmbar.

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.07
Basis: 7.40

Re: Laufvariable / Index

Beitrag von Lbyte (ForumUser / 18 / 0 / 0 ) »
Erstmal danke für eure Hilfe!

@Dead-Trousers

Richtig - ich möchte dass bei jeder neuen Prozesskette (also bei einer neuen Beschreibung in PRZ_TN) dass der Index wieder bei 1 anfängt und solange hochzählt bis alle Prozessschritte durch sind und wieder eine neue Kette kommt.

Ich finde deine Lösung auch nachvollziehbar aber nachdem ich deine Änderung übernommen habe, bleibt der Index nun in der kompletten Liste bei 2. Ich verstehe nicht warum.

Außerdem funktioniert die Sortierung nicht mehr. Als ich letzte Woche soweit alles fertig hatte, funktionierte zwar der Index zwar nicht, aber die Sortierung funktionierte so wie in der Liste auf dem Foto angezeigt. Jetzt sortiert er gar nicht mehr und ich muss es manuell über die Benutzeroberfläche sortieren.

Hat jemand ne Idee was ich falsch mache?

Hier nochmal der ganze Code meiner Endroutine:

Code: Alles auswählen.

  TYPES: BEGIN OF fieldtype,

             chain_id TYPE rspc_chain,
             txtlg    TYPE rstxtlg,

           END OF fieldtype.



    DATA:   it_tab    TYPE STANDARD TABLE OF fieldtype,
            wa_tab    TYPE fieldtype,
            lt_chaint TYPE rspc_t_chaint,
            wa_chaint TYPE rspcchaint,
            lv_old    TYPE /bic/oiprz_tn,
            lv_index  TYPE i.


    LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.

      wa_chaint-chain_id = <result_fields>-/bic/prz_tn.
      APPEND wa_chaint TO lt_chaint.

    ENDLOOP.




    IF RESULT_PACKAGE IS NOT INITIAL.

      SELECT chain_id
             txtlg
        FROM rspcchaint INTO CORRESPONDING FIELDS OF TABLE
             it_tab
             FOR ALL ENTRIES IN lt_chaint WHERE
             chain_id = lt_chaint-chain_id.

      IF sy-subrc = 0.
        SORT it_tab BY chain_id.
      ENDIF.

    ENDIF.


    LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.

      READ TABLE it_tab INTO wa_tab WITH KEY
      chain_id = <result_fields>-/bic/prz_tn BINARY SEARCH.

      IF sy-subrc = 0.
        <result_fields>-/bic/prz_be = wa_tab-txtlg.


      ENDIF.



    ENDLOOP.


    SORT RESULT_PACKAGE  STABLE BY /bic/prz_TN ASCENDING
                                   /bic/prz_eg ASCENDING.




    LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.

      lv_old =  <result_fields>-/bic/prz_tn.
      lv_index = 1.

      IF lv_old NE <result_fields>-/bic/prz_tn.

        CLEAR lv_index.
        lv_old = <result_fields>-/bic/prz_tn.

      ENDIF.

      lv_index = lv_index + 1.
      <result_fields>-/bic/prz_IN = lv_index.

    ENDLOOP.



    break initdev4.

Re: Laufvariable / Index

Beitrag von DeathAndPain (Top Expert / 1490 / 165 / 335 ) »
Du hast in Deinem LOOP zwei überflüssige Zeilen zu stehen, die mir wie Überbleibsel einer Testroutine vorkommen:

Code: Alles auswählen.

          lv_old =  <result_fields>-/bic/prz_tn.
          lv_index = 1.
Klar, wenn Du bei jedem LOOP-Durchlauf am Anfang lv_index = 1. sagst und am Ende des LOOPs dann lv_index = lv_index + 1. kommt, dann wird lv_index nach jedem LOOP-Durchlauf auf zwei stehen.

Die andere Zeile ist auch Quatsch. Die führt dazu, dass der nachfolgende IF niemals wahr werden wird.

Re: Laufvariable / Index

Beitrag von Lbyte (ForumUser / 18 / 0 / 0 ) »
Danke, ich hab noch etwas rumprobiert und es letztlich hiermit hinbekommen:

Code: Alles auswählen.

  LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.


      IF lv_old = <result_fields>-/bic/prz_tn.


        lv_index = lv_index + 1.
        <result_fields>-/bic/prz_IN = lv_index.


      ELSE.

        Clear lv_index.
        lv_old = <result_fields>-/bic/prz_tn.
        <result_fields>-/bic/prz_IN = lv_index.

      ENDIF.






    ENDLOOP.
Allerdings hab ich immer noch 2 Probleme:

1. Beginnt der Index jetzt immer bei 0 und ich hab ehrlich gesagt keine Idee wie ich ihn mit 1 initialisieren kann.
2. Weiterhin wird die Tabelle zu Anfang nicht so sortiert wie ich will bzw zumindest so nicht ausgegeben. Intern scheint die Sortierung zu funktionioeren da sonst der Index wohl nicht funktionieren würde aber ausgegeben wird die Tabelle in der Ursprungsform und erst wenn ich über die Sortieren-Funktion nach den zwei Spalten sortiere, wird mir die Tabelle wie gewünscht angezeigt. Ist es überhaupt möglich die Tabelle direkt bei der Ausgabe über einen DSO in der gewünschten Sortierung zu erhalten?

Re: Laufvariable / Index

Beitrag von Wann (ForumUser / 41 / 0 / 9 ) »
Na wenn Du die Anweisung

Code: Alles auswählen.

CLEAR lv_index.
verwendest, dann ist der Wert von lv_index danach 0 und den gibst Du an <result_fields>-/bic/prz_IN weiter.
Du kannst nach CLEAR lv_index. die Anweisung lv_index = lv_index + 1. machen oder lv_index = 1.

Re: Laufvariable / Index

Beitrag von Lbyte (ForumUser / 18 / 0 / 0 ) »
Vielen dank!

Seite 1 von 1

Vergleichbare Themen

FAQ Index
von Jan » 02.08.2005 08:08
Datenbank Index
von A6272 » 28.09.2020 13:45
Index im where Teil
von kaim77 » 10.09.2014 08:54
Datenbank-Index
von Charadin » 19.11.2007 12:23
Index in WHERE - Bedingung
von Gast » 13.10.2004 16:18