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.
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?!)
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.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.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report ZTEST5
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
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.
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.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?
Tut es: Zunächst mittels ->get_event( ) das Event-Objekt holen und dann den Handler in deinem Programm auf dieses Event-Objekt registrieren.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.
Die Begründung meinst Du jetzt nicht ernst, oder?Persönlich würde ich den Doppelklick aber vermeiden weil damit die armen Mäuse zu stark belastet werden.
Dann guck nochmal hin: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.
black_adept hat geschrieben:Nimm einen Hotspot stattdessen - dann sieht man auch gleich, dass die Spalte zur Navigation gedacht ist, weil unterstrichen .
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
DeathAndPain