Schlüsselfeldproblem


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

Moderatoren: Jan, Steff

Schlüsselfeldproblem

Beitragvon Lbyte » 04.12.2017, 13:54

Hallo zusammen,

ich schreibe gerade an einem Report bei dem ich folgendes Problem habe.

Ich möchte ein Programm haben, dass mir gelaufene Prozessketten anzeigt.

Hierzu ziehe ich mir aus einer Liste Chain mehrere Datensätze. In dieser Liste werden Prozessketten mit deren Unterprozessen aufgelistet bzw aus welchen Prozessen die Kette besteht. Aus einer andere Liste Logchain, ziehe ich mir die einzelnen gelaufenen Ketten und aus einer Dritten Liste Processlog die einzelnen Prozesse der Kette bzw wann diese gelaufen sind. Soweit funktioniert das auch schon einigermaßen. Das Problem ist dass mir allerdings nur die erste gelaufene Kette angezeigt wird. In der Logchain habe ich mehrere Läufe mit mehreren verschiedene Datümern (heißt das eigentlich so?!) und Zeiten. Geholt wird allerdings anscheinend immer nur der erste Satz. Ich möchte quasi alle Sätze abholen weiß aber nicht wie ich das schreiben soll da ich das Datum und die Zeit aus der Liste, nicht in meiner Hauptliste (Chain) habe.

Zusätzlich hab ich noch folgende Frage: meine Suche erfolgt über einen Selection Screen nach Chain ID und Log ID. Wenn ich nach LOG ID suche, werden mir die einzelnen Schritte so angezeigt wie ich möchte (auch wenn das bisher nur mit dem ersten Satz funktioniert). Wenn ich nach der Chain ID suche, würde ich gerne in einer ersten Ausgabe nur die einzeln gelaufenen LOG_IDs sehen, und bei Doppelklick sollte sich eine neue Liste aufmachen in der dann die einzelnen Prozesse angezeigt werden. Ist sowas machbar?

Vielen dank für jede Antwort.

Hier mein bisheriger Code.

Code: Alles auswählen
REPORT zprab_process_chain.

TYPES: BEGIN OF fieldtype,

         chain_id        TYPE rspc_chain,
         log_id          TYPE rspc_logid,
         objvers         TYPE rsobjvers,
         type            TYPE rspc_type,
         variante        TYPE rspc_variant,
         lnr             TYPE rslnr,
         txtlg           TYPE rstxtlg,
         eventp_start    TYPE btceventid,
         analyzed_status TYPE rspc_state,
         datum           TYPE sydatum,
         startzeit       TYPE syuzeit,
         endzeit         TYPE syuzeit,
         dauer           TYPE t,
         startstamp      TYPE rstimestmpl,
         endstamp        TYPE rstimestmpl,



       END OF fieldtype.


DATA: it_tab       TYPE STANDARD TABLE OF fieldtype,
      it_tab2      TYPE STANDARD TABLE OF fieldtype,

      l_chainid    TYPE rspc_chain,
      l_logid      TYPE rspc_logid,
      l_txtlg      TYPE rstxtlg,
      l_status     TYPE rspc_state,
      l_datum      TYPE sydatum,
      l_zeit       TYPE syuzeit,

      go_alv       TYPE REF TO cl_salv_table,
      go_functions TYPE REF TO cl_salv_functions_list,
      go_columns   TYPE REF TO cl_salv_columns_table,
      go_display   TYPE REF TO cl_salv_display_settings,
      go_events    TYPE REF TO cl_salv_events_table.


FIELD-SYMBOLS: <fs_tab> LIKE LINE OF it_tab.



CLASS lcl_handler DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS on_double_click
                  FOR EVENT double_click OF cl_salv_events_table
      IMPORTING row column.
ENDCLASS.


SELECTION-SCREEN BEGIN OF BLOCK eingabe WITH FRAME TITLE text-001.

SELECT-OPTIONS: so_chain FOR l_chainid.
SELECT-OPTIONS: so_logid FOR l_logid.
SELECT-OPTIONS: so_text  FOR l_txtlg.
SELECT-OPTIONS: so_state FOR l_status.
SELECT-OPTIONS: so_datum FOR l_datum.
SELECT-OPTIONS: so_zeit  FOR l_zeit.


SELECTION-SCREEN END OF BLOCK eingabe.



SELECT *
    FROM rspcchain
    INTO CORRESPONDING FIELDS OF TABLE it_tab
  WHERE   chain_id   IN so_chain
  AND     objvers    = 'A' .



LOOP AT it_tab ASSIGNING <fs_tab>.


  SELECT
     analyzed_status
     log_id

    FROM rspclogchain INTO (<fs_tab>-analyzed_status, <fs_tab>-log_id)
       WHERE
         chain_id = <fs_tab>-chain_id.
endselect.

  SELECT SINGLE
       txtlg
     FROM rspcchaint INTO (<fs_tab>-txtlg)
     WHERE chain_id = <fs_tab>-chain_id.


  SELECT SINGLE
    starttimestamp
    endtimestamp

  FROM rspcprocesslog INTO (<fs_tab>-startstamp, <fs_tab>-endstamp)

    WHERE   log_id = <fs_tab>-log_id
    AND     type = <fs_tab>-type
    AND     eventp_start = <fs_tab>-eventp_start.





  CONVERT TIME STAMP <fs_tab>-startstamp TIME ZONE sy-zonlo INTO
        DATE <fs_tab>-datum TIME <fs_tab>-startzeit.

  CONVERT TIME STAMP <fs_tab>-endstamp TIME ZONE sy-zonlo INTO
          DATE <fs_tab>-datum TIME <fs_tab>-endzeit.


  TRY.
      CALL METHOD cl_abap_tstmp=>subtract
        EXPORTING
          tstmp1 = <fs_tab>-endstamp
          tstmp2 = <fs_tab>-startstamp
        RECEIVING
          r_secs = <fs_tab>-dauer.
    CATCH cx_parameter_invalid_range.
    CATCH cx_parameter_invalid_type.
  ENDTRY.



ENDLOOP.

LOOP AT it_tab ASSIGNING <fs_tab>   WHERE txtlg           IN so_text
                                    AND   chain_id        IN so_chain
                                    AND   log_id          IN so_logid
                                    AND   analyzed_status IN so_state
                                    AND   startzeit       IN so_zeit
                                    AND   datum           IN so_datum.
  APPEND <fs_tab> TO it_tab2.

ENDLOOP.

SORT it_tab2  STABLE BY chain_id     ASCENDING
                        startzeit    ASCENDING.

* Instanz der Klasse cl_salv_table erzeugen
cl_salv_table=>factory(
  IMPORTING r_salv_table = go_alv
  CHANGING t_table = it_tab2 ).

* Funktionstasten (Sortieren, Filtern, Excel-Export etc.)
go_functions = go_alv->get_functions( ).
go_functions->set_all( abap_true ).

* optimale Spaltenbreite
go_columns = go_alv->get_columns( ).
go_columns->set_optimize( abap_true ).

* Titel und/oder Streifenmuster
go_display = go_alv->get_display_settings( ).
go_display->set_list_header( value = 'Prozessketten Monitor' ).
go_display->set_striped_pattern( abap_true ).

* Ereignisse einlesen und Handler für Doppelklick registrieren
go_events = go_alv->get_event( ).
SET HANDLER lcl_handler=>on_double_click FOR go_events.

* Liste anzeigen
go_alv->display( ).

* Reaktion auf Doppelklick ausprogrammieren
*_---------------------------------------------------------------------*
*        Class (Implementation)  lcl_handler
*----------------------------------------------------------------------*
CLASS lcl_handler IMPLEMENTATION.
  METHOD on_double_click.
    DATA ls_aktuelle_zeile LIKE LINE OF it_tab2.
    READ TABLE it_tab2 INTO ls_aktuelle_zeile INDEX row.
*     in ls_aktuelle_zeile steht die Zeile,die doppelgeklickt wurde.
*     in der Variablen COLUMN steht der Name der angeklickten Spalte
  ENDMETHOD.

ENDCLASS.
Lbyte
ForumUser
 
Beiträge: 15
Registriert: 12.10.2017, 12:29
Dank erhalten: 0 mal
Ich bin: Student/in

Sponsor

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

Re: Schlüsselfeldproblem

Beitragvon DeathAndPain » 04.12.2017, 14:32

In der Logchain habe ich mehrere Läufe mit mehreren verschiedene Datümern (heißt das eigentlich so?!)

Jein. Eigentlich ist der Plural von "Datum" "Daten", aber das das Wort "Daten" heutzutage im Wesentlichen für etwas anderes verwendet wird, hat sich zur Unterscheidung "Datümer" eingebürgert, was ich der Klarheit halber für durchaus sinnvoll und nützlich halte.

In der Logchain habe ich mehrere Läufe mit mehreren verschiedene Datümern (heißt das eigentlich so?!) und Zeiten. Geholt wird allerdings anscheinend immer nur der erste Satz.

Du liest schon alle Sätze, aber Du machst nichts damit. Per SELECT ... ENDSELECT spannst Du eine Schleife auf, die nacheinander alle Logs INTO (<fs_tab>-analyzed_status, <fs_tab>-log_id) einliest, aber anschließend machst Du nichts damit, sondern bringst gleich ENDSELECT, wodurch der nächste Schleifendurchlauf angestoßen wird, der den vorherigen dann überschreibt. Angesichts Deiner Typdefinition von it_tab bzw. fieldtype geht es ja auch nicht anders, denn dort siehst Du pro CHAIN_ID nur ein einziges Feld LOG_ID vor.

Was ich da machen würde, ist eine Untertabelle. Der Einleseteil Deines Programms, entsprechend umgeschrieben, damit kein Log mehr verlorengeht, sähe dann so aus:

Code: Alles auswählen
*&amp;---------------------------------------------------------------------*
*&amp; Report ZTEST5
*&amp;---------------------------------------------------------------------*
*&amp;
*&amp;---------------------------------------------------------------------*
REPORT ZTEST5.



    TYPES: BEGIN OF logtype,
             analyzed_status TYPE rspc_state,
             log_id          TYPE rspc_logid,
           END OF logtype,
           tt_logtype TYPE STANDARD TABLE OF logtype WITH EMPTY KEY,

           BEGIN OF fieldtype,

             chain_id        TYPE rspc_chain,
             t_log           TYPE tt_logtype,
             objvers         TYPE rsobjvers,
             type            TYPE rspc_type,
             variante        TYPE rspc_variant,
             lnr             TYPE rslnr,
             txtlg           TYPE rstxtlg,
             eventp_start    TYPE btceventid,
             datum           TYPE sydatum,
             startzeit       TYPE syuzeit,
             endzeit         TYPE syuzeit,
             dauer           TYPE t,
             startstamp      TYPE rstimestmpl,
             endstamp        TYPE rstimestmpl,



           END OF fieldtype.


    DATA: it_tab       TYPE STANDARD TABLE OF fieldtype,
          it_tab2      TYPE STANDARD TABLE OF fieldtype,

          l_chainid    TYPE rspc_chain,
          l_logid      TYPE rspc_logid,
          l_txtlg      TYPE rstxtlg,
          l_status     TYPE rspc_state,
          l_datum      TYPE sydatum,
          l_zeit       TYPE syuzeit,

          go_alv       TYPE REF TO cl_salv_table,
          go_functions TYPE REF TO cl_salv_functions_list,
          go_columns   TYPE REF TO cl_salv_columns_table,
          go_display   TYPE REF TO cl_salv_display_settings,
          go_events    TYPE REF TO cl_salv_events_table.


    FIELD-SYMBOLS: <fs_tab> LIKE LINE OF it_tab.

    SELECTION-SCREEN BEGIN OF BLOCK eingabe WITH FRAME TITLE text-001.

    SELECT-OPTIONS: so_chain FOR l_chainid.
    SELECT-OPTIONS: so_logid FOR l_logid.
    SELECT-OPTIONS: so_text  FOR l_txtlg.
    SELECT-OPTIONS: so_state FOR l_status.
    SELECT-OPTIONS: so_datum FOR l_datum.
    SELECT-OPTIONS: so_zeit  FOR l_zeit.


    SELECTION-SCREEN END OF BLOCK eingabe.



    SELECT *
        FROM rspcchain
        INTO CORRESPONDING FIELDS OF TABLE it_tab
      WHERE   chain_id   IN so_chain
      AND     objvers    = 'A' .



    LOOP AT it_tab ASSIGNING <fs_tab>.


      SELECT
         analyzed_status
         log_id

        FROM rspclogchain INTO table <fs_tab>-t_log
           WHERE
             chain_id = <fs_tab>-chain_id.


      SELECT SINGLE
           txtlg
         FROM rspcchaint INTO (<fs_tab>-txtlg)
         WHERE chain_id = <fs_tab>-chain_id.


    ENDLOOP.


Natürlich kannst Du die Spalte mit der Untertabelle nicht direkt an ein ALV übergeben. Das ist eben für sich eine Tabelle, die Du dann pro Zeile mittels eines Unter-ALVs anzeigen lassen kannst.

Wenn ich nach der Chain ID suche, würde ich gerne in einer ersten Ausgabe nur die einzeln gelaufenen LOG_IDs sehen, und bei Doppelklick sollte sich eine neue Liste aufmachen in der dann die einzelnen Prozesse angezeigt werden. Ist sowas machbar?

Klar, ALVs können auf Doppelklicks reagieren. Das mache ich in fast jedem meiner Reports. Allerdings arbeite ich (aus Gewohnheit) immer mit dem FB REUSE_ALV_GRID_DISPLAY und bin zu faul nachzuschauen, wie es bei Deinem cl_salv_table=>factory funktioniert. Dass es geht, daran habe ich aber keinen Zweifel.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

Re: Schlüsselfeldproblem

Beitragvon black_adept » 05.12.2017, 08:47

DeathAndPain hat geschrieben: und bin zu faul nachzuschauen, wie es bei Deinem cl_salv_table=>factory funktioniert. Dass es geht, daran habe ich aber keinen Zweifel.

Tut es: Zunächst mittels ->get_event( ) das Event-Objekt holen und dann den Handler in deinem Programm auf dieses Event-Objekt registrieren.
Persönlich würde ich den Doppelklick aber vermeiden weil damit die armen Mäuse zu stark belastet werden. Nimm einen Hotspot stattdessen - dann sieht man auch gleich, dass die Spalte zur Navigation gedacht ist, weil unterstrichen .
live long and prosper
Stefan Schmöcker

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

Re: Schlüsselfeldproblem

Beitragvon DeathAndPain » 06.12.2017, 12:50

Persönlich würde ich den Doppelklick aber vermeiden weil damit die armen Mäuse zu stark belastet werden.

Die Begründung meinst Du jetzt nicht ernst, oder?

Ich spiele Echtzeitspiele mit Logitech-Mäusen für unter 10€, und was nicht kaputt geht, sind die Tasten.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

Re: Schlüsselfeldproblem

Beitragvon ralf.wenzel » 06.12.2017, 13:07

Humor 6, Setzen!


Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2682
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 122 mal
Ich bin: Freiberufler/in

Re: Schlüsselfeldproblem

Beitragvon DeathAndPain » 06.12.2017, 14:28

Na ja, die Hotspotempfehlung schien mir schon ernst gemeint zu sein, und ich sehe keine andere Begründung als die genannte dafür.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in

Re: Schlüsselfeldproblem

Beitragvon ralf.wenzel » 06.12.2017, 14:34

DeathAndPain hat geschrieben:Na ja, die Hotspotempfehlung schien mir schon ernst gemeint zu sein, und ich sehe keine andere Begründung als die genannte dafür.


Dann guck nochmal hin:

black_adept hat geschrieben:Nimm einen Hotspot stattdessen - dann sieht man auch gleich, dass die Spalte zur Navigation gedacht ist, weil unterstrichen .



Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2682
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 122 mal
Ich bin: Freiberufler/in

Re: Schlüsselfeldproblem

Beitragvon ewx » 06.12.2017, 14:48

Hotspot/ Link ist aber auch nicht immer besser, weil der gemeiner Anwender häufig einfach auf eine Zeile klickt, die gerade relevant ist. Und wenn man dann bei jedem zweiten Feld im { Materialstamm | Kundenstamm | Liste xyz | etc } landet, ist es auch nervig. Zumal auch viele Links die ohnehin durch Linien begrenzte Listen (ALV-Grid) schlechter lesbar machen.
Aber die "Dokumentation", dass sich hinter einem Feld eine Funktion verbirgt ist schon manchmal nicht schlecht.
Zuletzt geändert von ewx am 06.12.2017, 15:07, insgesamt 1-mal geändert.

Für diese Nachricht hat ewx einen Dank bekommen :
DeathAndPain
ewx
Top Expert
 
Beiträge: 3452
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 222 mal

Re: Schlüsselfeldproblem

Beitragvon ralf.wenzel » 06.12.2017, 14:51

Meine Beobachtung ist, dass in Zeiten des WWW die Leute davon ausgehen: Wenn ich wo draufklicke, passiert was.


Ralf
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2682
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 122 mal
Ich bin: Freiberufler/in

Re: Schlüsselfeldproblem

Beitragvon DeathAndPain » 06.12.2017, 16:42

Ein Grund mehr, das ALV frei von den unübersichtlichen unterstrichenen Links zu halten. An einem Doppelklick ist noch keiner gestorben.

Wenn man Funktionen hinter einzelnen Feldern verbirgt, dann ist ein Hotspot sicherlich interessant. Meist geht es aber nur um die ganze Zeile. Und da reicht es nach meiner Überzeugung, auf Doppelklick abzufragen anstatt alles zu unterstreichen.
DeathAndPain
Specialist
 
Beiträge: 309
Registriert: 05.05.2006, 10:14
Dank erhalten: 80 mal
Ich bin: Entwickler/in


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

  Aktuelle Beiträge   
DSGVO in SAP umsetzen
vor 38 Minuten von ralf.wenzel 0 Antw.
Berechtigungsprüfung Dialog- vs. RFC-User im Single Sign On
vor 2 Stunden von sapdepp 0 Antw.
Reporttransaktion für andere Mitarbeiter zugänglich machen
vor 5 Stunden von Tron 1 Antw.
Materialkalkulation
vor 8 Stunden von erp-bt 1 Antw.
gelöst Barcodes in Warenbewegungen & Belegen
vor 7 Stunden von marc.braun 1 Antw.

  Ähnliche Beiträge beta
Keine Beiträge gefunden - versuche es mit der erweiterten Suche.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]

Feedback ...?

Was können wir verbessern? Hinterlasse deine Kontaktdaten, wenn du eine direkte Antwort möchtest.

... Absenden!