GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Benutzeroberflächen in SAP®-Systemen.
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von danbrown_1999 (ForumUser / 10 / 5 / 0 ) »
hi,

ich habe eine interne Tabelle, die ich in einem Selection-Screen mittels dem gridviewer darstelle.

Nun ist er zu Beginn da.
Aber sobald ich einen Button betätige, der eine Funktion hat, und das Programm die Funktion ausführt, und ich die message wegdrücke, verschwindet das Grid.

Nun habe ich versucht den Befehl "Perform build_gridviewer" davor und dahinter zu platzieren, sodass das Programm diesen immer wieder aufruft. Leider kommt dann der Fehler CNTL_ERROR.

Wie soll ich am besten damit umgehen, sodass der Gridviewer gestartet wird, auch nachdem ein Button betätigt wurde?

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


Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Ein ALV-Grid in einem Selection-Screen, das finde ich höchst ungewöhnlich. Wieso macht man denn sowas? Ich kenne das nur so, dass der Anwedner im Selection-Screen Eingaben macht und zur Ausgabe einer Ergebnisliste kann man dann den ALV-Grid verwenden.

Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Ohne Coding lässt sich kaum was dazu sagen.

Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von danbrown_1999 (ForumUser / 10 / 5 / 0 ) »
Moin, danke für euere Antworten bisher.

Hier mein Beispiel-Coding und Screenshot.
Es sieht einfach cooler aus, wie ein Split-Screen.
Links ist die Eingabe, rechts erscheinen die bearbeitete Tabelle.

Wenn ich auf den 1. Button drücke, verschwindet das ALV_grid rechts.
Wenn ich anschließend auf den 2. Button drücke, crashed das Programm "CNTL_ERROR".

Im Coding haben die Buttons keine Funktion gerade.
Aber selbst mit Funktion dahinter passiert genau dasselbe.

Code: Alles auswählen.

REPORT Z_DEMONSTRATOR.

SELECTION-SCREEN SKIP 2.

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

SELECTION-SCREEN SKIP 1.

**SELECTION-SCREEN BEGIN OF LINE.

**SELECTION-SCREEN COMMENT 2(25) FOR FIELD onchain.



**SELECTION-SCREEN COMMENT 79(10) FOR FIELD offchain.

*PARAMETERS offchain TYPE char30.

**SELECTION-SCREEN COMMENT 50(50) FOR FIELD InvID.

**PARAMETERS InvID TYPE char30.
**PARAMETERS Product TYPE char30.
************
PARAMETERS Field type char15.
PARAMETERS Field2 type char15.
PARAMETERS Field3 type char15.
************
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 1(20) text-010 USER-COMMAND button_001.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK a1.



SELECTION-SCREEN BEGIN OF BLOCK a2 WITH FRAME TITLE text-002.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 1(20) text-020 USER-COMMAND button_002.
SELECTION-SCREEN END OF LINE.

PARAMETERS ClientID TYPE char20.
PARAMETERS FlightID TYPE char20.
PARAMETERS Destina TYPE char20.


**SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP 2.

SELECTION-SCREEN END OF BLOCK a2.



DATA:
docking TYPE REF TO cl_gui_docking_container .

*
*********
include <icon>.

data: ok_code like sy-ucomm,
      gt_spfli   type table of spfli,
      gt_sflight type table of sflight,
      g_repid like sy-repid,
      g_max type i value 100,
      gs_layout   type lvc_s_layo,
      gs_toolbar  type stb_button,
      grid1  type ref to cl_gui_alv_grid,
      grid2  type ref to cl_gui_alv_grid,
      custom_container1 type ref to cl_gui_custom_container,
      custom_container2 type ref to cl_gui_custom_container.


AT SELECTION-SCREEN OUTPUT.
    PERFORM build_gridviewer .


START-OF-SELECTION.


*&---------------------------------------------------------------------*
*&      Form  build_gridviewer
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_gridviewer .
  DATA: repid LIKE sy-repid.
  IF NOT grid1 IS INITIAL .
    CALL METHOD grid1->free .
  ENDIF .
  repid = sy-repid.
if docking is initial .
CREATE OBJECT docking
  EXPORTING
  repid = repid
  dynnr = sy-dynnr
  side = cl_gui_docking_container=>dock_at_right
  extension = '300'
  EXCEPTIONS
  cntl_error = 1
  cntl_system_error = 2
  create_error = 3
  lifetime_error = 4
  lifetime_dynpro_dynpro_link = 5.
endif .

  IF NOT docking IS INITIAL AND
          grid1 IS INITIAL .
   create object grid1
           exporting i_parent = docking.

refresh gt_spfli .
select * from spfli into table gt_spfli.

* Set a titlebar for the grid control
*
    call method grid1->set_table_for_first_display
         exporting i_structure_name = 'SPFLI'
                   is_layout        = gs_layout
         changing  it_outtab        = gt_spfli.

  ENDIF .

ENDFORM.                    " build_htmlviewer

Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Also ich habe die Zeilen

Code: Alles auswählen.

IF NOT grid1 IS INITIAL .
    CALL METHOD grid1->free .
ENDIF .
herausgenommen, dann blieb das Grid stehen oder aber oder man ergänzt die Zeilen um

Code: Alles auswählen.

FREE grid1.
. Also:

Code: Alles auswählen.

IF NOT grid1 IS INITIAL .
    CALL METHOD grid1->free .
     FREE grid1. 
ENDIF .
Dann funktioniert es auch.

Aber ein bisschen gruselig finde ich das trotzdem 🙂

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
danbrown_1999


Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von danbrown_1999 (ForumUser / 10 / 5 / 0 ) »
@PeterPaletti: Vielen lieben Dank! Es funktioniert, das GRID bleibt stehen.

Wieso ist das gruselig? Das ist doch klasse, dass man die Tabelle direkt im Blick hat.
Links das Eingabefeld, rechts sollen die Eingaben übernommen werden.

Ansonsten muss der User doch in die SE16 und dort die Tabelle mittels View anschauen...was ist denn das für eine User-Experience! (aber mit der Meinung bin ich in der abap welt allein...) Danke für deine Hilfe, ich bin offen für Feedback.

Wie würdest du es anders gestalten?

Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Ich würde es mit einem eigenen Dynpro machen und darin den Selection Screen als Subscreen einbinden und in den Docking Container ein SALV werfen. Dann könnte man die Tabellen einfach wechseln.

Code: Alles auswählen.

SELECTION-SCREEN BEGIN OF SCREEN 1100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE TEXT-001.
PARAMETERS field TYPE char15.
PARAMETERS field2 TYPE char15.
PARAMETERS field3 TYPE char15.
SELECTION-SCREEN END OF BLOCK a1.

SELECTION-SCREEN BEGIN OF BLOCK a2 WITH FRAME TITLE TEXT-002.
PARAMETERS clientid TYPE char20.
PARAMETERS flightid TYPE char20.
PARAMETERS destina TYPE char20.
SELECTION-SCREEN END OF BLOCK a2.

SELECTION-SCREEN END OF SCREEN 1100.


DATA:
docking TYPE REF TO cl_gui_docking_container .

DATA: okcode     LIKE sy-ucomm,
      saveok     TYPE sy-ucomm,
      spfli   TYPE TABLE OF spfli,
      sflight TYPE TABLE OF sflight,
      grid1      TYPE REF TO cl_gui_alv_grid,
      salv       TYPE REF TO cl_salv_table.



START-OF-SELECTION.
  REFRESH spfli .
  SELECT * FROM spfli INTO TABLE spfli.

  CALL SCREEN 100.


*&---------------------------------------------------------------------*
*&      Form  build_gridviewer
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_gridviewer .
  DATA: repid LIKE sy-repid.

  repid = sy-repid.
  IF docking IS INITIAL .
    CREATE OBJECT docking
      EXPORTING
        repid                       = repid
        dynnr                       = sy-dynnr
        side                        = cl_gui_docking_container=>dock_at_right
        extension                   = '300'
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5.


*    CREATE OBJECT grid1
*      EXPORTING
*        i_parent = docking.
*
*
*
*    CALL METHOD grid1->set_table_for_first_display
*      EXPORTING
*        i_structure_name = 'SPFLI'
*        is_layout        = gs_layout
*      CHANGING
*        it_outtab        = gt_spfli.
*  ELSE.
*    CALL METHOD grid1->refresh_table_display
**       EXPORTING
**         is_stable      =                  " zeilen-/spaltenstabil
**         i_soft_refresh =                  " Ohne Sortierung, Filter, etc.
*      EXCEPTIONS
*        finished = 1                " Display wurde beendet ( durch Export ).
*        OTHERS   = 2.
*    IF sy-subrc <> 0.
*      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*    ENDIF.

    TRY.
        cl_salv_table=>factory( EXPORTING
                                  r_container  = docking
                                IMPORTING
                                  r_salv_table = salv
                                CHANGING
                                  t_table      = spfli ).

        salv->display( ).

      CATCH cx_root INTO DATA(e_txt).
    ENDTRY.

  ENDIF .

ENDFORM.                    " build_htmlviewer
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '100'.
  SET TITLEBAR '100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  saveok = okcode.
  CLEAR okcode.
  CASE saveok.
    WHEN 'EXIT' OR 'BACK' OR 'CANC'.
      IF NOT grid1 IS INITIAL .
        CALL METHOD grid1->free .
        FREE grid1.
      ENDIF.
      IF NOT docking IS INITIAL.
        CALL METHOD docking->free .
        FREE docking.
      ENDIF.
      LEAVE PROGRAM.
    WHEN 'BUT01'.
      REFRESH spfli .
      SELECT * FROM spfli INTO TABLE spfli.
      CALL METHOD salv->set_data
        CHANGING
          t_table = spfli.           
      CALL METHOD salv->refresh.

    WHEN 'BUT02'.
      REFRESH sflight .
      SELECT * FROM sflight INTO TABLE sflight.
      CALL METHOD salv->set_data
        CHANGING
          t_table = sflight.              
      CALL METHOD salv->refresh.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  INIT_CONTROLS_100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE init_controls_100 OUTPUT.
  PERFORM build_gridviewer.
ENDMODULE.
Ablauflogik Dynpro 100

Code: Alles auswählen.

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
  MODULE init_controls_100.
  CALL SUBSCREEN area INCLUDING sy-repid '1100'.

PROCESS AFTER INPUT.
  CALL SUBSCREEN area.
  MODULE user_command_0100.
Nur so eine kleine Spielerei.

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
danbrown_1999


Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
danbrown_1999 hat geschrieben:
14.02.2023 14:09
Wie würdest du es anders gestalten?
Du musst das grid nicht jedes Mal zerstören!
Docker und Grid in INITIALIZATION erzeugen.
Dann entfallen auch die ganzen Abfragen auf IS INITIAL.
Im AT SELECTION-SCREEN dann nur noch

Code: Alles auswählen.

grid1->refresh_table_display( ).
Zusätzlich würde ich den Ausführen-Button ausblenden, damit niemand auf die Idee kommt, den zu benutzen.
https://tricktresor.de/blog/eigener-gui-status/

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
danbrown_1999


Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von danbrown_1999 (ForumUser / 10 / 5 / 0 ) »
Die Spalten in der Tabelle sind super breit.
In den Optionen kann man diese "optimieren" und dann sind sie schön eng aneinander gereiht.

Kann das Grid (und die Spalten) irgendwie "optimal" direkt starten lassen?

Vielleicht in diesem Part hier?

Code: Alles auswählen.

CREATE OBJECT docking
      EXPORTING
        repid                       = repid
        dynnr                       = sy-dynnr
        side                        = cl_gui_docking_container=>dock_at_right
        extension                   = '300'


Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Das SALV bietet über GET_COLUMNS( )->SET_OPTIMIZE( ) eine Möglichkeit dafür an das Flag LVC_S_LAYO-CWIDTH_OPT vom ALV-Grid zu setzen.

Ich hab aber in diversen Programmen damit das Phänomen gehabt, dass die Option erst NACH einem PAI/PBO bzw. einem FLUSH zieht. Bei langen Tabellen fällt das nicht auf, weil da das FLUSH durch die Paketverarbeitung des ALV intern aufgerufen wird. Bei kurzen Tabellen ist das aber ein Problem, wenn im ersten Paket bereits alle Daten an das Control übertragen wurden und es somit zu keinem weiteren Soft-Refresh mehr kommt. Dann bleiben die Zeilen un-optimiert.
Wie gesagt, das ist mir nur hin- und wieder aufgefallen und ich weiß leider auch nicht ob das irgendwie Release- oder Patchabhängig ist. Ich hab das dann immer mit SAPGUI_SET_FUNCTIONCODE kaschiert um ein PAI/PBO auszulösen.
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: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von danbrown_1999 (ForumUser / 10 / 5 / 0 ) »
Die Lösung:

Code: Alles auswählen.


gs_layout-cwidth_opt = 'X'.

und zwar über dem hier im Code

Code: Alles auswählen.


gs_layout-cwidth_opt = 'X'.

    call method grid1->set_table_for_first_display
         exporting i_structure_name = 'YINVOICE_TAB'
                   is_layout        = gs_layout
         changing  it_outtab        = gt_ty_invoice_response.


Re: GRID kommt nur am Anfang des Screens und verschwindet nach Aktion

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Huch... Hab ich doch glatt in den falschen Quellcode-Postiong (den letzten) geschaut. 😅

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
danbrown_1999

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

Seite 1 von 1

Vergleichbare Themen

6
Antw.
3516
Views
ALV - Character Feld mit Space am Anfang
von mfromg » 25.07.2018 13:21 • Verfasst in ABAP® Core
6
Antw.
2893
Views
Ergebnis gelicht am Anfang eines Reports anzeigen
von bohne » 03.01.2007 14:28 • Verfasst in ABAP® für Anfänger
0
Antw.
1524
Views
5
Antw.
1635
Views
Tabelle verschwindet nach Aktualisierung
von Lamerman » 05.05.2006 10:21 • Verfasst in ABAP® Core
2
Antw.
2219
Views
ALV OO / Vorzeichen verschwindet bei lokaler Datei
von Kali » 18.09.2013 09:10 • Verfasst in ABAP Objects®

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

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.

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822