01-30-2021 2:00 PM
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
01-30-2021 2:40 PM
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.
01-31-2021 9:40 AM
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
02-01-2021 12:33 PM
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?