cl_salv_table und Docking Container

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

cl_salv_table und Docking Container

Beitrag von JohnLocklay (Specialist / 183 / 30 / 2 ) »
Hallo.

ich hab mal ein kleines Programm geschrieben um mal mit der Klasse cl_gui_docking_container zu spielen.

Ich hab nen Klassischen Selektion Screen und will nach Eingabe der Parameter
nen ALV aufbauen. Dazu nutze ich die klasse cl_salv_table.

Ich dachte ich könnte das alv an den Parameter r_container andocken aber irgendwie wird nach der Methode ->display nix angezeig.
Erkennt ihr auf die schnelle wo ich den FEhler habe?

Hier mal ein kleiner Auszug au dem Code.

Code: Alles auswählen.


DATA r_alv       TYPE REF TO cl_salv_table.
DATA r_docker TYPE REF TO cl_gui_docking_container.

INITIALIZATION.

CREATE OBJECT r_docker
    EXPORTING
      repid      = sy-cprog
      extension  = 500
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2.

  IF sy-subrc <> 0.
* Fehlerbehandlung
 ENDIF.


  r_docker->dock_at(
    EXPORTING
      side =  cl_gui_docking_container=>dock_at_bottom
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2
      ).

  IF sy-subrc <> 0.
* Fehlerbehandlung
  ENDIF.


START-OF-SELECTION

* Datenbeschaffung durch select


 TRY.

      cl_salv_table=>factory(
        EXPORTING
          r_container    = r_docker
        IMPORTING
          r_salv_table   = r_alv
        CHANGING
          t_table        =  <fs_tab>
             ).
    CATCH cx_salv_msg .

  ENDTRY.

  r_alv->display( ).

Code once - Think twice

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


Re: cl_salv_table und Docking Container

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Schreib mal irgendwo in deinem Programm ein

Code: Alles auswählen.

WRITE 'Fehler beim Aufbau des ALV'.
damit du eine Ausgabe erzwingst wo sich dein Docker drandocken kann.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: cl_salv_table und Docking Container

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Der Aufbau des Docking-Containers muss, glaub ich, auch im START-OF-SELECTION durchgeführt werden.
Sonst funktioniert nämlich nur der allererste Aufruf, weil der Report-Prozessor nach der Anzeige der Ergebnisse und bei der Rückkehr zum Selection-Screen das Programm in Wirklichkeit neu startet. Die Eingaben im Selection-Screen werden dabei über ein eigenes Memory übergeben und alle anderen Variablen gelöscht. Soweit ich weiß (nicht ausgetestet) wird dabei das INITIALIZATION nicht mehr durchlaufen, weil sonst die Werte aus dem Selection-Screen wieder auf den Anfangswert gesetzt werden würden. Somit verlierst du auch die Instanzierung des Docking-Containers.
Und du solltest, wie black_adept schreibt, ein eigenes Dynpro für die Ausgabe verwenden.
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: cl_salv_table und Docking Container

Beitrag von Legxis (Specialist / 160 / 90 / 28 ) »
Wenn du nur einen einfachen Selektion-Screen und dann einen SALV haben willst, wieso dann so kompliziert mit Container und eigenem Dynpro? Geht doch auch automatisch, ich mache das immer so:

Code: Alles auswählen.

*               ------------------------------------------------------------------
*              |                                                                  |
*              |                       Report Y_SIMPLE_ALV                        |
*              |                                                                  |
*              |------------------------------------------------------------------
*              |                                                                  |
*              |              Das Programm ist eine Demo für einen                |
*              |          simplen Selektion-Screen und SALV Listausgabe.          |
*              |                                                                  |
*              |------------------------------------------------------------------
*              |   Anforderer: XXX                                                |
*              |------------------------------------------------------------------
*              |   Programmierer, Datum - Änderungen, Datum                       |
*               ------------------------------------------------------------------

REPORT  Y_SIMPLE_ALV.

TABLES: mara.

*                                 ------------------------------
*--------------------------------| Definitionen + Deklarationen |--------------------------------
*                                 ------------------------------

* Tabellentypen
TYPES: BEGIN OF ty_mara,
  matnr TYPE matnr,
  erdat TYPE erdat,
  groes TYPE groes,
  ntgew TYPE ntgew,
END OF ty_mara.

* Datentabellen
DATA: gt_auswertung TYPE STANDARD TABLE OF ty_mara.

* Workareas

* Hilfsvariablen

* salv Listausgabe
DATA: go_alv              TYPE REF TO  cl_salv_table,
      go_column           TYPE REF TO  cl_salv_column_table,
      go_columns          TYPE REF TO  cl_salv_columns_table,
      go_functions        TYPE REF TO  cl_salv_functions_list,      " toolbar
      go_display          TYPE REF TO  cl_salv_display_settings,
      go_layout           TYPE REF TO  cl_salv_layout,
      go_selections       TYPE REF TO  cl_salv_selections,          " multiselect
      go_sort             TYPE REF TO  cl_salv_sorts,               " von Anfang an sortiert ausgeben
      gx_salv_msg         TYPE REF TO  cx_salv_msg,                 " exceptions
      gx_salv_not_found   TYPE REF TO  cx_salv_not_found,
      gx_salv_existing    TYPE REF TO  cx_salv_existing,
      gx_salv_data_error  TYPE REF TO  cx_salv_data_error,
      gs_layoutkey        TYPE         salv_s_layout_key.

*                                         ------------------
*----------------------------------------| Selektion-Screen |------------------------------------
*                                         ------------------

SELECTION-SCREEN: BEGIN OF BLOCK param WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.     " Mat-Nr
SELECTION-SCREEN: END OF BLOCK param.

SELECTION-SCREEN: BEGIN OF BLOCK limit WITH FRAME TITLE TEXT-002.
  PARAMETERS:     p_limit TYPE p_dbacc.     " max. Anzahl Treffer
SELECTION-SCREEN: END OF BLOCK limit.

*                                         -------------------
*----------------------------------------| Datenaufbereitung |-----------------------------------
*                                         -------------------

SELECT *
  INTO CORRESPONDING FIELDS OF TABLE gt_auswertung
  FROM mara
WHERE matnr IN s_matnr
  ORDER BY matnr.

*                                              ---------
*---------------------------------------------| Ausgabe |----------------------------------------
*                                              ---------

IF sy-subrc = 0.
  PERFORM get_alv_settings.
  go_alv->display( ).
ELSE.
  PERFORM no_entries.     " Fehlermeldung wenn keine Daten gefunden wurden
ENDIF.

*mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
*---------------------------------------------------------------------*
*      Form  get_alv_settings
*---------------------------------------------------------------------*
*       Ergebnisumfeld und -tabelle erstellen
*----------------------------------------------------------------------*

FORM get_alv_settings.

  TRY.
    cl_salv_table=>factory(
    IMPORTING
      r_salv_table = go_alv
    CHANGING
      t_table = gt_auswertung ).
  CATCH cx_salv_msg INTO gx_salv_msg.
    MESSAGE 'Die Listenausgabe konnte nicht generiert werden' TYPE 'E'.
  ENDTRY.

* Zeilen farblich unterscheiden
  TRY.
    go_display = go_alv->get_display_settings( ).
    go_display->set_striped_pattern( abap_true ).
  CATCH cx_salv_data_error INTO gx_salv_data_error.
  ENDTRY.

* Spaltenbreite optimieren
  TRY.
    go_columns = go_alv->get_columns( ).
    go_columns->set_optimize( 'X' ).
  CATCH cx_salv_data_error INTO gx_salv_data_error.
  ENDTRY.

* Tabelle direkt sortiert ausgeben (damit auch gleiche Spalteninhalte zusammenfügen)
  TRY.
    go_sort = go_alv->get_sorts( ).
  CATCH cx_salv_data_error INTO gx_salv_data_error.
  ENDTRY.

  TRY.
    go_sort->add_sort('MATNR').
  CATCH cx_salv_data_error INTO gx_salv_data_error.
  CATCH cx_salv_not_found  INTO gx_salv_not_found.
  CATCH cx_salv_existing   INTO gx_salv_existing.
  ENDTRY.

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

* Dem Benutzer erlauben, eigene Anzeigevarianten zu speichern
  go_layout = go_alv->get_layout( ).
  gs_layoutkey-REPORT = sy-repid.
  go_layout->set_key( gs_layoutkey ).
  go_layout->set_default( abap_true ).
  go_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).

* Dem Benutzer erlauben, mehrere Zellen/Zeilen/Spalten zu selektieren
  go_selections = go_alv->get_selections( ).
  CALL METHOD go_selections->set_selection_mode
  EXPORTING
    VALUE = if_salv_c_selection_mode=>multiple.

* Titel
  go_display = go_alv->get_display_settings( ).
  go_display->set_list_header( 'Auswertung aller Materialien im selektierten Bereich' ).

* Eigenes Menü (GUI-Status)
  CALL METHOD go_alv->set_screen_status(
  EXPORTING
    REPORT        = sy-repid
    pfstatus      = 'STANDARD'
    set_functions = go_alv->c_functions_all ).

ENDFORM.                    "get_alv_settings

*mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
*---------------------------------------------------------------------*
*      Form  no_entries
*---------------------------------------------------------------------*
*       Falls keine Daten gefunden werden ein PopUp anzeigen
*----------------------------------------------------------------------*

FORM no_entries.

  IF gt_auswertung IS INITIAL.
    MESSAGE 'Keine Daten gefunden!' TYPE 'I'.
  ENDIF.

ENDFORM.                    "no_entries
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )

Re: cl_salv_table und Docking Container

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Legxis hat geschrieben:Wenn du nur einen einfachen Selektion-Screen und dann einen SALV haben willst, wieso dann so kompliziert mit Container und eigenem Dynpro? Geht doch auch automatisch
Aber wenn du die Version der ALV-Erzeugung verwendest wo kein Container mitgegeben wird kannst du z.B. keine kleinen Exception-Symbole ( LED statt Ampel ) verwenden, weil der Salv dann in der Method set_exception_column den Eintrag im Parameter group ignoriert.
Für simple Auswertungen bei denen man trotzdem nicht die Einschränkungen des SALV ohne Container hinnehmen möchte ist es am einfachsten eine Listausgabe zu erzwingen (mittels WRITE) und dann den ALV über den Container CL_GUI_CONTAINER=>SCREEN0 auszugeben.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: cl_salv_table und Docking Container

Beitrag von JohnLocklay (Specialist / 183 / 30 / 2 ) »
Der Aufbau des Docking-Containers muss, glaub ich, auch im START-OF-SELECTION durchgeführt werden.
Sonst funktioniert nämlich nur der allererste Aufruf, weil der Report-Prozessor nach der Anzeige der Ergebnisse und bei der Rückkehr zum Selection-Screen das Programm in Wirklichkeit neu startet. Die Eingaben im Selection-Screen werden dabei über ein eigenes Memory übergeben und alle anderen Variablen gelöscht. Soweit ich weiß (nicht ausgetestet) wird dabei das INITIALIZATION nicht mehr durchlaufen, weil sonst die Werte aus dem Selection-Screen wieder auf den Anfangswert gesetzt werden würden. Somit verlierst du auch die Instanzierung des Docking-Containers.
Und du solltest, wie black_adept schreibt, ein eigenes Dynpro für die Ausgabe verwenden.

Das ganze habe ich auasprobiert, hat aber leider nicht funktioniert. Irgendwie scheint der Selektionsscreen wohl die Ursache zu sein.
Natürlich funktioniert das ganze wenn man mit einem Dynpro arbeitet. Aber ich dachte halt das es vielleicht auch möglich ist
direkt unter dem seletionsscreen die daten anzuzeigen.
Code once - Think twice

Re: cl_salv_table und Docking Container

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Du hast beim Erzeugen des Dockingcontainers keine Dynpronummer mitgegeben. Und ob du wirklich sy-cprog nehmen willst müsstest du mal im Debugger schauen.
Alternativ könntest du auch beim Erzeugen des Dockingcontainers ganz auf REPID und DYNNR verzichten und stattdessen das Feld NO_AUTODEF_PROGID_DYNNR = 'X' setzen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

3
Antw.
3092
Views
Docking Container im Docking Container
von GreatEMU » 25.04.2013 11:54 • Verfasst in ABAP Objects®
0
Antw.
1431
Views
Abstand zum Top bei Docking Container
von Gotti » 30.04.2008 11:14 • Verfasst in ABAP Objects®
2
Antw.
4878
Views
Docking-Container im Subscreen
von eschi78 » 10.11.2004 11:53 • Verfasst in ABAP Objects®
6
Antw.
5955
Views
Gesplitteter Docking-Container
von ralf.wenzel » 26.05.2013 18:33 • Verfasst in ABAP Objects®
2
Antw.
2028
Views
Tree im Docking Container
von Balflear » 12.09.2017 10:29 • Verfasst in ABAP® Core

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.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Tagen von Lucyalison 1 / 72
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141