Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

How to capture Hotspot value in ALV OO

former_member574106
Participant
0 Kudos
Hi Friends,
I am making my first OOALV and my first smartform. I am
currently facing two issues. 

1) I have to capture the value of the field VBELN which i am
triggering using hotspot. I know in normal ALV, but how to do it in OOPS ALV.

2)
I am combining data from VBAK, VBAP, VBPA, KNA1, VBKD, MAKT to be sent as an
I_FINAL to the smartform. I  am using nested loops for fetching MAKTX from MAKT
table. Due to this, my program is getting timed out. How to do it without using
nested loops. Please check the complete code.  

Regards,
Saurav Lahiry



*&---------------------------------------------------------------------*

*& Include ZALV_SMARTFORMTOP                                 Report ZALV_SMARTFORM

*&

*&---------------------------------------------------------------------*



REPORT zalv_smartform.

TABLES : vbak, vbpa, kna1,vbap, makt, vbkd.

TYPES : BEGIN OF ty_vbak ,

       vbeln TYPE vbak-vbeln,

       erdat TYPE vbak-erdat,

       ernam TYPE vbak-ernam,

       audat TYPE vbak-audat,

       vbtyp TYPE vbak-vbtyp,

       vkorg TYPE vbak-vkorg,

       vtweg TYPE vbak-vtweg,

       spart TYPE vbak-spart,

       vkgrp TYPE vbak-vkgrp,

       vkbur TYPE vbak-vkbur,

       kunnr TYPE vbak-kunnr,

       END OF ty_vbak.

DATA : i_vbak TYPE STANDARD TABLE OF ty_vbak,

       wa_vbak TYPE ty_vbak.

TYPES : BEGIN OF ty_vbpa,

        vbeln TYPE vbpa-vbeln,

        kunnr TYPE vbpa-kunnr,

        END OF ty_vbpa.

TYPES : BEGIN OF ty_vbap,

        vbeln TYPE vbap-vbeln,

        posnr TYPE vbap-posnr,

        kwmeng TYPE vbap-kwmeng,

        matnr  TYPE vbap-matnr,

        END OF ty_vbap.



DATA : alv_container TYPE REF TO cl_gui_custom_container,

       alv_grid TYPE REF TO cl_gui_alv_grid,

       layout TYPE lvc_s_layo,

       it_fieldcat TYPE lvc_t_fcat,

       wa_fieldcat TYPE lvc_s_fcat.

DATA : i_vbpa TYPE STANDARD TABLE OF ty_vbpa,

       i_vbap TYPE STANDARD TABLE OF ty_vbap,

       wa_vbpa TYPE ty_vbpa,

       wa_vbap TYPE ty_vbap.

TYPES : BEGIN OF ty_kna1,

        kunnr TYPE kna1-kunnr,

        name1 TYPE kna1-name1,

        ort01 TYPE kna1-ort01,

        pstlz TYPE kna1-pstlz,

        regio TYPE kna1-regio,

        telf1 TYPE kna1-telf1,

        telfx TYPE kna1-telfx,

        END OF ty_kna1.

DATA : i_kna1 TYPE STANDARD TABLE OF ty_kna1,

       wa_kna1 TYPE ty_kna1.

TYPES : BEGIN OF ty_makt,

        matnr TYPE makt-matnr,

        maktx TYPE makt-maktx,

        END OF ty_makt.

DATA : i_makt TYPE STANDARD TABLE OF ty_makt,

       wa_makt TYPE ty_makt.

TYPES : BEGIN OF ty_vbkd,

        vbeln TYPE vbkd-vbeln,

        kdgrp TYPE vbkd-kdgrp,

        END OF ty_vbkd.

DATA : i_vbkd TYPE STANDARD TABLE OF ty_vbkd,

       wa_vbkd TYPE ty_vbkd.

TYPES : BEGIN OF ty_final,

        vbeln TYPE vbak-vbeln,

        erdat TYPE vbak-erdat,

        ernam TYPE vbak-ernam,

        auart TYPE vbak-auart,

        posnr TYPE vbap-posnr,

        matnr TYPE makt-matnr,

        MAKTX TYPE makt-maktx,

        kunnr TYPE vbpa-kunnr,

        kdgrp TYPE vbkd-kdgrp,

        vkorg TYPE vbak-vkorg,

        vtweg TYPE vbak-vtweg,

        spart TYPE vbak-spart,

        vkgrp TYPE vbak-vkgrp,

        kwmeng TYPE vbap-kwmeng,

        END OF ty_final.

DATA : i_final TYPE STANDARD TABLE OF ty_final,

       wa_final TYPE ty_final.

DATA : l_kunnr TYPE kna1-kunnr,

       l_name1 TYPE kna1-name1,

       l_ort01 TYPE kna1-ort01.


 


*&---------------------------------------------------------------------*

*& Report  ZALV_SMARTFORM

*&

*&---------------------------------------------------------------------*

*&

*&

*&---------------------------------------------------------------------*



INCLUDE zalv_smartformtop                       .    " global Data



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



SELECT-OPTIONS : so_vbeln FOR vbak-vbeln,

                 so_erdat FOR vbak-erdat,

                 so_vkorg FOR vbak-vkorg.

PARAMETERS :     p_lay LIKE disvariant-variant.

SELECTION-SCREEN END OF BLOCK b1.



AT SELECTION-SCREEN ON BLOCK b1.

CLASS lcl_events_d0100 DEFINITION.

  PUBLIC SECTION.

    METHODS : handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id

                                                                                        e_column_id

                                                                                        es_row_no.

ENDCLASS.





DATA : gr0100 TYPE REF TO lcl_events_d0100.

CLASS lcl_events_d0100 IMPLEMENTATION.

  METHOD handle_hotspot_click.

    DATA : ls_col_id TYPE lvc_s_col.



    PERFORM message USING e_row_id e_column_id.





    CALL METHOD alv_grid->set_current_cell_via_id

      EXPORTING

        is_row_id    = e_row_id

        is_column_id = ls_col_id






  ENDMETHOD.

ENDCLASS.



START-OF-SELECTION.

  PERFORM fetch_data.

*PERFORM display_alv.

  CALL SCREEN 101.

*END-OF-SELECTION.



*&---------------------------------------------------------------------*

*&      Form  FETCH_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM fetch_data .

  SELECT vbeln

         erdat

         audat

         ernam

         vbtyp

         vkorg

         vtweg

         spart

         vkgrp

         vkbur

         kunnr

         FROM vbak INTO CORRESPONDING FIELDS OF  wa_vbak

         WHERE vbeln IN so_vbeln

         AND  erdat  IN so_erdat

         AND  vkorg  IN so_vkorg.

    APPEND wa_vbak TO i_vbak.

    CLEAR wa_vbak.

  ENDSELECT.



  IF NOT i_vbak[] IS INITIAL.

* Fetching partner details

    SELECT vbeln

           kunnr

           FROM vbpa INTO CORRESPONDING FIELDS OF TABLE i_vbpa

           FOR ALL ENTRIES IN i_vbak

           WHERE kunnr = i_vbak-kunnr.



  ENDIF.

  LOOP AT i_vbak INTO wa_vbak.

    READ TABLE i_vbpa INTO wa_vbpa WITH KEY vbeln = wa_vbak-vbeln.

    wa_vbak-kunnr = wa_vbpa-kunnr.

    MODIFY i_vbak FROM wa_vbak TRANSPORTING kunnr.

    CLEAR wa_vbak.

  ENDLOOP.

* Fetching customer details

  SELECT kunnr

         name1

         stras

         ort01

         regio

         pstlz

         telf1

         telfx

         FROM kna1

         INTO CORRESPONDING FIELDS OF TABLE i_kna1

         FOR ALL ENTRIES IN i_vbak

         WHERE kunnr = i_vbak-kunnr.



ENDFORM.                   " FETCH_DATA

**&---------------------------------------------------------------------*

**&      Module  STATUS_0100  OUTPUT

**&---------------------------------------------------------------------*

**       text

**----------------------------------------------------------------------*



*ENDMODULE.                 " STATUS_0100  OUTPUT



*&---------------------------------------------------------------------*

*&      Module  STATUS_0101  OUTPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE status_0101 OUTPUT.

  SET PF-STATUS 'ZSTATUS'.





  CREATE OBJECT alv_container

    EXPORTING

*     parent         =

      container_name = 'CONT'


  IF sy-subrc <> 0.

*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.



  CREATE OBJECT alv_grid

    EXPORTING



      i_parent = alv_container


    .

  IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.







  PERFORM alv_fieldcat.

  PERFORM display_alv.



ENDMODULE.

*ENDCLASS.                " STATUS_0101  OUTPUT

*&---------------------------------------------------------------------*

*&      Module  USER_COMMAND_0101  INPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE user_command_0101 INPUT.

  DATA : ok_code TYPE sy-ucomm.

  CASE ok_code.

    WHEN 'BACK' OR 'SAVE'.

      LEAVE TO SCREEN 0.

  ENDCASE.





ENDMODULE.                 " USER_COMMAND_0101  INPUT

*&---------------------------------------------------------------------*

*&      Form  DISPLAY_ALV

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM display_alv .




  CALL METHOD alv_grid->set_table_for_first_display


    CHANGING

      it_outtab       = i_vbak[]

      it_fieldcatalog = it_fieldcat


  IF sy-subrc <> 0.

* Implement suitable error handling here

  ENDIF.

  CREATE OBJECT gr0100.

  SET HANDLER gr0100->handle_hotspot_click FOR alv_grid.



ENDFORM.                    " DISPLAY_ALV

*&---------------------------------------------------------------------*

*&      Form  ALV_FIELDCAT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM alv_fieldcat .

  wa_fieldcat-fieldname = 'VBELN'.

  wa_fieldcat-col_pos = '1'.

  wa_fieldcat-outputlen = '5'.

  wa_fieldcat-hotspot   = 'X'.

  wa_fieldcat-scrtext_l = 'Sales Document No'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'ERDAT'.

  wa_fieldcat-col_pos = '2'.

  wa_fieldcat-outputlen = '10'.

  wa_fieldcat-scrtext_l = 'Creation Date'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'VBTYP'.

  wa_fieldcat-col_pos = '3'.

  wa_fieldcat-outputlen = '10'.

  wa_fieldcat-scrtext_l = 'Document Category'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'VKORG'.

  wa_fieldcat-col_pos = '4'.

  wa_fieldcat-outputlen = '10'.

  wa_fieldcat-scrtext_l = 'Sales Organization'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'VTWEG'.

  wa_fieldcat-col_pos = '5'.

  wa_fieldcat-outputlen = '20'.

  wa_fieldcat-scrtext_l = 'Division'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'SPART'.

  wa_fieldcat-col_pos = '6'.

  wa_fieldcat-outputlen = '5'.

  wa_fieldcat-scrtext_l = 'Sales Group'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'VKBUR'.

  wa_fieldcat-col_pos = '7'.

  wa_fieldcat-outputlen = '10'.

  wa_fieldcat-scrtext_l = 'Sales Office'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



  wa_fieldcat-fieldname = 'KUNNR'.

  wa_fieldcat-col_pos = '8'.

  wa_fieldcat-hotspot = 'X'.

  wa_fieldcat-outputlen = '10'.

  wa_fieldcat-scrtext_l = 'Customer Number'.

  APPEND wa_fieldcat TO it_fieldcat.

  CLEAR  wa_fieldcat.



ENDFORM.                    " ALV_FIELDCAT

*&---------------------------------------------------------------------*

*&      Form  MESSAGE

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_E_ROW_ID  text

*----------------------------------------------------------------------*

FORM message  USING    p_e_row_id TYPE lvc_s_row p_e_column_id TYPE lvc_s_col.

  READ TABLE i_vbak INTO wa_vbak INDEX p_e_row_id-index.

  IF sy-subrc = 0.



*

    CASE p_e_column_id-fieldname.

      WHEN 'VBELN'.







        PERFORM fetch_smartform.

      WHEN 'KUNNR'.



    ENDCASE.

  ENDIF.



ENDFORM.                    " MESSAGE

*&---------------------------------------------------------------------*

*&      Form  FETCH_SMARTFORM

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM fetch_smartform .

* Fetching item data

  IF NOT i_vbak[] IS INITIAL.

    SELECT vbeln

           posnr

           kwmeng

           matnr

           FROM vbap INTO CORRESPONDING FIELDS OF TABLE i_vbap

           FOR ALL ENTRIES IN i_vbak

           WHERE vbeln = i_vbak-vbeln.

  ENDIF.



* Fetching material details

  SELECT matnr

         maktx

         FROM makt INTO CORRESPONDING FIELDS OF TABLE i_makt

         FOR ALL ENTRIES IN i_vbap

         WHERE matnr = i_vbap-matnr.



  LOOP AT i_vbak INTO wa_vbak.

    MOVE-CORRESPONDING wa_vbak TO wa_final.

    READ TABLE i_vbap INTO wa_vbap WITH KEY vbeln = wa_vbak-vbeln.

    IF sy-subrc = 0.

      wa_final-posnr = wa_vbap-posnr.

      wa_final-kwmeng = wa_vbap-kwmeng.



    ENDIF.

    READ TABLE i_vbpa INTO wa_vbpa WITH KEY vbeln = wa_vbak-vbeln.

    IF sy-subrc = 0.

      wa_final-kunnr = wa_vbpa-kunnr.

    ENDIF.



    READ TABLE i_vbkd INTO wa_vbkd WITH KEY vbeln = wa_vbak-vbeln.

    IF sy-subrc = 0.

      wa_final-kdgrp = wa_vbkd-kdgrp.

    ENDIF.





    LOOP AT i_vbap INTO wa_vbap WHERE vbeln = wa_vbak-vbeln.

      READ TABLE i_makt INTO wa_makt WITH KEY matnr = wa_vbap-matnr.

      IF sy-subrc = 0.

        wa_final-matnr = wa_makt-matnr.

        wa_final-maktx = wa_makt-maktx.

      ENDIF.

    ENDLOOP.

    APPEND wa_final TO i_final.

    CLEAR : wa_final, wa_vbpa, wa_vbap, wa_makt, wa_vbkd.

  ENDLOOP.

  IF NOT i_vbak[] IS INITIAL.

    LOOP AT i_vbak INTO wa_vbak.

      READ TABLE i_kna1 INTO wa_kna1 WITH KEY kunnr = wa_vbak-kunnr.

      IF sy-subrc = 0.

        l_kunnr = wa_kna1-kunnr.

        l_name1 = wa_kna1-name1.

        l_ort01 = wa_kna1-ort01.

      ENDIF.

      CLEAR : wa_kna1.

    ENDLOOP.

  ENDIF.



 DATA : fm_name TYPE rs38l_fnam.

 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

   EXPORTING

     formname                 = 'ZSMART_SALES'


  IMPORTING

    FM_NAME                  = fm_name

  EXCEPTIONS

    NO_FORM                  = 1

    NO_FUNCTION_MODULE       = 2

    OTHERS                   = 3

           .

 IF sy-subrc <> 0.

* Implement suitable error handling here

 ENDIF.



 CALL FUNCTION fm_name

   EXPORTING

     v_kunnr                    = l_kunnr

     v_name1                    = l_name1

     v_ort01                    = l_ort01



   TABLES

     it_final                   = i_final

  EXCEPTIONS

    FORMATTING_ERROR           = 1

    INTERNAL_ERROR             = 2

    SEND_ERROR                 = 3

    USER_CANCELED              = 4

    OTHERS                     = 5

           .

 IF sy-subrc <> 0.

* Implement suitable error handling here

 ENDIF.

 CLEAR : l_kunnr, l_name1, l_ort01, i_final.



ENDFORM.                    " FETCH_SMARTFORM


 
3 REPLIES 3

Sandra_Rossi
Active Contributor

Please check your question after posting, currently there are blank lines between the ABAP lines. Your code is too big, you'd better post only the relevant part of the code, or attach the program in a text file.

Concerning the hotspot, I see that you already have the code (event HOTSPOT_CLICK, etc.), you know which row and which column is clicked so the only thing left is to read your ALV table. I think there are many examples in the Web.

Concerning this SELECT which times out, I guess I_VBAP is empty so the whole table MAKT is read. Please check that using debug. Solution: don't read MAKT if I_VBAP is empty.

  SELECT matnr maktx FROM makt 
         INTO CORRESPONDING FIELDS OF TABLE i_makt
         FOR ALL ENTRIES IN i_vbap
         WHERE matnr = i_vbap-matnr.

NB: in the PBO, you should never instantiate the controls every time, do it only once.

0 Kudos

Hi Sandra,

Thanks for the tips. Regarding the issues

1) I added a new method for GET_CURRENT_CELL, but the value of VBELN is coming blank, while fetching the particular cell no.

2) I did debugging for I_VBAP, but the data is coming inside the table. Then, why is the issue coming.

Please check the attachments.

Regards,

Saurav Lahirycode.txtdebug.jpeg

0 Kudos

1) You don't need to use GET_CURRENT_CELL, just read your "ALV table" (i.e. the internal table that you transmit to ALV)

2) Didn't you say that you had a timeout? Now, you don't have a timeout anymore. What is your question?