Technology Blog Posts by Members
cancel
Showing results for 
Search instead for 
Did you mean: 

This blog consists of Basic code's of ABAP which can help most of the Beginner to understand and use it with simple replacements.....

Content of the post.

  1. Display of Data using REUSE_ALV_GRID
  2. Display of data using Class method and also screen validation error
  3. Modify Table in runtime using REUSE_ALV_GRID_DISPLAY.
  4. Error handling using message class code.
  5. Spool Generation code.
  6. Selection Screen code for visibility of parameters according to requirements.
  7. Excel upload using TEXT_CONVERT_XLS_TO_SAP
  8. Table Maintenance code for Create, display and update data without SM30 and excel upload of data to create data using FM 'ALSM_EXCEL_TO_INTERNAL_TABLE'
  9. Send Mail with Excel and PDF attachments.


1. Display of Data using REUSE_ALV_GRID

REPORT ZASSESSMENT1.

TABLES : BSEG, MARA, MARD.

TYPE-POOLS : SLIS.

*INPUTS
PARAMETERS : R_ACCNO TYPE BSEG-BELNR,
R_FYEAR TYPE BSEG-GJAHR.

*DECLARATIONS OF NEEDED COMPONENTS
DATA : IT_BSEG TYPE STANDARD TABLE OF BSEG,
WA_BSEG TYPE BSEG,
IT_MARA TYPE STANDARD TABLE OF MARA,
WA_MARA TYPE MARA,
IT_MARD TYPE STANDARD TABLE OF MARD,
WA_MARD TYPE MARD.

*CREATING TABLE STRUCTURE FOR FINAL OUTPUT
TYPES : BEGIN OF TY_STRUC,

MATNR TYPE BSEG-MATNR,
BELNR TYPE BSEG-BELNR,
GJAHR TYPE BSEG-GJAHR,
ERNAM TYPE MARA-ERNAM,
AENAM TYPE MARA-AENAM,
LGORT TYPE MARD-LGORT,
END OF TY_STRUC.

DATA : IT_FINAL TYPE STANDARD TABLE OF TY_STRUC,
WA_FINAL TYPE TY_STRUC.

DATA : IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
WA_FIELDCAT LIKE LINE OF IT_FIELDCAT.

*CONDITION FOR TAKING INPUTS AND ALSO ADDING DATA OF BSEG IN THE INTERNAL TABLE.
IF R_ACCNO IS NOT INITIAL AND R_FYEAR IS NOT INITIAL.

SELECT BELNR MATNR GJAHR FROM BSEG INTO CORRESPONDING FIELDS OF TABLE IT_BSEG WHERE BELNR = R_ACCNO AND GJAHR = R_FYEAR.

ELSEIF R_ACCNO IS NOT INITIAL AND R_FYEAR IS INITIAL.

SELECT BELNR MATNR GJAHR FROM BSEG INTO CORRESPONDING FIELDS OF TABLE IT_BSEG WHERE BELNR = R_ACCNO.

ELSEIF R_ACCNO IS INITIAL AND R_FYEAR IS NOT INITIAL.

SELECT BELNR MATNR GJAHR FROM BSEG INTO CORRESPONDING FIELDS OF TABLE IT_BSEG WHERE GJAHR = R_FYEAR.

ELSEIF R_ACCNO IS INITIAL AND R_FYEAR IS INITIAL.

SELECT BELNR MATNR GJAHR FROM BSEG INTO CORRESPONDING FIELDS OF TABLE IT_BSEG.

ENDIF.

*DELETING THE DUPLICATES WITH RESPECT TO MATNR
*DELETE ADJACENT DUPLICATES FROM IT_BSEG COMPARING MATNR.

*NOW ADDING CONTENT OF MARA AND MARD INTO THE INTERNAL TABLE RESPECTIVELY USING MATNR AS FOREIGN KEY
SELECT MATNR ERNAM AENAM FROM MARA INTO CORRESPONDING FIELDS OF TABLE IT_MARA FOR ALL ENTRIES IN IT_BSEG WHERE MATNR = IT_BSEG-MATNR.

SELECT MATNR LGORT FROM MARD INTO CORRESPONDING FIELDS OF TABLE IT_MARD FOR ALL ENTRIES IN IT_MARA WHERE MATNR = IT_MARA-MATNR.

*MERGING ALL THE DATA INTO FINAL INTERNAL TABLE
LOOP AT IT_BSEG INTO WA_BSEG.

READ TABLE IT_MARA INTO WA_MARA WITH KEY MATNR = WA_BSEG-MATNR .

READ TABLE IT_MARD INTO WA_MARD WITH KEY MATNR = WA_MARA-MATNR.

WA_FINAL-MATNR = WA_MARA-MATNR.
WA_FINAL-BELNR = WA_BSEG-BELNR.
WA_FINAL-GJAHR = WA_BSEG-GJAHR.
WA_FINAL-ERNAM = WA_MARA-ERNAM.
WA_FINAL-AENAM = WA_MARA-AENAM.
WA_FINAL-LGORT = WA_MARD-LGORT.

APPEND WA_FINAL TO IT_FINAL.

ENDLOOP.

*DELETING THE DUPLICATES WITH RESPECT TO MATNR
DELETE ADJACENT DUPLICATES FROM IT_FINAL COMPARING MATNR.

WA_FIELDCAT-FIELDNAME = 'MATNR'.
WA_FIELDCAT-SELTEXT_M = 'MATERIAL NUMBER'.
WA_FIELDCAT-OUTPUTLEN = '18'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = 'BELNR'.
WA_FIELDCAT-SELTEXT_M = 'ACCOUNT DOCUMENT NUMBER'.
WA_FIELDCAT-OUTPUTLEN = '10'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = 'GJAHR'.
WA_FIELDCAT-SELTEXT_M = 'FISCAL YEAR'.
WA_FIELDCAT-OUTPUTLEN = '4'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = 'ERNAM'.
WA_FIELDCAT-SELTEXT_M = 'CREATED BY'.
WA_FIELDCAT-OUTPUTLEN = '12'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = 'AENAM'.
WA_FIELDCAT-SELTEXT_M = 'CHANGED BY'.
WA_FIELDCAT-OUTPUTLEN = '12'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = 'LGORT'.
WA_FIELDCAT-SELTEXT_M = 'STORAGE LOCATION'.
WA_FIELDCAT-OUTPUTLEN = '4'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.




CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
IT_FIELDCAT = IT_FIELDCAT
TABLES
T_OUTTAB = IT_FINAL
* 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.


2. Display of data using Class method and also screen validation error

REPORT ZASSESSMENT2.

PARAMETERS : EMP_ID TYPE PA0000-PERNR.

DATA: WA_PA00 TYPE PA0000,
WA_PA2 TYPE PA0002.

AT SELECTION-SCREEN .

SELECT SINGLE * FROM PA0000 INTO WA_PA00 WHERE PERNR = EMP_ID.
SELECT SINGLE * FROM PA0002 INTO WA_PA2 WHERE PERNR = WA_PA00-PERNR.

IF WA_PA2-PERNR IS INITIAL.
MESSAGE 'EMPLOYEE NOT PRESENT' TYPE 'E'.

ENDIF.

CLASS EMP_MAIN DEFINITION.
PUBLIC SECTION.
METHODS : GET_DATA,
DISPLAY.

PRIVATE SECTION.
DATA: IT_PA02 TYPE STANDARD TABLE OF PA0002,
WA_PA02 TYPE PA0002.


TYPES: BEGIN OF TY_STRUC,
EMP_ID TYPE PA0002-PERNR,
LAST_NAME TYPE PA0002-NACHN,
FIRST_NAME TYPE PA0002-VORNA,
DOB TYPE PA0002-GBDAT,
GENDER TYPE ZGENDER,

END OF TY_STRUC.


DATA : IT_ANS TYPE STANDARD TABLE OF TY_STRUC,
WA_ANS TYPE TY_STRUC.

ENDCLASS.

CLASS EMP_MAIN IMPLEMENTATION.
METHOD GET_DATA.


SELECT PERNR NACHN VORNA GBDAT GESCH FROM PA0002 INTO CORRESPONDING FIELDS OF TABLE ME->IT_PA02 WHERE PERNR = EMP_ID.

LOOP AT ME->IT_PA02 INTO ME->WA_PA02.
ME->WA_ANS-EMP_ID = ME->WA_PA02-PERNR.
ME->WA_ANS-LAST_NAME = ME->WA_PA02-NACHN.
ME->WA_ANS-FIRST_NAME = ME->WA_PA02-VORNA.
ME->WA_ANS-DOB = ME->WA_PA02-GBDAT.

IF ME->WA_PA02-GESCH = 1.
ME->WA_ANS-GENDER = 'M-YES'.
ELSE.
ME->WA_ANS-GENDER = 'F-YES'.
ENDIF.

APPEND ME->WA_ANS TO ME->IT_ANS.

ENDLOOP.

ENDMETHOD.

METHOD DISPLAY.
DATA : LR_TABLE TYPE REF TO CL_SALV_TABLE.
CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = LR_TABLE
CHANGING T_TABLE = ME->IT_ANS ).
LR_TABLE->DISPLAY( ).
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

DATA LR_MAIN TYPE REF TO EMP_MAIN.

CREATE OBJECT LR_MAIN.
LR_MAIN->GET_DATA( ).

LR_MAIN->DISPLAY( ).


3. Modify Table in runtime using REUSE_ALV_GRID_DISPLAY.

REPORT ZASSESSMENT3.

DATA WA_MS TYPE ZMATERIAL_SALES.

TYPE-POOLS : SLIS.

SELECT-OPTIONS: DATE FOR WA_MS-C_DATE.

DATA: IT_SO TYPE TABLE OF ZMATERIAL_SALES,
IT_CY TYPE TABLE OF ZMATERIAL_SALES,
WA_SO TYPE ZMATERIAL_SALES,
WA_CY TYPE ZMATERIAL_SALES.


DATA : IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
WA_FIELDCAT LIKE LINE OF IT_FIELDCAT.

START-OF-SELECTION.

IF DATE IS NOT INITIAL.
PERFORM FETCH USING DATE[] CHANGING IT_SO.
ELSE.
SELECT * FROM ZMATERIAL_SALES INTO TABLE IT_SO.
ENDIF.

IT_CY = IT_SO.

PERFORM FIELD_CATALOG.



CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_USER_COMMAND = 'SAVE'
IT_FIELDCAT = IT_FIELDCAT
TABLES
T_OUTTAB = IT_SO
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 FETCH USING P_DATE LIKE DATE[]
CHANGING P_IT_SO LIKE IT_SO.
SELECT * FROM ZMATERIAL_SALES INTO TABLE P_IT_SO WHERE C_DATE IN P_DATE.

ENDFORM. " FETCH




FORM FIELD_CATALOG .

WA_FIELDCAT-COL_POS = 1.
WA_FIELDCAT-FIELDNAME = 'MATNR'.
WA_FIELDCAT-SELTEXT_M = 'Material no.'.
WA_FIELDCAT-OUTPUTLEN = '18'.
WA_FIELDCAT-KEY = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-COL_POS = 2.
WA_FIELDCAT-FIELDNAME = 'VBELN'.
WA_FIELDCAT-SELTEXT_M = 'Sales Doc no.'.
WA_FIELDCAT-OUTPUTLEN = '10'.
WA_FIELDCAT-KEY = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-COL_POS = 3.
WA_FIELDCAT-FIELDNAME = 'MAT_DESC'.
WA_FIELDCAT-SELTEXT_M = 'Material Discription'.
WA_FIELDCAT-OUTPUTLEN = '40'.
WA_FIELDCAT-EDIT = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-COL_POS = 4.
WA_FIELDCAT-FIELDNAME = 'SAL_DESC'.
WA_FIELDCAT-SELTEXT_M = 'Sales DiscrIption'.
WA_FIELDCAT-OUTPUTLEN = '40'.
WA_FIELDCAT-EDIT = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-COL_POS = 5.
WA_FIELDCAT-FIELDNAME = 'QUANT'.
WA_FIELDCAT-SELTEXT_M = 'Quantity'.
WA_FIELDCAT-OUTPUTLEN = '12'.
WA_FIELDCAT-EDIT = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-COL_POS = 6.
WA_FIELDCAT-FIELDNAME = 'PRICE'.
WA_FIELDCAT-SELTEXT_M = 'Price'.
WA_FIELDCAT-OUTPUTLEN = '4'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-COL_POS = 7.
WA_FIELDCAT-FIELDNAME = 'C_DATE'.
WA_FIELDCAT-SELTEXT_M = 'Date Of Creation'.
WA_FIELDCAT-OUTPUTLEN = '8'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

ENDFORM.


FORM SAVE USING RCOMM TYPE SY-UCOMM
SEL TYPE SLIS_SELFIELD.

CASE SY-UCOMM.
WHEN '&DATA_SAVE'.
LOOP AT IT_SO INTO WA_SO.
CLEAR WA_CY.
READ TABLE IT_CY INTO WA_CY INDEX SY-TABIX.

IF WA_SO NE WA_CY.
WA_CY-MAT_DESC = WA_SO-MAT_DESC.
WA_CY-SAL_DESC = WA_SO-SAL_DESC.
WA_CY-QUANT = WA_SO-QUANT.

MODIFY ZMATERIAL_SALES FROM WA_CY.

IF SY-SUBRC = 0.
MESSAGE 'RECORD HAS BEEN SAVED SUCCESSFULY' TYPE 'S'.
ENDIF.
ENDIF.

CLEAR WA_SO.
ENDLOOP.

ENDCASE.
ENDFORM.

4. Error handling using message class code.

Firstly create msg class using se91 Tcode and then we can use in our code

REPORT ZASSESSMENT4.

TABLES: BSEG,MSEG.

PARAMETERS C_CODE TYPE BSEG-BUKRS.

TYPES: BEGIN OF TY_BM,
BUKRS TYPE BSEG-BUKRS,
GJAHR TYPE BSEG-GJAHR,
MATNR TYPE BSEG-MATNR,
BELNR TYPE BSEG-BELNR,
MBLNR TYPE MSEG-MBLNR,
ZEILE TYPE MSEG-ZEILE,
END OF TY_BM.

DATA: IT_BM TYPE TABLE OF TY_BM,
WA_BM TYPE TY_BM.

DATA: IT_MSEG TYPE STANDARD TABLE OF MSEG,
WA_MSEG TYPE MSEG.

DATA: IT_BSEG TYPE STANDARD TABLE OF BSEG,
WA_BSEG TYPE BSEG.

DATA OBJ TYPE REF TO ZCX_K_ERRORHANDLE.

AT SELECTION-SCREEN.
TRY.
IF C_CODE IS NOT INITIAL.
SELECT GJAHR MATNR BELNR BUKRS FROM BSEG INTO CORRESPONDING FIELDS OF TABLE IT_BSEG WHERE BUKRS = C_CODE.

IF IT_BSEG IS NOT INITIAL.
SELECT MBLNR ZEILE FROM MSEG INTO CORRESPONDING FIELDS OF TABLE IT_MSEG FOR ALL ENTRIES IN IT_BSEG WHERE MBLNR = IT_BSEG-BELNR.
ENDIF.

IF IT_MSEG IS INITIAL.
RAISE EXCEPTION TYPE ZCX_K_ERRORHANDLE
EXPORTING
TEXTID = ZCX_K_ERRORHANDLE=>ZCX_K_ERRORHANDLE.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE ZCX_K_ERRORHANDLE
EXPORTING
TEXTID = ZCX_K_ERRORHANDLE=>INPUT_ERROR.
ENDIF.

CATCH ZCX_K_ERRORHANDLE INTO OBJ.

MESSAGE OBJ TYPE 'E'.

ENDTRY.



CLASS LCL_MAIN DEFINITION.
PUBLIC SECTION.
METHODS : DISPLAY.


ENDCLASS.

CLASS LCL_MAIN IMPLEMENTATION.

METHOD DISPLAY.
DATA : LR_TABLE TYPE REF TO CL_SALV_TABLE.
CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = LR_TABLE
CHANGING T_TABLE = IT_BM ).
LR_TABLE->DISPLAY( ).
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

LOOP AT IT_BSEG INTO WA_BSEG.
READ TABLE IT_MSEG INTO WA_MSEG WITH KEY MBLNR = WA_BSEG-BELNR.

WA_BM-MATNR = WA_BSEG-MATNR.
WA_BM-BUKRS = WA_BSEG-BUKRS.
WA_BM-GJAHR = WA_BSEG-GJAHR.
WA_BM-BELNR = WA_BSEG-BELNR.
WA_BM-MBLNR = WA_MSEG-MBLNR.
WA_BM-ZEILE = WA_MSEG-ZEILE.
APPEND WA_BM TO IT_BM.
CLEAR WA_BM.

ENDLOOP.

DATA LR_MAIN TYPE REF TO LCL_MAIN.

CREATE OBJECT LR_MAIN.

LR_MAIN->DISPLAY( ).


5. Spool Generation code.

REPORT ZASSESSMENT5.

DATA: IT_MS LIKE ZMATERIAL_SALES OCCURS 0 WITH HEADER LINE,
C_DATE LIKE ZMATERIAL_SALES-C_DATE.

DATA: IT_SP LIKE ZSPOOLTABLE OCCURS 0 WITH HEADER LINE.

DATA: GD_SPOOL_NR LIKE TSP01-RQIDENT.

START-OF-SELECTION.

SELECT C_DATE FROM ZMATERIAL_SALES INTO CORRESPONDING FIELDS OF TABLE IT_MS.

DELETE ADJACENT DUPLICATES FROM IT_MS COMPARING C_DATE.

LOOP AT IT_MS.

CLEAR: C_DATE.

C_DATE = IT_MS-C_DATE.

WAIT UP TO 1 SECONDS.


PERFORM SUBMIT_PROGRAM.
PERFORM GET_SPOOL_NUMBER.
PERFORM ADD_SPOOL_NUMBER.

ENDLOOP.



FORM SUBMIT_PROGRAM .

SUBMIT ZASSESSMENT3 WITH DATE = C_DATE
TO SAP-SPOOL
WITHOUT SPOOL DYNPRO
AND RETURN.


ENDFORM. " SUBMIT_PROGRAM



FORM GET_SPOOL_NUMBER .

CLEAR GD_SPOOL_NR.
SELECT SINGLE RQIDENT INTO GD_SPOOL_NR FROM TSP01
WHERE RQCRETIME = ( SELECT MAX( RQCRETIME ) FROM TSP01 WHERE RQCLIENT = SY-MANDT
AND RQOWNER = SY-UNAME ).




ENDFORM. " GET_SPOOL_NUMBER



FORM ADD_SPOOL_NUMBER .

IT_SP-C_DATE = C_DATE.
IT_SP-SPOOL_NO = GD_SPOOL_NR.

APPEND IT_SP.

MODIFY ZSPOOLTABLE FROM IT_SP.
COMMIT WORK.

ENDFORM. " ADD_SPOOL_NUMBER


6. Selection Screen code for visibility of parameters according to requirements.

REPORT ZASSESSMENT7.

INCLUDE ZSELECTION_SCREEN.


**&---------------------------------------------------------------------*
**& Include ZSELECTION_SCREEN
**&---------------------------------------------------------------------*
*DATA: BELNR TYPE BSEG-BELNR,
* GJAHR TYPE BSEG-GJAHR,
* BUKRS TYPE BSEG-BUKRS.
*
*SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
* SELECT-OPTIONS: ACC_NO FOR BELNR NO INTERVALS NO-EXTENSION,
* F_YEAR FOR GJAHR MODIF ID P1 NO INTERVALS NO-EXTENSION,
* C_CODE FOR BUKRS MODIF ID P2 NO INTERVALS NO-EXTENSION.
*
* SELECTION-SCREEN SKIP 1.
*
* SELECTION-SCREEN BEGIN OF LINE.
*
*
* PARAMETERS C1 RADIOBUTTON GROUP RAD1 USER-COMMAND R1 DEFAULT 'X'.
* SELECTION-SCREEN COMMENT 3(26) TEXT-021.
* SELECTION-SCREEN POSITION 30.
* PARAMETERS C2 RADIOBUTTON GROUP RAD1.
* SELECTION-SCREEN COMMENT 32(29) TEXT-022.
* SELECTION-SCREEN END OF LINE.
*
* SELECTION-SCREEN SKIP 1.
*
* SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
* PARAMETERS: V2 AS CHECKBOX MODIF ID VW USER-COMMAND COMM2.
* PARAMETERS: V3 AS CHECKBOX MODIF ID VW USER-COMMAND COMM2.
* PARAMETERS: V4 AS CHECKBOX MODIF ID VW USER-COMMAND COMM2.
* SELECTION-SCREEN END OF BLOCK B2.
*
*SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-003.
* PARAMETERS: V5 AS CHECKBOX MODIF ID VW1.
*
* SELECTION-SCREEN END OF BLOCK B3.
*
* SELECTION-SCREEN END OF BLOCK B1.




AT SELECTION-SCREEN OUTPUT.

IF C1 = 'X'.
SET CURSOR FIELD 'C2'.
LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'VW1'.
SCREEN-ACTIVE = '0'.

MODIFY SCREEN.
ENDIF.


IF V4 = 'X' AND ( V3 = 'X' OR V2 = 'X') .

IF SCREEN-GROUP1 = 'P2'.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.

ENDIF.
IF SCREEN-GROUP1 = 'P1'.
SCREEN-ACTIVE = '1'.
MODIFY SCREEN.
ENDIF.


ELSEIF V4 = 'X'.

IF SCREEN-GROUP1 = 'P1'.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.

ENDIF.
IF SCREEN-GROUP1 = 'P2'.
SCREEN-ACTIVE = '1'.
MODIFY SCREEN.

ENDIF.
ELSE.

IF SCREEN-GROUP1 = 'P2'.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.

ENDIF.
ENDIF.
ENDLOOP.

ENDIF.

IF C2 = 'X'.
SET CURSOR FIELD 'C1'.
LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'VW'.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.
ENDIF.

IF SCREEN-GROUP1 = 'P2'.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.
ENDIF.

ENDLOOP.
ENDIF.


7. Excel upload using TEXT_CONVERT_XLS_TO_SAP

REPORT ZASSESSMENT10.

DATA: IT_TAB TYPE STANDARD TABLE OF ZASSESS10.

DATA: WA_TAB TYPE ZASSESS10.

DATA IT_TYPE(4096) type c occurs 0.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.

PARAMETERS: P_FILE TYPE RLGRAP-FILENAME.

SELECTION-SCREEN END OF BLOCK B1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM GET_FILE.


START-OF-SELECTION.

PERFORM EXCEL_TO_IT_TAB.
PERFORM UPLOAD_DATA.

END-OF-SELECTION.

FORM GET_FILE .

CALL FUNCTION 'F4_FILENAME' "POP UP FOR FETCH
EXPORTING
PROGRAM_NAME = SYST-CPROG
DYNPRO_NUMBER = SYST-DYNNR
* FIELD_NAME = ' '
IMPORTING
FILE_NAME = P_FILE
.

ENDFORM. " GET_FILE




FORM EXCEL_TO_IT_TAB .



CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
I_LINE_HEADER = 'X'
I_TAB_RAW_DATA = IT_TYPE
I_FILENAME = P_FILE
TABLES
I_TAB_CONVERTED_DATA = IT_TAB
EXCEPTIONS
CONVERSION_FAILED = 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.




ENDFORM. " EXCEL_TO_IT_TAB




FORM UPLOAD_DATA .

LOOP AT IT_TAB INTO WA_TAB.

MODIFY ZASSESS10 FROM WA_TAB.
COMMIT WORK.
ENDLOOP.

ENDFORM. " UPLOAD_data

8. Table Maintenance code for Create, display and update data without SM30 and excel upload of data to create data using FM 'ALSM_EXCEL_TO_INTERNAL_TABLE'

REPORT ztable_update.

TYPES : BEGIN OF ty_ztable,
sel TYPE char1.
INCLUDE STRUCTURE ztable.
TYPES : END OF ty_ztable.

DATA : gs_ztable TYPE ty_ztable,
gt_file_data TYPE TABLE OF ztable,
gob_table TYPE REF TO cl_salv_table,
gt_ztable1 TYPE TABLE OF ztable,
gt_ztable TYPE TABLE OF ty_ztable,
gs_zzpp_ztable TYPE ztable,
gv_mark TYPE char01,
gv_field1 TYPE ztable-field1,
gv_field2 TYPE ztable-field2,
gv_field3 TYPE ztable-field3,
gt_excel TYPE TABLE OF alsmex_tabline.

DATA: gs_excel TYPE ole2_object, " Excel object
gs_mapl TYPE ole2_object, " list of workbooks
gs_map TYPE ole2_object, " workbook
gs_zl TYPE ole2_object, " cell
gs_f TYPE ole2_object, " font
gs_column TYPE ole2_object. " Column

CONTROLS: t_tab TYPE TABLEVIEW USING SCREEN 9000.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-501.
PARAMETERS : p_rb1 RADIOBUTTON GROUP grp1 DEFAULT 'X' USER-COMMAND usr1 MODIF ID r1,
p_rb2 RADIOBUTTON GROUP grp1 MODIF ID r1,
p_rb3 RADIOBUTTON GROUP grp1 MODIF ID r1.


SELECTION-SCREEN BEGIN OF BLOCK t11 WITH FRAME TITLE TEXT-502.
PARAMETERS : p_file1 TYPE rlgrap-filename MODIF ID z1.
SELECTION-SCREEN: BEGIN OF LINE,
PUSHBUTTON 1(24) TEXT-105 USER-COMMAND form MODIF ID z1,
END OF LINE.
SELECTION-SCREEN END OF BLOCK t11.


SELECTION-SCREEN BEGIN OF BLOCK t12 WITH FRAME TITLE TEXT-503.
SELECT-OPTIONS :so_pc1 FOR gv_field1 NO-EXTENSION NO INTERVALS MODIF ID z2 ,
so_fpc1 FOR gv_field3 NO-EXTENSION NO INTERVALS MODIF ID z2 ,
so_cc1 FOR gv_field2 NO-EXTENSION NO INTERVALS MODIF ID z2 .
SELECTION-SCREEN END OF BLOCK t12.

SELECTION-SCREEN BEGIN OF BLOCK t13 WITH FRAME TITLE TEXT-504.
SELECT-OPTIONS : so_pc2 FOR gv_field1 NO-EXTENSION NO INTERVALS MODIF ID z3,
so_fpc2 FOR gv_field3 NO-EXTENSION NO INTERVALS MODIF ID z3,
so_cc2 FOR gv_field2 NO-EXTENSION NO INTERVALS MODIF ID z3.
SELECTION-SCREEN END OF BLOCK t13.
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF SCREEN 500 AS WINDOW.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-008 .

SELECTION-SCREEN BEGIN OF LINE.
* YES
PARAMETERS p_y RADIOBUTTON GROUP rad2 USER-COMMAND r1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(10) TEXT-027.
SELECTION-SCREEN POSITION 15.
* NO
PARAMETERS p_n RADIOBUTTON GROUP rad2.
SELECTION-SCREEN COMMENT 18(10) TEXT-028.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN END OF SCREEN 500.

AT SELECTION-SCREEN.
IF sy-ucomm EQ 'FORM'.
PERFORM download_format.
ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1.
PERFORM f4_filename USING p_file1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_pc1-low.
PERFORM Param_F4_help_pc USING so_pc1-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_fpc1-low.
PERFORM Param_F4_help_fpc USING so_fpc1-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_cc1-low.
PERFORM Param_F4_help_cc USING so_cc1-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_pc2-low.
PERFORM Param_F4_help_pc USING so_pc2-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_fpc2-low.
PERFORM Param_F4_help_fpc USING so_fpc2-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_cc2-low.
PERFORM Param_F4_help_cc USING so_cc2-low.

AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'Z1'.
screen-active = COND #( WHEN p_rb1 = 'X' THEN 1
WHEN p_rb2 = 'X' THEN 0
WHEN p_rb3 = 'X' THEN 0 ).
ENDIF.
IF screen-group1 = 'Z2'.
screen-active = COND #( WHEN p_rb1 = 'X' THEN 0
WHEN p_rb2 = 'X' THEN 1
WHEN p_rb3 = 'X' THEN 0 ).
ENDIF.
IF screen-group1 = 'Z3'.
screen-active = COND #( WHEN p_rb1 = 'X' THEN 0
WHEN p_rb2 = 'X' THEN 0
WHEN p_rb3 = 'X' THEN 1 ).
ENDIF.

IF screen-group1 = 'V0' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'V1' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'V2' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'V3' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'C0' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'C1' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'C2' .
screen-active = 0.
ENDIF.
IF screen-group1 = 'C3' .
screen-active = 0.
ENDIF.
MODIFY SCREEN.
ENDLOOP.

START-OF-SELECTION.
IF p_rb1 = 'X'.
PERFORM Create_data.

ELSEIF p_rb2 = 'X'.
PERFORM Update_data.

ELSEIF p_rb3 = 'X'.
PERFORM Display_data.
ENDIF.

END-OF-SELECTION.

FORM Create_data .

DATA: ls_temp_data TYPE ztable,
lt_temp_tab TYPE TABLE OF ztable,
lv_cont TYPE char1.

IF p_file1 IS NOT INITIAL.
IF ( p_file1 CP '*xls' OR p_file1 CP '*xlsx' ).
TRY.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file1
i_begin_col = 1
i_begin_row = 2
i_end_col = '30'
i_end_row = '999999'
TABLES
intern = gt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'Excel File Conversion Error' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
CATCH cx_root INTO DATA(lob_oref).
MESSAGE lob_oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

LOOP AT gt_excel ASSIGNING FIELD-SYMBOL(<lfs_excel>).
IF ls_temp_data-field1 IS NOT INITIAL
AND ls_temp_data-field3 IS NOT INITIAL
AND ls_temp_data-field2 IS NOT INITIAL
AND <lfs_excel>-col <> 1
AND line_exists( lt_temp_tab[ field1 = ls_temp_data-field1
field3 = ls_temp_data-field3
field2 = ls_temp_data-field2 ] ).
MESSAGE |Duplicate Entry found in Excel at Row number : | && |{ <lfs_excel>-row + 1 }| TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
CASE <lfs_excel>-col.
WHEN 1.
CLEAR ls_temp_data.
ls_temp_data-field1 = <lfs_excel>-value.
CONDENSE ls_temp_data-field1.
WHEN 2.
ls_temp_data-field3 = <lfs_excel>-value.
CONDENSE ls_temp_data-field3.
WHEN 3.
ls_temp_data-field2 = <lfs_excel>-value.
CONDENSE ls_temp_data-field2.
ENDCASE.
AT END OF row.
ls_temp_data-client = sy-mandt.
APPEND ls_temp_data TO lt_temp_tab.
ENDAT.
ENDLOOP.
ENDIF.

IF lt_temp_tab IS NOT INITIAL.
DELETE FROM ztable.
IF sy-subrc = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
INSERT ztable FROM TABLE lt_temp_tab .
IF sy-subrc = 0.
COMMIT WORK.
MESSAGE 'Data inserted successfully' TYPE 'S'.
ELSE.
ROLLBACK WORK.
MESSAGE 'Data not inserted' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ELSE.
MESSAGE 'Entry already exists' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.

ENDFORM.


FORM Update_data .

SELECT *
FROM ztable
INTO CORRESPONDING FIELDS OF TABLE @gt_ztable
WHERE field1 IN _pc1
AND field3 IN _fpc1
AND field2 IN _cc1.

IF gt_ztable IS NOT INITIAL.
CALL SCREEN 9000.
ELSE.
MESSAGE 'No Data Found' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.


FORM Display_data .

SELECT *
FROM ztable
INTO TABLE (lt_ztable)
WHERE field1 IN _pc2
AND field3 IN _fpc2
AND field2 IN _cc2.

IF lt_ztable IS NOT INITIAL.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = gob_table
CHANGING
t_table = lt_ztable.
CATCH cx_salv_msg .
ENDTRY.
CALL METHOD gob_table->display.
ELSE.
MESSAGE 'No data found' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.


FORM download_format .

CREATE OBJECT gs_excel 'EXCEL.APPLICATION'.
SET PROPERTY OF gs_excel 'Visible' = 1.
* get list of workbooks, initially empty
CALL METHOD OF
gs_excel
'Workbooks' = gs_mapl.
PERFORM err_hdl.

* add a new workbook
CALL METHOD OF
gs_mapl
'Add' = gs_map.
PERFORM err_hdl.

* Output column headings to active Excel sheet
PERFORM fill_cell USING 1 1 1 'Field 1' .
PERFORM fill_cell USING 1 2 1 'Field 2' .
PERFORM fill_cell USING 1 3 1 'Field 3' .

CALL METHOD OF
gs_excel
'Columns' = gs_column.

CALL METHOD OF
gs_column
'Autofit'.

CALL METHOD OF
gs_excel
'Worksheets' = gs_mapl.
PERFORM err_hdl.

SET PROPERTY OF gs_map 'NAME' = 'COPY'.

FREE OBJECT: gs_excel,
gs_mapl,
gs_map,
gs_zl,
gs_f,
gs_column.


ENDFORM.



FORM f4_filename USING p_file.
TRY.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE '
IMPORTING
file_name = p_file.
CATCH cx_root INTO DATA(lob_oref).
MESSAGE lob_oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

ENDFORM.

FORM Param_F4_help_pc USING
p_so_pc.
DATA: lt_return TYPE STANDARD TABLE OF ddshretval.

SELECT DISTINCT field1
FROM ztable
INTO TABLE (lt_value).

TRY.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'field1'
value_org = 'S'
TABLES
value_tab = lt_value
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
CATCH cx_root INTO DATA(lob_oref).
MESSAGE lob_oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

READ TABLE lt_return INTO DATA(ls_return) INDEX 1.
IF sy-subrc = 0.
p_so_pc = ls_return-fieldval.
ENDIF.
ENDFORM.

FORM Param_F4_help_Fpc USING
p_so_Fpc.
DATA: lt_return TYPE STANDARD TABLE OF ddshretval.

SELECT DISTINCT field3
FROM ztable
INTO TABLE (lt_value).
TRY.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'field3'
value_org = 'S'
TABLES
value_tab = lt_value
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
CATCH cx_root INTO DATA(lob_oref).
MESSAGE lob_oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
READ TABLE lt_return INTO DATA(ls_return) INDEX 1.
IF sy-subrc = 0.
p_so_fpc = ls_return-fieldval.
ENDIF.
ENDFORM.

FORM Param_F4_help_cc USING
p_so_cc.
DATA: lt_return TYPE STANDARD TABLE OF ddshretval.

SELECT DISTINCT field2
FROM ztable
INTO TABLE (lt_value).
TRY.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'field2'
value_org = 'S'
TABLES
value_tab = lt_value
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
CATCH cx_root INTO DATA(lob_oref).
MESSAGE lob_oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
READ TABLE lt_return INTO DATA(ls_return) INDEX 1.
IF sy-subrc = 0.
p_so_cc = ls_return-fieldval.
ENDIF.
ENDFORM.


FORM err_hdl .
IF sy-subrc <> 0.
MESSAGE 'Worksheet not created' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
ENDFORM.


FORM fill_cell USING i TYPE any
j TYPE any
bold TYPE any
val TYPE any.
CALL METHOD OF
gs_excel
'Cells' = gs_zl
EXPORTING
#1 = i
#2 = j.

PERFORM err_hdl.
SET PROPERTY OF gs_zl 'Value' = val.
PERFORM err_hdl.
GET PROPERTY OF gs_zl 'Font' = gs_f.
PERFORM err_hdl.
SET PROPERTY OF gs_f 'Bold' = bold.
PERFORM err_hdl.

ENDFORM.


MODULE status_9000 OUTPUT.
SET PF-STATUS 'PF_STATUS_9000'.
SET TITLEBAR 'TITLE1'.
ENDMODULE.


MODULE user_command_9000 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'CANCEL' OR 'EXIT'.
LEAVE PROGRAM.
WHEN 'SAVE'.
MOVE-CORRESPONDING gt_ztable TO gt_ztable1.
LOOP AT gt_ztable1 ASSIGNING FIELD-SYMBOL(<gfs_zrm>).
<gfs_zrm>-client = sy-mandt.
ENDLOOP.
UPDATE ztable FROM TABLE gt_ztable1.
IF sy-subrc = 0.
COMMIT WORK.
MESSAGE 'Data updated successfully' TYPE 'S'.
ELSE.
ROLLBACK WORK.
MESSAGE 'Data not updated ' TYPE 'S'.
ENDIF.
WHEN '%DEL'.
IF line_exists( gt_ztable[ sel = 'X' ] ).
CALL SELECTION-SCREEN 500 STARTING AT 5 5.
IF sy-subrc = 0.
IF p_y = 'X'.
gt_ztable1 = VALUE #( FOR gs_z IN gt_ztable
WHERE ( sel = 'X' )
( CORRESPONDING #( gs_z ) ) ).
IF gt_ztable1 IS NOT INITIAL.
DELETE ztable FROM TABLE gt_ztable1 .
IF sy-subrc = 0.
COMMIT WORK.
DELETE gt_ztable WHERE sel = 'X'.
MESSAGE 'Selected Data deleted' TYPE 'S'.
ELSE.
ROLLBACK WORK.
MESSAGE 'Data not deleted' TYPE 'S'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSE.
MESSAGE 'Select Data' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.

WHEN '%SEL'. "Select all
gs_ztable-sel = 'X'.
MODIFY gt_ztable FROM gs_ztable TRANSPORTING sel WHERE sel <> 'X'.

WHEN '%DSE'. "Deselect ALl
gs_ztable-sel = ' '.
MODIFY gt_ztable FROM gs_ztable TRANSPORTING sel WHERE sel = 'X'.

ENDCASE.
ENDMODULE.


MODULE t_tab_change_tc_attr OUTPUT.
DESCRIBE TABLE gt_ztable LINES t_tab-lines.
ENDMODULE.

MODULE t_tab_modify INPUT.
MODIFY gt_ztable
FROM gs_ztable
INDEX t_tab-current_line.
ENDMODULE.
Flow Logic - Screen 9000

PROCESS BEFORE OUTPUT.
MODULE t_tab_change_tc_attr.

LOOP AT gt_ztable
INTO gs_ztable
WITH CONTROL t_tab
CURSOR t_tab-current_line.
ENDLOOP.


MODULE status_9000.
*
PROCESS AFTER INPUT.
LOOP AT gt_ztable.
CHAIN.
FIELD gs_ztable-sel.
FIELD gs_ztable-field1.
FIELD gs_ztable-field2.
FIELD gs_ztable-field3.
MODULE t_tab_modify ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.

MODULE user_command_9000.
 

9. Send Mail with Excel and PDF attachments.

data declarations...

DATA: BEGIN OF PDF_OUTPUT OCCURS 0.
          INCLUDE STRUCTURE TLINE.
  DATA: END OF PDF_OUTPUT.

  DATA : I_RECLIST  LIKE SOMLRECI1.
  DATA : I_OBJTXT   LIKE SOLISTI1,
         I_OBJPACK  LIKE SOPCKLSTI1,
         I_OBJBIN   LIKE SOLISTI1,
         WA_OBJHEAD LIKE SOLISTI1.

  DATA : V_LINES_TXT LIKE SY-TABIX,
         V_LINES_BIN LIKE SY-TABIX,
         WA_DOC_CHNG LIKE SODOCCHGI1.
  DATA : T_OBJECTDATA LIKE CLOBJDAT ,
         TAB_CLASS LIKE SCLASS .
  DATA : SEND_REQUEST TYPE REF TO CL_BCS.
  DATA : TEXT TYPE BCSY_TEXT.
  DATA : DOCUMENT TYPE REF TO CL_DOCUMENT_BCS.
  DATA : RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.
  DATA : SENDER TYPE REF TO CL_SAPUSER_BCS.
  DATA : BCS_EXCEPTION TYPE REF TO CX_BCS.
  DATA : SENT_TO_ALL TYPE OS_BOOLEAN.
  DATA : MSTR_PRINT_PARMS LIKE PRI_PARAMS.
  DATA : SOLI_TAB TYPE SOLI_TAB.
  DATA : E_XSTRING TYPE XSTRING.
  DATA : G_XSTRING TYPE XSTRING.
  DATA : LT_SOLIX TYPE SOLIX_TAB.
  DATA : BINARY_CONTENT TYPE SOLIX_TAB.
  DATA : LV_SUBJECT(50) TYPE C.
  DATA :  LV_SUBJ_FILE   TYPE SO_OBJ_DES .
  DATA : LT_ATT_HEAD    TYPE SOLI_TAB.
  DATA : LV_FILENAME    TYPE STRING.
  DATA : LV_TEXT_LINE    TYPE SOLI.
  DATA : CONTENT TYPE STRING.
  DATA : VAL TYPE STRING.

  DATA : GD_SPOOL_NR LIKE TSP01-RQIDENT,
         GD_BYTECOUNT LIKE TST01-DSIZE.

  DATA : IT_CONTENTS TYPE STANDARD TABLE OF SOLISTI1,
         WA_CONTENTS TYPE SOLISTI1.

* EXCEL
  DATA : MT_FCAT        TYPE LVC_T_FCAT,
         MT_DATA        TYPE REF TO DATA,
         M_FLAVOUR      TYPE STRING,
         M_VERSION      TYPE STRING,
         MO_RESULT_DATA TYPE REF TO CL_SALV_EX_RESULT_DATA_TABLE,
         MO_COLUMNS     TYPE REF TO CL_SALV_COLUMNS_TABLE,
         MO_AGGREG      TYPE REF TO CL_SALV_AGGREGATIONS,
         MO_SALV_TABLE  TYPE REF TO CL_SALV_TABLE,
         M_FILE_TYPE    TYPE SALV_BS_CONSTANT.
  FIELD-SYMBOLS : <TAB> TYPE ANY TABLE.

I. Create Excel

GET REFERENCE OF IT_EXCEL INTO mt_data. "IT_EXCEL consists of data which need to in excel

*if we didn't pass fieldcatalog we need to create it
  ASSIGN mt_data->* TO <tab>.
  TRY .
      cl_salv_table=>factory(
      EXPORTING
      list_display = abap_false
      IMPORTING
      r_salv_table = mo_salv_table
      CHANGING
      t_table      = <tab> ).
    CATCH cx_salv_msg.

  ENDTRY.

  "get colums & aggregation infor to create fieldcat
  mo_columns  = mo_salv_table->get_columns( ).
  mo_aggreg   = mo_salv_table->get_aggregations( ).
  mt_fcat     =  cl_salv_controller_metadata=>get_lvc_fieldcatalog(
    r_columns      = mo_columns
    r_aggregations = mo_aggreg ).

  IF cl_salv_bs_a_xml_base=>get_version( ) EQ
  if_salv_bs_xml=>version_25 OR
  cl_salv_bs_a_xml_base=>get_version( ) EQ
  if_salv_bs_xml=>version_26.



    mo_result_data = cl_salv_ex_util=>factory_result_data_table(
    r_data                      = mt_data
*        s_layout                    = is_layout
    t_fieldcatalog              = mt_fcat
*        t_sort                      = it_sort
*        t_filter                    = it_filt
    ).

    CASE cl_salv_bs_a_xml_base=>get_version( ).
      WHEN if_salv_bs_xml=>version_25.
        m_version = if_salv_bs_xml=>version_25.
      WHEN if_salv_bs_xml=>version_26.
        m_version = if_salv_bs_xml=>version_26.
    ENDCASE.

    m_file_type = if_salv_bs_xml=>C_TYPE_EXCEL_XML.

    m_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.


    "transformation of data to excel
    CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform
      EXPORTING
        xml_type      = m_file_type
        xml_version   = m_version
        r_result_data = mo_result_data
        xml_flavour   = m_flavour
        gui_type      = if_salv_bs_xml=>c_gui_type_gui
      IMPORTING
        xml           = g_xstring.
  ENDIF.


  CALL METHOD cl_bcs_convert=>xstring_to_solix
    EXPORTING
      iv_xstring = g_xstring
    RECEIVING
      et_solix   = binary_content.

II. Create PDF

*for fetching print parameters and then changing according to file format
  CALL FUNCTION 'GET_PRINT_PARAMETERS'
    EXPORTING
      NO_DIALOG      = 'X'
    IMPORTING
      OUT_PARAMETERS = MSTR_PRINT_PARMS.

  MSTR_PRINT_PARMS-PAART = 'X_65_230'.

*Submit ZProgram whose output should be the content need to be in PDF
*for creating spool
  SUBMIT ZPROGRAM  WITH C_CODE = C_CODE
                          WITH C_NAME = C_NAME
  TO SAP-SPOOL
   SPOOL PARAMETERS MSTR_PRINT_PARMS
   WITHOUT SPOOL DYNPRO
   AND RETURN.

  CLEAR GD_SPOOL_NR.

*fetching spool id
  SELECT SINGLE RQIDENT INTO GD_SPOOL_NR  FROM TSP01
        WHERE RQCRETIME = ( SELECT MAX( RQCRETIME ) FROM TSP01 WHERE RQCLIENT = SY-MANDT
      AND RQOWNER = SY-UNAME ).

*converting spool content into pdf
  CLEAR :GD_BYTECOUNT .
  CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
    EXPORTING
      SRC_SPOOLID              = GD_SPOOL_NR
      NO_DIALOG                = ' '
    IMPORTING
      PDF_BYTECOUNT            = GD_BYTECOUNT
    TABLES
      PDF                      = PDF_OUTPUT
    EXCEPTIONS
      ERR_NO_ABAP_SPOOLJOB     = 1
      ERR_NO_SPOOLJOB          = 2
      ERR_NO_PERMISSION        = 3
      ERR_CONV_NOT_POSSIBLE    = 4
      ERR_BAD_DESTDEVICE       = 5
      USER_CANCELLED           = 6
      ERR_SPOOLERROR           = 7
      ERR_TEMSEERROR           = 8
      ERR_BTCJOB_OPEN_FAILED   = 9
      ERR_BTCJOB_SUBMIT_FAILED = 10
      ERR_BTCJOB_CLOSE_FAILED  = 11
      OTHERS                   = 12.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* convert attachment
  CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
    TABLES
      CONTENT_IN  = PDF_OUTPUT
      CONTENT_OUT = SOLI_TAB
    EXCEPTIONS
      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.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      INPUT_LENGTH = GD_BYTECOUNT
    IMPORTING
      BUFFER       = E_XSTRING
    TABLES
      BINARY_TAB   = SOLI_TAB
    EXCEPTIONS
      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.

  LT_SOLIX = CL_DOCUMENT_BCS=>XSTRING_TO_SOLIX( IP_XSTRING = E_XSTRING ).
"LT_SOLIX is the string format of pdf which is use in attachment of mail

III. Send Mail

Try.
* create persistent send request
      SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

* create and set document
      CLEAR: TEXT, TEXT[], CONTENT, LV_SUBJECT.

* Email Subject
      CLEAR: LV_SUBJECT.

        LV_SUBJECT =  'Subject of the mail.'.

      CLEAR: LV_SUBJ_FILE.
        lV_SUBJ_FILE = 'File_name'

* Body
      CLEAR : IT_CONTENTS[].

  "email body
  WA_CONTENTS-LINE = 'Greetings,'.
  APPEND WA_CONTENTS TO IT_CONTENTS.
  CLEAR : WA_CONTENTS.

  WA_CONTENTS-LINE = 'This is the mail body'.
  APPEND WA_CONTENTS TO IT_CONTENTS.
  CLEAR : WA_CONTENTS.
  
  APPEND WA_CONTENTS TO IT_CONTENTS.
  WA_CONTENTS-LINE = 'Thanks'.
  APPEND WA_CONTENTS TO IT_CONTENTS.
  CLEAR : WA_CONTENTS.
  
      DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
      I_TYPE = 'HTM'
      I_TEXT = IT_CONTENTS
      I_SUBJECT = LV_SUBJECT ).

* add document to send request
      CALL METHOD SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).

** add attachment for pdf
      TRY.
          CALL METHOD DOCUMENT->ADD_ATTACHMENT
            EXPORTING
              I_ATTACHMENT_TYPE    = 'PDF'
              I_ATTACHMENT_SUBJECT = LV_SUBJ_FILE
              I_ATT_CONTENT_HEX    = LT_SOLIX.
        CATCH cx_document_bcs.
      ENDTRY.


* add attachment for excel

      TRY.
          CALL METHOD DOCUMENT->ADD_ATTACHMENT(
            i_attachment_type = 'XLS'
            i_attachment_subject = LV_SUBJ_FILE
            i_att_content_hex = binary_content ).
        CATCH cx_document_bcs.
      ENDTRY.


      data : MAIL_TO  TYPE AD_SMTPADR.

    
* create recipient (e-mail address)

            CLEAR: MAIL_TO.
            MAIL_TO = '[email protected]'.

            RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
            MAIL_TO ).


*   add recipient with its respective attributes to send request
            CALL METHOD SEND_REQUEST->ADD_RECIPIENT
              EXPORTING
                I_RECIPIENT = RECIPIENT
                I_EXPRESS   = 'X'.
*            i_copy      = 'X'.

* If wants to add CC mail id
            CLEAR: MAIL_TO.
            MAIL_TO = '[email protected]'.


            RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
            MAIL_TO ).


*   add recipient with its respective attributes to send request
            CALL METHOD SEND_REQUEST->ADD_RECIPIENT
              EXPORTING
                I_RECIPIENT = RECIPIENT
*            I_EXPRESS   = 'X'.
                i_copy      = 'X'.
         

* send document
      CALL METHOD SEND_REQUEST->SEND(
      EXPORTING
      I_WITH_ERROR_SCREEN = 'X'
      RECEIVING
      RESULT = SENT_TO_ALL ).

      COMMIT WORK.

      MESSAGE 'Mail Send Successfully' TYPE 'S'.

      DATA:   BCS_EXCEPTION TYPE REF TO CX_BCS.

    CATCH CX_BCS INTO BCS_EXCEPTION.
      MESSAGE 'Mail Not sent' TYPE 'E'.


  ENDTRY.

 

Labels in this area