ALV_GRID_DISPLAY Zellenereignis

Getting started ... Alles für einen gelungenen Start.
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

ALV_GRID_DISPLAY Zellenereignis

Beitrag von mknueppel (ForumUser / 26 / 3 / 0 ) »
Hallo Allesamt,

Meine Frage bezieht sich auf die Machbarkeit der Funktionalität eines Doppelklicks auf eine Zelle in der ALV Ausgabe und die anschließende Weiterleitung an eine neue ALV-Ausgabe oder an ein kleines sich öffnendes Fenster mit Inhalten einer beliebigen Struktur.
Zum Beispiel im Programm BALVST02_GRID gibt es die Möglichkeit in der Ausgabe ein Doppelklick auf eine beliebige Zelle zu tätigen und ein kleines Fenster mit zusätzlichen Werten zu erhalten. Nun ist meine Frage welche Parameter der bzw. welcher Fubaus werden dafür gebraucht und in welcher Art und Weise befüllt, wo kann ich dann "neue" Logik hinterlegen?
Ich bin ein "bloody noob" so verzeiht mir bitte manch nicht konkrete Formulierung...

viele Grüße

Manu

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


Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von NoodyHD (ForumUser / 11 / 0 / 1 ) »
Beim klicken auf eine Zelle wird ein Ereignis ausgelöst, dieses musst du Abfangen. Das kannst du im PAI-Modul des jeweiligen Dynpros machen. Dort kannst du auch über Methoden (Get_Selected_Columns/Rows) herausfinden, wo genau geklickt wurde und dementsprechend reagieren.
Such einfach mal nach ein paar Beispielen zum ALV-Grid, davon gibt es massen. Schau dir auch mal die Klasse CL_GUI_ALV_GRID an, damit solltest du schonmal weiterkommen.

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
Hi,

ich würde dir beim ALV zur ABAP-Objects Variante raten: CL_GUI_ALV_GRID

Hier ein einfacher Code Ausschnitt wie du das ganze benutzen kannst:

Code: Alles auswählen.

DATA: go_container         TYPE REF TO cl_gui_custom_container.
DATA: go_grid                 TYPE REF TO cl_gui_alv_grid.
DATA: go_event_receiver TYPE REF TO lcl_event_receiver.
DATA: gv_variant            TYPE disvariant.
DATA: gv_layout              TYPE lvc_s_layo.

 IF go_container IS INITIAL.
*   Create custom controller
    CREATE OBJECT go_container
      EXPORTING
        container_name = 'MY_CONTAINER'.

*   Create grid in the container
    CREATE OBJECT go_grid
      EXPORTING
        i_parent = go_container.

    gv_layout-zebra      = 'X'.
    gv_layout-cwidth_opt = 'X'.

    gv_variant-report     = sy-repid.

    CALL METHOD go_grid->set_table_for_first_display
      EXPORTING
        i_structure_name = 'Z_S_OUTPUT'
        i_save           = 'A'
        is_variant       = gv_variant
        is_layout        = gv_layout
      CHANGING
        it_outtab        = it_out.

    CREATE OBJECT go_event_receiver.
    SET HANDLER go_event_receiver->handle_double_click FOR go_grid.

  ELSE.
       CALL METHOD go_grid->refresh_table_display.
  ENDIF.
Achtung: 'Z_S_OUTPUT' ist hier ja nur ein Beispiel. Du musst einfach deine Struktur nehmen, die du auch für die interne Tabelle it_out genommen hast. Das ganze wird in Hochkomma übergeben, also als String.

Der Contrainer MY_CONTAINER muss auf dem Screen vorher als Custom Element angelegt werden, dafür einfach den Screen Painter nehmen, ein Custome Element auf den Screen ziehen und den Namen MY_CONTAINER nehmen.

Der Doppelklick wird über die lokale Klasse GO_EVENT_RECEIVER implementiert:

Code: Alles auswählen.

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.

    METHODS:
    handle_double_click
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column.
ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_double_click.
    CHECK e_row-rowtype IS INITIAL.
    CHECK NOT e_row-index IS INITIAL.
    READ TABLE it_out INDEX e_row-index INTO wa_out.
    CHECK NOT wa_out-ebeln IS INITIAL.
    SET PARAMETER ID 'BES' FIELD wa_out-ebeln.
    CALL TRANSACTION 'ME23N'.
  ENDMETHOD.   
ENDCLASS.
In dem Beispiel wird beim Doppelklick die Transaktio ME23N (PO anzeigen) aufgerufen.
Du kannst hier aber auch einfach einen weiteren Screen aufrufen.

Also so kann man sehr einfach den ALV programmieren und auch der Doppelklick ist kein Problem.
Ich würde dir wirklich die objekt orientierte Variante raten, da es wirklich einfach ist.

Wenn noch Fragen dazu sind, dann helfe ich dir gerne weiter.

Viele Grüße
weigo

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von mknueppel (ForumUser / 26 / 3 / 0 ) »
Hallo und vielen Dank,

@ Weigo, DATA: go_event_receiver TYPE REF TO lcl_event_receiver. kann ich leider nicht referieren da noch nicht bekannt, wie kann ich das Problem umgehen? Habe mit Oo noch nicht wirklich gearbeitet, wurde prozedural an das Thema Abap herangeführt, lese mich aber gerade in das Thema richtig ein, da ist es bestimmt hilfreich diese Aufgabenstellung Oo zu lösen...Vielleicht hilfts wenn ich euch mein aktuelles Coding zu Verfügung stelle :

Code: Alles auswählen.

 

TABLES: mara,ekko,ekpo,ekab,lfa1, eine,koth006,bpbk,b061,b223,rm06e,t161,mard, zzz_kontrakt1, resb, eket.

DATA it_resb1 LIKE STANDARD TABLE OF resb.
DATA wa_resb1 LIKE LINE OF it_resb1.

DATA it_resb2 LIKE STANDARD TABLE OF resb.
DATA wa_resb2 LIKE LINE OF it_resb2.

DATA icmt TYPE matnr.

DATA: it_mard LIKE TABLE OF mard.
DATA: wa_mard LIKE LINE OF it_mard.

DATA: it_ekab LIKE STANDARD TABLE OF ekab.
DATA: wa_ekab LIKE LINE OF it_ekab.

DATA: it_resb LIKE STANDARD TABLE OF resb.
DATA: wa_resb LIKE LINE OF it_resb.
*
*DATA: it_ekko LIKE STANDARD TABLE OF zzz_kontrakt1.
*DATA: wa_ekko LIKE LINE OF it_ekko.

DATA: it_kont LIKE STANDARD TABLE OF zzz_kontrakt.
DATA: wa_kont LIKE LINE OF it_kont.

DATA: it_eket LIKE STANDARD TABLE OF eket.
DATA: wa_eket LIKE LINE OF it_eket.

DATA: it_mara LIKE STANDARD TABLE OF mara.
DATA: wa_mara LIKE LINE OF it_mara.


TYPE-POOLS: slis.

DATA: lt_fc2      TYPE slis_t_fieldcat_alv,
it_ekko TYPE TABLE OF zzz_kontrakt1 ,
wa_ekko LIKE LINE OF it_ekko.
data: gt_events type slis_t_event.
DATA: G_REPID LIKE SY-REPID.

DATA:


 bestmng TYPE i , matnr TYPE c LENGTH 18,   konnr TYPE c LENGTH 20,   ebelp TYPE c LENGTH 36,
  bestmngo TYPE i , erg1 TYPE i  , erg2 TYPE i , ofmng TYPE i, tatofmng TYPE i , mtart1 TYPE c, int TYPE i.
DATA: ktmng LIKE ekpo-ktmng.



SELECT-OPTIONS:

 ekorg1 FOR b223-ekorg,

ekbel FOR ekko-ebeln ,

 p_matnr FOR mara-matnr ,

 lfnr FOR lfa1-lifnr ,

 ekgrup FOR b061-ekgrp.

*PARAMETERS: detinf AS CHECKBOX.





SELECT ekko~ebeln ekko~kdatb ekko~kdate ekko~lifnr ekko~ekorg ekko~ekgrp ekpo~ebelp  ekpo~matnr ekpo~ktmng   FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln   "ekpo~ebelp
  INTO CORRESPONDING FIELDS OF TABLE it_ekko WHERE ekko~bsart = 'MK' AND ekpo~loekz <> 'L'.

LOOP AT it_ekko INTO wa_ekko.



  DATA: labst LIKE mard-labst, menge LIKE ekab-menge, wemng LIKE eket-wemng, bdmng LIKE resb-bdmng, save1 LIKE resb-bdmng, save2 LIKE resb-bdmng.
  CLEAR: labst, menge, wemng, bdmng, save1, save2.

  SELECT SINGLE SUM( mard~labst )     FROM mard INTO labst WHERE matnr EQ wa_ekko-matnr GROUP BY labst.
  SELECT SINGLE SUM( ekab~menge )  FROM ekab INTO menge WHERE konnr EQ wa_ekko-ebeln GROUP BY menge.

  SELECT eket~wemng  FROM eket
    INNER JOIN ekpo
      ON  eket~ebeln = ekpo~ebeln
      AND eket~ebelp = ekpo~ebelp
    INTO CORRESPONDING FIELDS OF TABLE it_eket
      WHERE ekpo~matnr EQ wa_ekko-matnr
        GROUP BY wemng.

  LOOP AT it_eket INTO wa_eket.

    ADD wa_eket-wemng TO wemng.

  ENDLOOP.


  SELECT resb~bdmng resb~bdter
   FROM resb INTO CORRESPONDING FIELDS OF TABLE it_resb WHERE matnr EQ wa_ekko-matnr AND bdart = 'SB'.

  LOOP AT it_resb INTO wa_resb.
    save1 = wa_resb-bdmng .
    wa_ekko-bdterm = wa_resb-bdter.
  ENDLOOP.
  zzz_kontrakt1-bdterm = wa_ekko-bdterm.



  SELECT resb~bdmng resb~bdter
   FROM resb INTO CORRESPONDING FIELDS OF TABLE it_resb1 WHERE matnr EQ wa_ekko-matnr AND bdart = 'AR'.

  LOOP AT it_resb1 INTO wa_resb1.
    save2 = wa_resb1-bdmng.
    wa_ekko-bdterm = wa_resb1-bdter.
  ENDLOOP.

  wa_ekko-bdmgalg = save1 + save2.

  wa_ekko-labst = labst.
  wa_ekko-menge =  menge .



  bestmngo = wa_ekko-menge - wemng.

*
  erg1 = bestmngo + labst .
**
  erg2 = erg1 - wa_ekko-bdmgalg.

  wa_ekko-ofmng = wa_ekko-ktmng - wa_ekko-menge.
**
  IF erg2 < '0'.  erg2 = '0' - erg2 . ENDIF.

  tatofmng = wa_ekko-ofmng - erg2.



  zzz_kontrakt1-bdterm = wa_ekko-bdterm.
  zzz_kontrakt1-ebeln = wa_ekko-ebeln.
  zzz_kontrakt1-ebelp = wa_ekko-ebelp.
  zzz_kontrakt1-bdmgalg = wa_ekko-bdmgalg.
  zzz_kontrakt1-kdatb = wa_ekko-kdatb.
  zzz_kontrakt1-kdate = wa_ekko-kdate.
  zzz_kontrakt1-matnr = wa_ekko-matnr.
  zzz_kontrakt1-ktmng = wa_ekko-ktmng.
  zzz_kontrakt1-labst = wa_ekko-labst.
  zzz_kontrakt1-menge = wa_ekko-menge.
  zzz_kontrakt1-ofmng = wa_ekko-ofmng.
  zzz_kontrakt1-tatom = tatofmng.
  zzz_kontrakt1-ekorg = wa_ekko-ekorg.
  zzz_kontrakt1-ekgrp = wa_ekko-ekgrp.
  zzz_kontrakt1-lifnr = wa_ekko-lifnr.








  MODIFY zzz_kontrakt1 .




ENDLOOP.


DELETE FROM zzz_kontrakt1 WHERE ebelp = ''.

CLEAR it_ekko.

*select zzz_kontrakt1~ebeln zzz_kontrakt1~kdatb zzz_kontrakt1~kdate zzz_kontrakt1~matnr zzz_kontrakt1~ktmng zzz_kontrakt1~labst zzz_kontrakt1~menge

SELECT *
  FROM zzz_kontrakt1 INTO CORRESPONDING FIELDS OF TABLE it_ekko WHERE ekorg IN ekorg1 AND ebeln IN ekbel AND matnr IN p_matnr AND lifnr IN lfnr AND ekgrp IN ekgrup.




CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
*    I_PROGRAM_NAME               = sy-cprog
*     I_INTERNAL_TABNAME           =
  i_structure_name             = 'ZZZ_KONTRAKT1'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_INCLNAME                   =
*     I_BYPASSING_BUFFER           =
*     I_BUFFER_ACTIVE              =
     CHANGING
       ct_fieldcat                  = lt_fc2
    EXCEPTIONS
      inconsistent_interface       = 1
      program_error                = 2
      OTHERS                       = 3.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
 EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
i_callback_program                =  G_REPID
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
*     IS_LAYOUT                         =
   it_fieldcat                       = lt_fc2
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
*     IT_SORT                           =
*     IT_FILTER                         =
*     IS_SEL_HIDE                       =
*    I_DEFAULT                         = ' '
i_save                            = 'A'


*   IS_VARIANT                        = 'A'
     IT_EVENTS                         = gt_events[]
*     IT_EVENT_EXIT                     =
*     IS_PRINT                          =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 = 0
*     I_HTML_HEIGHT_END                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
  TABLES
    t_outtab                          = it_ekko
 EXCEPTIONS
   program_error                     = 1
   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.



Sorry für die Anfängerfragen...

mfg

Manu
Zuletzt geändert von mknueppel am 22.09.2010 12:52, insgesamt 1-mal geändert.

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von black_adept (Top Expert / 4159 / 136 / 960 ) »
Hallo Manu,

da du das Programm schon mit dem REUSE-Baustein geschrieben hast, würde ich dir raten es auch dabei zu belassen statt auf die OO-Variante zu wechseln - zumal das was du möchtest in der REUSE-Variante mit ein paar Zeilen Coding sehr einfach zu realisieren ist.

1.) Lies dir die Doku zu dem Baustein "REUSE_ALV_LIST_DISPLAY" - durch - hier insbes. die Doku zu den Parametern
- I_CALLBACK_PF_STATUS_SET ( brauchst du aber nicht, falls du nur Doppelklick haben möchtest )
- I_CALLBACK_USER_COMMAND

2.) Hier mal ein winziger Ausschnitt aus einem meiner Programme, welches grad an einer passenden Stelle geöffnet war.
Habe dir nur einen Break-point eingeschleust, damit du siehst, dass der Doppelklick funktioniert. Und nicht daran stören, dass ich die reuse..._lvc-varianten verwende - die älteren reuse-Versionen funktionieren analog

Code: Alles auswählen.

  is_variant-report = sy-repid.
  is_variant-handle = '0001'.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = is_variant-report
      i_callback_pf_status_set = 'ALV_STATUS_SET'
      i_callback_user_command  = 'ALV_USER_COMMAND'
      is_variant               = is_variant
      is_layout_lvc            = is_layout
      it_fieldcat_lvc          = it_fieldcat
      i_default                = 'X'
      i_save                   = 'A'
*      I_GRID_TITLE             = 'Hugo'
    TABLES
      t_outtab                 = gt_data
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.                    " SHOW_DATA


*---------------------------------------------------------------------*
*       FORM ALV_STATUS_SET                                           *
*---------------------------------------------------------------------*
FORM alv_status_set USING rt_extab TYPE slis_t_extab.       "#EC CALLED
  SET PF-STATUS 'ALV' EXCLUDING rt_extab.
ENDFORM.                    "ALV_STATUS_SET


*---------------------------------------------------------------------*
*       FORM ALV_USER_COMMAND                                         *
*---------------------------------------------------------------------*
FORM alv_user_command  CHANGING  r_ucomm LIKE sy-ucomm      "#EC CALLED
                                 rs_selfield TYPE slis_selfield.

  DATA: wa_data LIKE LINE OF gt_data.

  CASE r_ucomm.
    WHEN 'CREATE_LGORT'.
      PERFORM create_data_all CHANGING gt_data.
      rs_selfield-refresh = 'X'.
    WHEN OTHERS.
      break-point.  
  ENDCASE.

  IF rs_selfield-refresh = 'X'.
    rs_selfield-col_stable = 'X'.
    rs_selfield-row_stable = 'X'.
  ENDIF.

ENDFORM.                    "alv_user_command

P.S: Es wäre übrigens nett, wenn du dein vorheriges Posting mal so anpassen könntest, dass dein Coding in einen "CODE"-Block gepackt wird - das macht den Thread viel besser lesbar
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
Hi,

also ob du es nun prozedural oder OO machst, dass ist natürlich dir überlassen.
Viele mögen OO nicht, dabei ist es ziemlich einfach und wichtig, wenn du mit neueren Themen zu tun haben wirst, wie z.B. WebDynpro.
Daher rate ich jedem der mit ABAP anfängt sich mit OO auseinanderzusetzen und auch einfache Reporte OO zu programmieren.
Selbst wenn das vielleicht in manchen Situationen etwas Mehraufwand bedeutet.
Bei ALV Reports ist das eigentlich nicht der Fall, da man keinen Fieldcat braucht und mit einer Handvoll Klassen ein gutes Ergebnis erzielen kann.

Daher bleibe ich bei meiner Variante und beantworte deine Frage:
Du musst lcl_event_receiver vor dem Aufruf deklarieren und am besten auch definieren.

Ich habe es dir vielleicht in der falschen Reihenfolge geschickt, aber wie bei allem muss man erst deklarieren, bevor man es benutzen kann.
So auch bei internen Klassen.

Einfach Fragen, wenn es noch Probleme gibt.

Viele Grüße
weigo

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von mknueppel (ForumUser / 26 / 3 / 0 ) »
Hi,

@Weigo, vielen Dank für die Tips, ich werde jedoch heute versuchen die prozedurale Variante zu realisieren, morgen nehme ich dann die Oo Variante in Angriff, Übung hat noch nie geschadet...

@ Stefan vielen Dank für deine Hilfe, habe noch Probleme mit der Aktual - Formalparameteranzahl,

Code: Alles auswählen.

 G_REPID = sy-repid.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
*    I_PROGRAM_NAME               = sy-cprog
*     I_INTERNAL_TABNAME           =
  i_structure_name             = 'ZZZ_KONTRAKT1'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_INCLNAME                   =
*     I_BYPASSING_BUFFER           =
*     I_BUFFER_ACTIVE              =
     CHANGING
       ct_fieldcat                  = lt_fc2
    EXCEPTIONS
      inconsistent_interface       = 1
      program_error                = 2
      OTHERS                       = 3.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.


CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
 EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
i_callback_program                =  G_REPID
*     I_CALLBACK_PF_STATUS_SET          = ' '
     I_CALLBACK_USER_COMMAND           = ' ALV_USER_COMMAND '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
*     IS_LAYOUT                         =
   it_fieldcat                       = lt_fc2
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
*     IT_SORT                           =
*     IT_FILTER                         =
*     IS_SEL_HIDE                       =
*     I_DEFAULT                         = ' '
      I_SAVE                            = 'A'


*   IS_VARIANT                        = 'A'
*     IT_EVENTS                         = gt_events[]
*     IT_EVENT_EXIT                     =
*     IS_PRINT                          =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 = 0
*     I_HTML_HEIGHT_END                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
  TABLES
    t_outtab                          = it_ekko
 EXCEPTIONS
   program_error                     = 1
   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.


FORM alv_user_command  CHANGING  r_ucomm LIKE sy-ucomm      "#EC CALLED
                                 rs_selfield TYPE slis_selfield.

  DATA: wa_data LIKE LINE OF gt_data.

  CASE r_ucomm.
    WHEN 'CREATE_LGORT'.                                      ""Habe hier meine eigenen Felder mal eingegeben, kann ich bestimmt auch Zeilennummern eingeben?
      PERFORM create_data_all  changing gt_data.     ""Muss hier eine Routine performt werden? Kann ich auch einfach zb. select * from mara inot c. f. o. it_ekko einfügen?
      rs_selfield-REFRESH = 'X'.
    WHEN OTHERS.
      BREAK-POINT.
  ENDCASE.

  IF rs_selfield-REFRESH = 'X'.
    rs_selfield-col_stable = 'X'.
    rs_selfield-row_stable = 'X'.
  ENDIF.

ENDFORM.                    "alv_user_command

form create_data_all.
  select * from mara into corresponding fields of table it_ekko.
    
    
    endform. 
Wenn ich die anweisung changing gt_data weglasse dann komme ich in die ALV Grid Liste und bei Doppelklick gibts dann einen Laufzeitfehler, wenn die Anweisung bestehen bleibt wird der Fehler schon im Programm angezeigt...Ich hoffe ich stell mich nicht zuu ungeschickt an... ^^?


mfg

Manu

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
weigo hat geschrieben:Hi,

also ob du es nun prozedural oder OO machst, dass ist natürlich dir überlassen.
Viele mögen OO nicht, dabei ist es ziemlich einfach und wichtig, wenn du mit neueren Themen zu tun haben wirst, wie z.B. WebDynpro.
Daher rate ich jedem der mit ABAP anfängt sich mit OO auseinanderzusetzen und auch einfache Reporte OO zu programmieren.
Selbst wenn das vielleicht in manchen Situationen etwas Mehraufwand bedeutet.
Bei ALV Reports ist das eigentlich nicht der Fall, da man keinen Fieldcat braucht und mit einer Handvoll Klassen ein gutes Ergebnis erzielen kann.
Und was macht ein OO-Experte wenn er ganz normale prozedural Programme ändern soll?

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von black_adept (Top Expert / 4159 / 136 / 960 ) »
Hallo Manu,

1.) der Name der Callbackroutine darf m.W. keine Leerzeichen enthalten

Code: Alles auswählen.

i_callback_program                =  G_REPID
*     I_CALLBACK_PF_STATUS_SET          = ' '
     I_CALLBACK_USER_COMMAND           = ' ALV_USER_COMMAND '
sollte heißen

Code: Alles auswählen.

i_callback_program                =  G_REPID
*     I_CALLBACK_PF_STATUS_SET          = ' '
     I_CALLBACK_USER_COMMAND           = 'ALV_USER_COMMAND'
2.) ad

Code: Alles auswählen.

CASE r_ucomm.
    WHEN 'CREATE_LGORT'.                                      ""Habe hier meine eigenen Felder mal eingegeben, kann ich bestimmt auch Zeilennummern eingeben?
      PERFORM create_data_all  changing gt_data.     ""Muss hier eine Routine performt werden? Kann ich auch einfach zb. select * from mara inot c. f. o. it_ekko einfügen?
      rs_selfield-REFRESH = 'X'.
    WHEN OTHERS.
      BREAK-POINT.
  ENDCASE.
Es muss natürlich keine Routine performt werden - du kannst da Coding ganz nach Gusto einfügen.
Im Feld r_ucomm steht übrigens der Funktionscode drin, den der ALV ausgelöst hat. Wenn du z.B. einen eigenen Status definierst, kannst du deine eigenen buttons hier abfragen.
Für deinen speziellen Fall, wo du lediglich den Doppelklick abfangen möchtest, reicht es aber aus statt des "CREATE_LGORT" den Funktionscode "&IC1" abzufragen
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von black_adept (Top Expert / 4159 / 136 / 960 ) »
@weigo:


Ich die Erfahrung gemacht, dass die alte Methodik via den REUSE-Bausteinen durchaus noch seine Daseinsberechtigung hat.
Bei mir kommt es von Zeit zu Zeit vor, dass ein Report, der eigentlich nur eine ALV-Ausgabe rausgeben sollte sich im Laufe der Zeit verändert und zwar so, dass jemand auf die Idee kommt, den Report im Hintergrund laufen zu lassen um einen Spool zu erzeugen. Bei Verwendung der REUSE-Bausteine ist in diesem Fall keine Programmänderung mehr nötig - das liefert alles der Standard.

Desweiteren gibt es auf sehr vielen System noch viele Programme aus alten R/3 Zeiten, zu denen es noch gar keine OO-Grids gab. Und wenn ich so ein Programm anpassen muss, werde ich den Teufel tun und es auf OO umstellen, sondern höchstens mal von REUSE...LIST auf REUSE...GRID umstellen. Wird einfach zu teuer für den Kunden und es gibt auch nur wenig, das mit dem OO geht, was mit dem REUSE... nicht auch funktioniert.

Grundsätzlich muss ich dir ja recht geben - OO ist der Weg, den man heutzutage beherrschen sollte. Aber wenn es 2 Möglichkeiten gibt etwas zu realisieren, muss halt jeder für sich entscheiden welches der Weg ist den er beschreitet.

Und im hier vorliegenden Fall würde ich auf jeden Fall zu der prozeduralen Methodik raten weil
a) - das Programm schon so begonnen wurde
und
b) - wenn jemand noch nicht so firm ist in ABAP, ist es einfacher mit den REUSE-Bausteinen. Und wenn ich mir das letzte Posting von Manu anschaue kämpft er/sie momentan noch mehr mit dem ABAP an sich. Für die OO-Variante muss ich doch schon mehr wissen um im Fehlerfall herauszufinden wo ich etwas vergessen habe. ( Handlerklasse anlegen, Events registrieren falls nicht automatisch registriert, Handler registrieren ).
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
Unit605 hat geschrieben:
weigo hat geschrieben:Hi,

also ob du es nun prozedural oder OO machst, dass ist natürlich dir überlassen.
Viele mögen OO nicht, dabei ist es ziemlich einfach und wichtig, wenn du mit neueren Themen zu tun haben wirst, wie z.B. WebDynpro.
Daher rate ich jedem der mit ABAP anfängt sich mit OO auseinanderzusetzen und auch einfache Reporte OO zu programmieren.
Selbst wenn das vielleicht in manchen Situationen etwas Mehraufwand bedeutet.
Bei ALV Reports ist das eigentlich nicht der Fall, da man keinen Fieldcat braucht und mit einer Handvoll Klassen ein gutes Ergebnis erzielen kann.
Und was macht ein OO-Experte wenn er ganz normale prozedural Programme ändern soll?
Also ich behaupte, dass fast jeder prozedural programmieren kann und besonders in ABAP kommt man daran nicht vorbei, keine Frage.
Ich kenne niemand der OOP kann und dann Probleme hat ein prozdurales Programm zu verstehen.
Umgekehrt ist das leider oft der Fall.
Generell sollte man beides verstehen und die Top-Down Methode ist hier definitiv die bessere Strategie.

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von mknueppel (ForumUser / 26 / 3 / 0 ) »
Danke @ all, habs prozedural hinbekommen, werde nun versuchen die Oo Variante zu schreiben.

mfg

Manu

Re: ALV_GRID_DISPLAY Zellenereignis

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
black_adept hat geschrieben:@weigo:


Ich die Erfahrung gemacht, dass die alte Methodik via den REUSE-Bausteinen durchaus noch seine Daseinsberechtigung hat.
Bei mir kommt es von Zeit zu Zeit vor, dass ein Report, der eigentlich nur eine ALV-Ausgabe rausgeben sollte sich im Laufe der Zeit verändert und zwar so, dass jemand auf die Idee kommt, den Report im Hintergrund laufen zu lassen um einen Spool zu erzeugen. Bei Verwendung der REUSE-Bausteine ist in diesem Fall keine Programmänderung mehr nötig - das liefert alles der Standard.

Desweiteren gibt es auf sehr vielen System noch viele Programme aus alten R/3 Zeiten, zu denen es noch gar keine OO-Grids gab. Und wenn ich so ein Programm anpassen muss, werde ich den Teufel tun und es auf OO umstellen, sondern höchstens mal von REUSE...LIST auf REUSE...GRID umstellen. Wird einfach zu teuer für den Kunden und es gibt auch nur wenig, das mit dem OO geht, was mit dem REUSE... nicht auch funktioniert.

Grundsätzlich muss ich dir ja recht geben - OO ist der Weg, den man heutzutage beherrschen sollte. Aber wenn es 2 Möglichkeiten gibt etwas zu realisieren, muss halt jeder für sich entscheiden welches der Weg ist den er beschreitet.

Und im hier vorliegenden Fall würde ich auf jeden Fall zu der prozeduralen Methodik raten weil
a) - das Programm schon so begonnen wurde
und
b) - wenn jemand noch nicht so firm ist in ABAP, ist es einfacher mit den REUSE-Bausteinen. Und wenn ich mir das letzte Posting von Manu anschaue kämpft er/sie momentan noch mehr mit dem ABAP an sich. Für die OO-Variante muss ich doch schon mehr wissen um im Fehlerfall herauszufinden wo ich etwas vergessen habe. ( Handlerklasse anlegen, Events registrieren falls nicht automatisch registriert, Handler registrieren ).
Also ich hatte es ja schon vorher erwähnt, jeder sollte selbst entscheiden und es stimmt, dass es natürlich alte Systeme gibt oder alte Programme, die man sicher nicht umstellen braucht.
Ich glaube, dass man OOP, besonders Reporting sehr schnell lernen kann und es nicht schwerer ist als die alten FuBas zu benutzen.

Um das noch einmal zusammenzufassen:
OOP ist nicht der einzige Weg und man sollte langfristig alle Wege kennen, um in allen Fällen die beste Lösung entwickeln zu können.
Als Anfänger sollte man sich je nach Anforderung fragen, ob man den einen oder den anderen Weg wählt.
Z.B. kommen viele aus der Java oder C++ Ecke und da ist OOP kein Problem, auch wenn ABAP seine Eigenheiten hat.
Kann man kein OOP, dann ist der Overhead vielleicht etwas schwer und wenn man keine Zeit hat und eine schnelle Lösung braucht, dann sind die alten FuBas sicher eine gute Alternative (dazu gibt es ja auch unendlich viele Beispiele im Netz). Arbeitet man auf einem alten System, dann muss man auf OOP natürlich verzichten.
Fazit: Wir sollten Manu hier einfach helfen und ich hatte angenommen, dass mein Beispiel verständlich ist und schnell implementiert werden kann. Aber wahrscheinlich habt ihr Recht und man sollte das Programm jetzt nicht komplett auseinandernehmen und die Probleme lieber lösen so wie sie sind.
@Manu: Vielleicht einfach in Zukunft, wenn mal ein bisschen Zeit da ist, versuchen ein kleines OOP Programm zu schreiben (mein Beispiel hilft da sicher weiter) und dann einfach selbst entscheiden, was für dich der bessere und einfacherer Weg ist.

Seite 1 von 1

Vergleichbare Themen

6
Antw.
8647
Views
Checkbox-Inhalt bei REUSE-ALV-GRID-DISPLAY-LVC
von Ucke » 19.11.2006 21:18 • Verfasst in ABAP® Core
2
Antw.
6690
Views
message (...) DISPLAY LIKE
von an4kh4 » 21.03.2007 14:42 • Verfasst in ABAP® für Anfänger
4
Antw.
13453
Views
Set table for first display
von pippi1710 » 27.10.2011 10:34 • Verfasst in ABAP® für Anfänger
0
Antw.
9447
Views
display a Internal table on a SmartForm
von jamiguel77 » 31.12.2014 20:15 • Verfasst in ABAP® für Anfänger
0
Antw.
100374
Views
VOLL Artikel in einem Display Typ 12
von ThomasM84 » 10.11.2025 17:03 • Verfasst in Tutorials & Cookbooks

Aktuelle Forenbeiträge

BAPI zur ABSO?
vor einer Woche von DeathAndPain 2 / 1038
Materialstammerweiterung: Neuer Reiter
vor 3 Wochen von DeathAndPain gelöst 4 / 1725
Ermittlung der Arbeitstage (Mosid)
vor 3 Wochen von Radinator 11 / 47407
LSMW-Problem
vor 4 Wochen von DeathAndPain gelöst 6 / 5297

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

BAPI zur ABSO?
vor einer Woche von DeathAndPain 2 / 1038
Materialstammerweiterung: Neuer Reiter
vor 3 Wochen von DeathAndPain gelöst 4 / 1725
Ermittlung der Arbeitstage (Mosid)
vor 3 Wochen von Radinator 11 / 47407
LSMW-Problem
vor 4 Wochen von DeathAndPain gelöst 6 / 5297