cl_salv_table und Docking Container


Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Moderatoren: Jan, Steff

cl_salv_table und Docking Container

Beitragvon JohnLocklay » 22.07.2018, 14:40

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
JohnLocklay
Specialist
 
Beiträge: 132
Registriert: 10.05.2016, 11:14
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Sponsor

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

Re: cl_salv_table und Docking Container

Beitragvon black_adept » 22.07.2018, 22:44

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
black_adept
Top Expert
 
Beiträge: 3030
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 512 mal
Ich bin: Freiberufler/in

Re: cl_salv_table und Docking Container

Beitragvon a-dead-trousers » 23.07.2018, 08:46

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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3011
Registriert: 07.02.2011, 13:40
Dank erhalten: 744 mal
Ich bin: Entwickler/in

Re: cl_salv_table und Docking Container

Beitragvon Legxis » 23.07.2018, 10:10

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
Ich bin Neuling und für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele dankbar^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )
Legxis
Specialist
 
Beiträge: 109
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 17 mal
Ich bin: Student/in

Re: cl_salv_table und Docking Container

Beitragvon black_adept » 23.07.2018, 11:07

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
black_adept
Top Expert
 
Beiträge: 3030
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 512 mal
Ich bin: Freiberufler/in

Re: cl_salv_table und Docking Container

Beitragvon JohnLocklay » 24.07.2018, 09:03

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
JohnLocklay
Specialist
 
Beiträge: 132
Registriert: 10.05.2016, 11:14
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Re: cl_salv_table und Docking Container

Beitragvon black_adept » 24.07.2018, 09:44

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
black_adept
Top Expert
 
Beiträge: 3030
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 512 mal
Ich bin: Freiberufler/in


Zurück zu ABAP Objects®

  Aktuelle Beiträge   
Sachkonto für FI Rechnung in idoc übermittel
vor 9 Stunden von uibig 0 Antw.
Anlagenmigration Export
vor 22 Stunden von verzweifelt 1 Antw.
SFP - PDF Datenbindung
Gestern von a-dead-trousers 2 Antw.
Protected Attribut füttern
vor 4 Tagen von Tommy Nightmare 3 Antw.
gelöst Problem bei der Tree-Darstellu ng einer Hierarchie
Gestern von khb 3 Antw.

  Ähnliche Beiträge beta
gelöst Docking Container im Docking Container
25.04.2013, 12:01 von GreatEMU 3 Antw.
Docking-Container im Subscreen
10.11.2004, 18:30 von Gast 2 Antw.
Abstand zum Top bei Docking Container
30.04.2008, 10:14 von Gotti 0 Antw.
Gesplitteter Docking-Container
27.05.2013, 11:08 von JHM 6 Antw.
Docking Container / Call Dialog
22.05.2012, 10:17 von a-dead-trousers 5 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder