ALV erscheint nicht.

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

ALV erscheint nicht.

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 22. Aug 2011 11:51

Hallo Allerseits,

ich versuche eine Tabelle mit der Klasse cl_salv_table auf einem Screen darzustellen. Leider bekomme ich lediglich einen blanken Screen ohne Inhalt.

Ich will euch mal kurz den Programmablauf beschreiben.

1. Eingabe zweier Parameter.

2. Start-of-SELECTION.

demo=>main( ). <- Dies ist meine Analyseklasse, die die Werte der globalen Variablen füllt.


call screen 0001.
----------------------
Flowlogic des Screens 0001 sieht folgendermaßen aus:

PROCESS BEFORE OUTPUT.
MODULE STATUS_0001.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0001.

Code: Alles auswählen.

module STATUS_0001 output.


  set pf-status 'STATUS_0001'.
  set titlebar 'STATUS_0001'.
    if custom_container1 is initial.
* create a custom container control for our ALV Control

    create object custom_container1
        exporting
            container_name = 'CUST_CONT'
        exceptions
            cntl_error = 1
            cntl_system_error = 2
            create_error = 3
            lifetime_error = 4
            lifetime_dynpro_dynpro_link = 5.
    if sy-subrc ne 0.
* add your handling, for example
      call function 'POPUP_TO_INFORM'
           exporting
                titel = sy-repid
                txt2  = sy-subrc
                txt1  = 'Container1 could not be created!'.
    endif.
   endif.


* create an instance of salv control
  perform display_all_tables.

  call method custom_container1->link
           exporting
            repid                       = sy-repid
            dynnr                       = '0001'
*          container                   =
          exceptions
            cntl_error                  = 1
            cntl_system_error           = 2
            lifetime_dynpro_dynpro_link = 3
            others                      = 4.
        if sy-subrc <> 0.
*       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        endif.

Code: Alles auswählen.

 form display_all_tables.

    data:

      lo_events     type ref to cl_salv_events_table,
      lo_columns    type ref to cl_salv_columns_table,
      lo_column     type ref to cl_salv_column_table,
      gr_layout     type ref to cl_salv_layout.
    data: lr_color_col type lvc_s_colo.
    data g_f_grid type ref to cl_salv_form_layout_grid.


    try.
        call method cl_salv_table=>factory
          exporting
            r_container    = custom_container1
            container_name = 'CUST_CONT'
          importing
            r_salv_table   = lo_table
          changing
            t_table        = g_s_resulttable.


        lo_events = lo_table->get_event( ).

        set handler demo=>on_double_click for lo_events.
.
.
.
.

    lo_table->display( ). 

  endform.
Kann mir jemand sagen, wieso ich keine Ausgabe erhalte? Spielt es eine Rolle wo die Methode lo_table->display( ) aufgerufen wird?

Vielen Dank im Voraus.


Re: ALV erscheint nicht.

Beitrag von a-dead-trousers (Top Expert / 3219 / 81 / 800 ) » 22. Aug 2011 12:54

hi!

Ich glaub du musst die Custom-Container-Klasse komplett weglassen. Das macht meines Wissens alles der SALV.

lg ADT
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

Re: ALV erscheint nicht.

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 22. Aug 2011 13:15

a-dead-trousers hat geschrieben:hi!

Ich glaub du musst die Custom-Container-Klasse komplett weglassen. Das macht meines Wissens alles der SALV.

lg ADT
tatsächlich, ALV erscheint, wenn ich den Container weglasse. Ich habe mich an dieses Wiki
http://www.sdn.sap.com/irj/scn/weblogs? ... 504#thread gehalten, wo sogar docking_container benutzt wurden um 2 Alvs in Abhängigkeit darzustellen. Wann sind den Container von Nöten? Wenn ich 2 ALV auf einem Screen darstellen möchte (Splitter)?

Re: ALV erscheint nicht.

Beitrag von a-dead-trousers (Top Expert / 3219 / 81 / 800 ) » 22. Aug 2011 16:00

Schau dir einfach mal die Schnittstelle von CL_SALV_TABLE=>FACTORY an.
Das sollte eigentlich alles erklären.
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

Re: ALV erscheint nicht.

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 22. Aug 2011 16:42

a-dead-trousers hat geschrieben:Schau dir einfach mal die Schnittstelle von CL_SALV_TABLE=>FACTORY an.
Das sollte eigentlich alles erklären.
Die Schnittstelle kann eigentlich nicht wirklich weiterhelfen. Ich habe es jetzt hin bekommen, allerdings musste ich einiges 'tricksen' bis es funktionierte.
Wäre super, wenn ihr kurz drüber schauen könntet und eventuelle Vereinfachungen posten könntet.




Wie schon bei der ersten Antwort auf diesen Post geschrieben wurde, ist es nicht notwendig einen Container mitzugeben. Dies trifft allerdings nur zu, wenn man im Programm nur einen ALV anzeigen möchte, ich will jedoch auf screen1 und screen2 einen anzeigen lassen.

Will man nur einen anzeigen lassen ist es ausreichend dem Parameter r_container das statische Attribut cl_gui_custom_container=screen0 mitzugeben. Dies habe ich probiert, jedoch hatte ich dann das Problem, dass dieser den ALV auf screen 2 überdeckt hatte.

Den ALV auf Screen 2 habe ich ebenfalls mit cl_gui_custom_container=screen0 instanziiert (allerdings wurde der Wert dem Parameter i_parent der Klasse cl_gui_alv_grid zugewiesen.


So, mit dem folgenden Code, konnte ich ALV 1 und 2 anzeigen lassen.

Dies ist das PBO Modul von ALV 1.

Um hier zu einer korrekten Anzeige zu kommen, musste ich zuerst ein custom control in Screen1 anlegen, damit dies überhaupt angezeigt wurde.
screen1.gif

Code: Alles auswählen.

module status_0001 output.


  set pf-status 'STATUS_0001'.
  set titlebar 'STATUS_0001'.
  if custom_container1 is initial.
* create a custom container control for our ALV Control

    create object custom_container1
      exporting
        container_name              = 'MY_CC'
      exceptions
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5.
    if sy-subrc ne 0.
* add your handling, for example
      call function 'POPUP_TO_INFORM'
        exporting
          titel = sy-repid
          txt2  = sy-subrc
          txt1  = 'Container1 could not be created!'.
    endif.

* create an instance of salv control
    perform display_all_tables.

    call method custom_container1->link
             exporting
              repid                       = sy-repid
              dynnr                       = '0001'
*          container                   =
            exceptions
              cntl_error                  = 1
              cntl_system_error           = 2
              lifetime_dynpro_dynpro_link = 3
              others                      = 4.
    if sy-subrc <> 0.
*       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    endif.

  else.
    lo_table->refresh( ).

  endif.


endmodule.

ALV 2 wird in Abhängigkeit von dem event on_doubleclick erstellt. 'MY_CC2' benötigt leider wieder ein zuvor erstelltes Custom Control, welches auf Grund der statisch definierten Größe die wechselnde Tabellen nicht größengerecht wiedergibt. (ALV1 dient Auswahltabelle, ALV2 gibt die entsprechenden Details wieder ).

Hier musste ich im PAI des Screen2 den Destruktor custom_container2->free( ) beim Zurückgehen aufrufen um überhaupt eine andere Tabelle, als die bei der ersten Auswahl, anzeigen zu lassen.

Code: Alles auswählen.

module status_0002 output.
  data  lf_layout type LVC_S_LAYO.

  lf_layout-info_fname = 'LINECOLOR'.


  set pf-status 'STATUS_0002'.
  set titlebar 'STATUS_0002'.



  create object custom_container2
    exporting
      container_name              = 'MY_CC2'
    exceptions
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5.
  if sy-subrc ne 0.
* add your handling, for example
    call function 'POPUP_TO_INFORM'
      exporting
        titel = sy-repid
        txt2  = sy-subrc
        txt1  = 'Container2 could not be created!'.
  endif.







  create object grid_alv
    exporting
*      i_parent = cl_gui_custom_container=>screen0.
      i_parent = custom_container2.







  call method grid_alv->set_table_for_first_display
    exporting
      i_structure_name = gf_current_table
      is_layout = lf_layout
    changing
      it_outtab        = <complete>.




endmodule.                 " STATUS_0002  OUTPUT

Hier nochmal ein Bild von Screen1
screen1_1.gif
und hier ein Bild von Screen 2.
screen2_1.gif

Re: ALV erscheint nicht.

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) » 23. Aug 2011 02:56

Kann es sein, daß Du da irgendetwas durcheinandergewürfelt hast?

Es gibt auf der Seite von Deinem Link zwei Reports: ZUS_SDN_TWO_ALV_GRIDS und ZUS_SDN_TWO_SALV_GRIDS.

Re: ALV erscheint nicht.

Beitrag von a-dead-trousers (Top Expert / 3219 / 81 / 800 ) » 23. Aug 2011 07:37

hi!

Ganz einfach:
Du brauchst 2 dynpros mit jeweils einem CustomContainer. Zu beiden instanzierst du ein Objekt der Klasse CL_GUI_CUSTOM_CONTAINER. Lass das mit dem LINK-Aufruf weg (hat bei mir nur immer zu Problemen geführt). Die Instanzen der Klasse übergibst du in der Factory-Methode des SALV mit dem Parameter R_CONTAINER.
bei Doppelklcik musst du dann nur das 2te Dynpro mittels CALL SCREEN aufrufen. Fertig.
Noch etwas zu den cl_gui_control=>screen0 bis cl_gui_control=>screen9 bzw cl_gui_control=>Desktop: Ich würde dir raten die NICHT zu verwenden. Weil diese die jeweilige Dynpro-Ebene(!) repräsentieren und immer das gesamte Dynpro überdecken. Bei einem Aufrufstack Call Screen->PAI->Call Screen->PAI->Call Screen wäre dann der cl_gui_control=>screen2 zu verwenden. Deine SALVs würden bei cl_gui_control=>screen0 nur am ersten Bildschirm angezeigt werden und wenn dein Programm von einem anderen Programm aus aufgerufen wurde, würden sie in diesem angezeigt werden.

Ach ja noch was: Die CustomContainer auf den Dynpros müssen einen eindeutigen Namen besitzen. Sobald zwei Container gleich heißen funktionierts nicht mehr.

lg ADT

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

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

Re: ALV erscheint nicht.

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 23. Aug 2011 09:56

Unit605 hat geschrieben:Kann es sein, daß Du da irgendetwas durcheinandergewürfelt hast?

Es gibt auf der Seite von Deinem Link zwei Reports: ZUS_SDN_TWO_ALV_GRIDS und ZUS_SDN_TWO_SALV_GRIDS.
Ne, das ist so gewollt, dass ich zuerst die klasse cl_gui_alv_grid und dann cl_salv_table verwende. Dürfte ja eigentlich kein Problem darstellen, oder?

merkwürdiges Verhalten

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 23. Aug 2011 12:07

Hallo,

ich kann mir folgenden Programmablauf nicht ganz erklären. Ich befinde mich im Screen2 und lasse mir die Programminformationen ausgeben (OK-Code = 'INFO'), schließe diese und gehe wieder zurück zum Ursprungsscreen1. Ich wähle nun im Screen1 eine andere Tabelle, diese wird aber nicht angezeigt, sondern die Tabelle die zuvor beim Aufruf des Infofensters aktuell war.

Beim zurückgehen wird der Destruktor ausgeführt, allerdings bleibt das Objekt trotzdem am Leben.

Rufe ich den Info-Screen nicht auf funktioniert das Programm tadellos.

Habt ihr dafür ne Erklärung?

Vielen Dank

Code: Alles auswählen.

module user_command_0002 input.


  case ok_code.
   when 'INFO'.
      call function 'DSYS_SHOW_FOR_F1HELP'
        exporting
          dokclass   = 'RE'
          dokname    = 'ZP1_LANGUAGE_ANALYZER'
          short_text = 'X'
        exceptions
          others     = 1.
        clear ok_code.

    when 'BACK'.
      custom_container2->free( ).
      clear ok_code.
      set screen 0001.
    when 'EXIT'.

      leave program.

  endcase.
Zuletzt geändert von Spookykid am 23. Aug 2011 12:12, insgesamt 1-mal geändert.

Re: ALV erscheint nicht.

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 23. Aug 2011 12:10

a-dead-trousers hat geschrieben:hi!

Ganz einfach:
Du brauchst 2 dynpros mit jeweils einem CustomContainer. Zu beiden instanzierst du ein Objekt der Klasse CL_GUI_CUSTOM_CONTAINER. Lass das mit dem LINK-Aufruf weg (hat bei mir nur immer zu Problemen geführt). Die Instanzen der Klasse übergibst du in der Factory-Methode des SALV mit dem Parameter R_CONTAINER.
bei Doppelklcik musst du dann nur das 2te Dynpro mittels CALL SCREEN aufrufen. Fertig.
lg ADT
So habe ich das auch getan. Ich fand es nur etwas merkwürdig, dass ich zuvor im Screen ein CC Element anlegen muss. Hatte Beispiele zum docking_container gelesen und dort ist das halt nicht notwendig.

Lösung

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) » 23. Aug 2011 14:54

Sollte es jemanden interessieren, hier ist eine Lösung für das Problem.

1.

Der cl_gui_custom_container ist eigentlich nicht zur Vollbild-Darstellung konzipiert worden. Auf diesem Blog ist beschrieben, wie das trotzdem möglich ist.
http://sample-code-abap.blogspot.com/20 ... mment-form

2.

Wie schon vorher schon beschrieben löst die Funktion 'DSYS_SHOW_FOR_F1HELP' das Problem aus, das die Referenz auf das Referenzobjekt nicht durch den Dekonstruktor gelöscht wird. Hierzu muss der Dekunstruktor auch nach Aufruf der Funktion angewendet werden.

Code: Alles auswählen.

module user_command_0002 input.


  case ok_code.
   when 'INFO'.

      call function 'DSYS_SHOW_FOR_F1HELP'
        exporting
          dokclass   = 'RE'
          dokname    = 'ZP1_LANGUAGE_ANALYZER'
          short_text = 'X'
        exceptions
          others     = 1.
        clear ok_code.
        custom_container2->free( ).
    when 'BACK'.
      custom_container2->free( ).
      set screen 0001.
    when 'EXIT'.

      leave program.

  endcase.

Re: ALV erscheint nicht.

Beitrag von a-dead-trousers (Top Expert / 3219 / 81 / 800 ) » 23. Aug 2011 15:13

hi!

Noch ne kleine Bemerkung am Rande:
Versuch das ständige Anlegen und wieder Zerstören der Container zu verhindern. Die ALV bzw. SALV-Instanzen können duraus auch merhfach verwendet werden, ohne sie dauernd neu anlegen zu müssen. Du musst nur dafür sorgen, dass die an die beiden Instanzen übergebenenen Tabellen global über den gesamten Programmlauf immer vorhanden sind. Beim Anlegen (ganz einfach mit IF ... IS NOT BOUND) der ALV bzw. der SALV machst du es so wie bisher und bei allen anderen löschst du einfach die globalen Tabellen bzw. schreibst die neuen Daten hinein und rufst bei den Instanzen nur die Refresh-Methoden auf. Damit sollte sich auch das Problem mit dem DSYS_SHOW_FOR_F1HELP erledigen.

lg ADT

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

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

Seite 1 von 1

Aktuelle Forenbeiträge

Langtext zur Exception
vor 11 Stunden von ewx 12 / 136
Feld Symbol in Klasse
vor 15 Stunden von ewx 5 / 89
Eigener Knopf im Ausgabefenster
vor 18 Stunden von DeathAndPain 2 / 44
Welche Entwicklertools?
Gestern von LostDarkness 2 / 936

Unbeantwortete Forenbeiträge

DOCVARIABLE in Worddokument setzen (OLE?)
vor 2 Tagen von msfox 1 / 40
BAPI_PO_CREATE1 und Einkaufsinfosatz
vor 4 Tagen von SweetRuedi 1 / 84
WCOCO: Gruppe für Betragsfelder 0S01
vor 6 Tagen von SAP_ENTWICKLER 1 / 55
CAS-Nr.: Chemical Abstracs Service
vor einer Woche von SAP_ENTWICKLER 1 / 93
Interaktives Skript, Rolle IC-Manager
vor 3 Wochen von erubadhron86 1 / 129