ALV erscheint nicht.


Benutzeroberflächen in SAP®-Systemen.

Moderatoren: Jan, Steff

ALV erscheint nicht.

Beitragvon Spookykid » 22.08.2011, 10: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.
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

Sponsor

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

Re: ALV erscheint nicht.

Beitragvon a-dead-trousers » 22.08.2011, 11: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
a-dead-trousers
Top Expert
 
Beiträge: 3179
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in

Re: ALV erscheint nicht.

Beitragvon Spookykid » 22.08.2011, 12: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)?
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

Re: ALV erscheint nicht.

Beitragvon a-dead-trousers » 22.08.2011, 15: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
a-dead-trousers
Top Expert
 
Beiträge: 3179
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in

Re: ALV erscheint nicht.

Beitragvon Spookykid » 22.08.2011, 15: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
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

Re: ALV erscheint nicht.

Beitragvon Unit605 » 23.08.2011, 01: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.
Unit605
Expert
 
Beiträge: 975
Registriert: 05.02.2009, 21:29
Dank erhalten: 93 mal
Ich bin: Freiberufler/in

Re: ALV erscheint nicht.

Beitragvon a-dead-trousers » 23.08.2011, 06: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
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

Für diese Nachricht hat a-dead-trousers einen Dank bekommen :
Spookykid
a-dead-trousers
Top Expert
 
Beiträge: 3179
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in

Re: ALV erscheint nicht.

Beitragvon Spookykid » 23.08.2011, 08: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?
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

merkwürdiges Verhalten

Beitragvon Spookykid » 23.08.2011, 11: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.08.2011, 11:12, insgesamt 1-mal geändert.
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

Re: ALV erscheint nicht.

Beitragvon Spookykid » 23.08.2011, 11: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.
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

Lösung

Beitragvon Spookykid » 23.08.2011, 13: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.
Spookykid
Specialist
 
Beiträge: 140
Registriert: 23.03.2011, 11:32
Wohnort: Stuttgart
Dank erhalten: 0 mal
Ich bin: Student/in

Re: ALV erscheint nicht.

Beitragvon a-dead-trousers » 23.08.2011, 14: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
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

Für diese Nachricht hat a-dead-trousers einen Dank bekommen :
Spookykid
a-dead-trousers
Top Expert
 
Beiträge: 3179
Registriert: 07.02.2011, 13:40
Dank erhalten: 789 mal
Ich bin: Entwickler/in


Zurück zu Dialogprogrammierung

  Aktuelle Beiträge   
Serialnummern bei BANFen/Bestellungen angeben
vor 12 Stunden von mareikemei92 2 Antw.
Datumsdifferenz berechnen
vor 17 Stunden von DeathAndPain 3 Antw.
Suchhilfe maschinell erstellen
vor 2 Tagen von ralf.wenzel 1 Antw.
Paket transportieren
vor 3 Tagen von a-dead-trousers 1 Antw.
Block makieren
vor 3 Tagen von ralf.wenzel 1 Antw.

  Ähnliche Beiträge beta
Perönliche Werteliste bei F4-Hilfe erscheint nicht autom.
28.04.2006, 16:50 von df62 0 Antw.
GUI-Status Buttons nicht da
18.08.2003, 09:36 von icke 3 Antw.
PF4 Hilfe funktioniert nicht
28.04.2006, 10:48 von Alexander D. 5 Antw.
Dynprofeld nicht ausgegeben
26.10.2006, 16:56 von JHM 12 Antw.
Uline wird nicht gedruckt
29.06.2005, 13:52 von Gast 4 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder