ABAP

Friday, 2 December 2016

Remove billing block from sales order



REPORT  /XXXP10/SSD006 NO STANDARD PAGE HEADING.
INCLUDE /xxxp10/ssD006_top.            " Data Declarations
INCLUDE /xxxp10/ssD006_scr.            " Selection Screen Definition
INCLUDE /xxxp10/ssD006_forms.          " Form Routines
***********************************************************************
* INITIALIZATION
***********************************************************************
INITIALIZATION.
* Include to implement LCL_EMAIL class
  
INCLUDE /xxxp10/ssD006_lcl_email_imp.
*  PERFORM initialize.


***********************************************************************
*  Validations                                                        *
***********************************************************************
AT SELECTION-SCREEN ON s_vkorg.
  
PERFORM validate_sales_org.
*AT SELECTION-SCREEN ON s_erdat.
*  PERFORM validate_erdat.
AT SELECTION-SCREEN ON s_auart.
  
PERFORM validate_auart.
AT SELECTION-SCREEN ON s_faksk.
  
PERFORM validate_faksk.
***********************************************************************
* START-OF-SELECTION
***********************************************************************
START-OF-SELECTION.

  
PERFORM get_data.
***********************************************************************
* END-OF-SELECTION
***********************************************************************
END-OF-SELECTION.

  
PERFORM process_data.
  
if g_it_vbak is not INITIAL.

  
CALL SCREEN 9000.

  
else.
    
MESSAGE text-T13 type 'I'.
    
LEAVE LIST-PROCESSING.
  
endif.
*****************************************************************
Include Top
*****************************************************************
***********************************************************************
* TYPES DECLARATION
***********************************************************************
CONSTANTS c_wbstk type c VALUE 'C'.
TYPES:
* Strcture type to declare selection screen
  
BEGIN OF t_sel,
    vkorg 
TYPE vbak-vkorg,              " Sales organization
    erdat 
TYPE vbap-erdat,              " SO date
    auart 
TYPE vbak-auart,              " Order types
    faksk 
TYPE vbak-faksk,              " Billing block
*    pstyv type vbak-pstyv,
    mail  
TYPE ad_smtpadr,              " Email Address
  
END OF t_sel,

  
BEGIN OF t_vbuk,
    vbeln 
TYPE vbeln,
    posnr 
TYPE posnr,
    vgbel 
TYPE vgbel,
    wbstk 
TYPE wbstk,
  
END OF t_vbuk.
* Structure type to declare sales order data
TYPES : BEGIN OF t_vbak,
        vbeln 
TYPE vbak-vbeln,
        erdat 
TYPE vbak-erdat,
        auart 
TYPE vbak-auart,
        faksk 
TYPE vbak-faksk,
        flag  
TYPE c,
        
message TYPE char50,
        
END OF t_vbak,
* Structure type to declare SCHEDULE item data
        
BEGIN OF t_vbep,
        vbeln 
TYPE vbep-vbeln,
        posnr 
TYPE vbep-posnr,
        ettyp 
TYPE vbep-ettyp,
        lfrel 
TYPE vbep-lfrel,
        wmeng 
TYPE vbep-wmeng,
        banfn 
TYPE vbep-banfn,
        
END OF t_vbep,
*Sturcture type to declare material
        
BEGIN OF t_mseg,
        kdauf 
TYPE kdauf,
        kdpos 
TYPE kdpos,
        menge 
TYPE mseg-menge,
        
END OF t_mseg,

        
BEGIN OF t_zzvar,
          z_return 
TYPE zzvar-z_return,
        
END OF t_zzvar,
* Structure type to declare final
        
BEGIN OF t_final,
        vbeln 
TYPE vbak-vbeln,
        posnr 
TYPE vbep-posnr,
        erdat 
TYPE vbak-erdat,
        auart 
TYPE vbak-auart,
        faksk 
TYPE vbak-faksk,
        ettyp 
TYPE vbep-ettyp,
        lfrel 
TYPE vbep-lfrel,
        wmeng 
TYPE vbep-wmeng,
        menge 
TYPE mseg-menge,
        banfn 
TYPE vbep-banfn,
        flag  
TYPE c,
        
END OF t_final.

***********************************************************************
* Work areas
***********************************************************************
DATA:
* Work area to declare selection screen
  g_wa_sel        
TYPE t_sel.
DATA:
* work area for vbak
  g_wa_vbak       
TYPE t_vbak,
* work are for mseg
  g_wa_mseg       
TYPE t_mseg,
* work area for vbep
  g_wa_vbep       
TYPE t_vbep,
* work area for final
  g_wa_final       
TYPE t_final,
* internal table for auart
  g_wa_auart 
TYPE t_zzvar,
  g_wa_pstyv 
TYPE t_zzvar,
  g_wa_faksk 
TYPE t_zzvar,
  g_wa_vbuk  
type t_vbuk.
***********************************************************************
* Internal tables
***********************************************************************
DATA:
* internal table for vbak
  g_it_vbak 
TYPE STANDARD TABLE OF t_vbak,
* internal table for mseg
  g_it_mseg 
TYPE STANDARD TABLE OF t_mseg,
* internal table for vbep
  g_it_vbep 
TYPE STANDARD TABLE OF t_vbep,
* internal table for auart
  g_it_auart 
TYPE ztt_zxreturn,
  g_it_pstyv 
TYPE STANDARD TABLE OF t_zzvar,
  g_it_faksk 
TYPE ztt_zxreturn,
* internal table for final
  g_it_final 
TYPE STANDARD TABLE OF t_final,
  g_it_vbuk  
type STANDARD TABLE OF t_vbuk.


***********************************************************************
* Define local class
***********************************************************************
CLASS lcl_email DEFINITION FINAL.
  
PUBLIC SECTION.
    
CLASS-METHODS: send_email IMPORTING
                               im_name            
TYPE any
                               im_typ             
TYPE char1
                               im_title           
TYPE any
                               im_langu           
TYPE sylangu
                               im_format          
TYPE char1
                               im_attachment_type 
TYPE soodk-objtp
                               im_doc_type        
TYPE so_obj_tp.
ENDCLASS.                    "lcl_email DEFINITION
***********************************************************************
* Variables
***********************************************************************
DATA:
     go_dock     
TYPE REF TO cl_gui_docking_container,
     go_table      
TYPE REF TO cl_gui_alv_grid,
     go_salv1      
TYPE REF TO cl_salv_table,
     go_email      
TYPE REF TO lcl_email,
     go_func1      
TYPE REF TO cl_salv_functions,
     go_display1   
TYPE REF TO cl_salv_display_settings,
     go_column     
TYPE REF TO cl_salv_column_table,
     go_columns    
TYPE REF TO cl_salv_columns_table,
     go_layout     
TYPE REF TO cl_salv_layout.


**********************************************************
Selection screen
**********************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS:
  s_vkorg 
FOR g_wa_sel-vkorg,            " Sales Organization
  s_erdat 
FOR g_wa_sel-erdat,            " SO date
  s_auart 
FOR g_wa_sel-auart,            " Order type
*  s_pstyv FOR g_wa_sel-pstyv,            " Order type
  s_faksk 
FOR g_wa_sel-faksk.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
SELECT-OPTIONS
  s_mail 
FOR g_wa_sel-mail               " Recipient Address
             
NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b2.

*********************************************************
Forms
*********************************************************
*----------------------------------------------------------------------*
* This subroutine is for validating purchasing group                   *
*----------------------------------------------------------------------*
FORM validate_sales_org .
  
IF NOT s_vkorg  IS INITIAL.
    
SELECT SINGLE vkorg
      
FROM tvko
      
INTO g_wa_sel-vkorg
      
WHERE vkorg IN s_vkorg[].
    
IF sy-subrc <> 0.
      
MESSAGE text-t04 TYPE 'E'.
    
ENDIF.
  
ENDIF.
ENDFORM.                    " VALIDATE_SALES_ORG
*&---------------------------------------------------------------------*
*&      Form  VALIDATE_AUART
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  This subroutine is for validating purchasing group
*----------------------------------------------------------------------*
FORM validate_auart .
  
IF NOT s_auart  IS INITIAL.
    
SELECT SINGLE auart
      
FROM tvak
      
INTO g_wa_sel-auart
      
WHERE auart IN s_auart[].
    
IF sy-subrc <> 0.
      
MESSAGE text-t05 TYPE 'E'.
    
ENDIF.
  
ENDIF.
ENDFORM.                    " VALIDATE_AUART
*&---------------------------------------------------------------------*
*&      Form  VALIDATE_FAKSK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  This subroutine is for validating purchasing group
*----------------------------------------------------------------------*
FORM validate_faksk .
  
IF NOT s_faksk  IS INITIAL.
    
SELECT SINGLE faksp
      
FROM tvfs
      
INTO g_wa_sel-faksk
      
WHERE faksp IN s_faksk[].
    
IF sy-subrc <> 0.
      
MESSAGE text-t06 TYPE 'E'.
    
ENDIF.
  
ENDIF.
ENDFORM.                    " VALIDATE_FAKSK
*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  
DATA l_key TYPE salv_s_layout_key.
  
SET PF-STATUS 'ST9000'.
  
SET TITLEBAR 'TI9000'.

  
IF cl_gui_alv_grid=>offline( ) IS INITIAL.
    
IF go_dock IS INITIAL.
      
CREATE OBJECT go_dock
        
EXPORTING
          repid     
= sy-repid
          ratio     
= 50
          dynnr     
= '9000'
          side      
= cl_gui_docking_container=>dock_at_top
          extension 
= 100.

    
ENDIF.
  
ENDIF.

  
CALL METHOD cl_salv_table=>factory
    
EXPORTING
*     list_display = IF_SALV_C_BOOL_SAP=>FALSE
      r_container  
= go_dock
    
IMPORTING
      r_salv_table 
= go_salv1
    
CHANGING
      t_table      
= g_it_vbak.
* Get Object Reference to the Tool Bar Functions
  
CALL METHOD go_salv1->get_functions
    RECEIVING
      
value = go_func1.
* Activate all ALV Tool Bar Functions
  
CALL METHOD go_func1->set_all
    
EXPORTING
      
value = if_salv_c_bool_sap=>true.
* Get the Object Reference for the ALV Layout
  
CALL METHOD go_salv1->get_layout
    RECEIVING
      
value = go_layout.
* Set the Key
  l_key
-report = sy-repid.
  go_layout
->set_key( l_key ).
* Set the Save Layout Option
  go_layout
->set_save_restriction( if_salv_c_layout=>restrict_none ).
* Activate Option of Saving Default Setting
  go_layout
->set_default( abap_true ).

  
CALL METHOD go_salv1->get_columns
    RECEIVING
      
value = go_columns.
* Set the Key Fixation

  go_column ?= go_columns
->get_column( columnname = 'MESSAGE' ).
  go_column
->set_long_text( text-t10 ).
  go_column
->set_medium_text( text-t10 ).
  go_column
->set_short_text( text-t10 ).
  go_column
->set_output_length( 15 ).
  go_columns
->set_key_fixation( abap_true ).
  go_column ?= go_columns
->get_column( columnname = 'FLAG' ).
  go_column
->set_long_text( text-t11 ).
  go_column
->set_medium_text( text-t11 ).
  go_column
->set_short_text( text-t11 ).
  go_column
->set_output_length( 12 ).



  go_display1 
= go_salv1->get_display_settings( ).
  go_display1
->set_list_header( text-t16 ).
  
PERFORM send_mail.
  
CALL METHOD go_salv1->display.
ENDMODULE.                 " STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  
CASE sy-ucomm.
    
WHEN 'BACK' OR 'EXIT'.
      
LEAVE TO SCREEN 0.
  
ENDCASE.
ENDMODULE.                 " USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*&      Form  SEND_MAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  This subroutine is for validating purchasing group
*----------------------------------------------------------------------*
FORM send_mail .
  
CREATE OBJECT go_email.
  
IF go_email IS BOUND.
    
CALL METHOD go_email->send_email
      
EXPORTING
        im_name            
= s_mail
        im_typ             
= 'U'
        im_title           
= text-t03
        im_langu           
= sy-langu
        im_format          
= 'E'
        im_attachment_type 
= 'XLS'
        im_doc_type        
= 'RAW'.
  
ENDIF.
ENDFORM.                    " SEND_MAIL
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  This subroutine is for get data
*----------------------------------------------------------------------*
FORM get_data .

  
SELECT vbeln
         erdat
         auart
         faksk
  
FROM vbak
  
INTO TABLE g_it_vbak
  
WHERE vkorg IN s_vkorg
  
AND   erdat IN s_erdat
  
AND   auart IN s_auart
  
AND   faksk IN s_faksk.
  
IF sy-subrc EQ 0.
    
SELECT vbeln posnr ettyp lfrel wmeng banfn FROM vbep
      
INTO TABLE g_it_vbep
      
FOR ALL ENTRIES IN g_it_vbak
      
WHERE vbeln = g_it_vbak-vbeln.
    
SELECT kdauf kdpos menge FROM mseg INTO TABLE g_it_mseg
      
FOR ALL ENTRIES IN g_it_vbak
      
WHERE kdauf = g_it_vbak-vbeln.
    
SELECT lips~vbeln lips~posnr lips~vgbel vbuk~wbstk
      
INTO TABLE g_it_vbuk
      
FROM lips INNER JOIN vbuk
      
ON ( lips~vbeln = vbuk~vbeln )
      
FOR ALL ENTRIES IN g_it_vbak
      
WHERE vgbel = g_it_vbak-vbeln.
    
SORT g_it_vbuk BY vgbel.
  
ENDIF.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  This subroutine is for process data
*----------------------------------------------------------------------*
FORM process_data .

  
DATA: l_header_inx TYPE bapisdh1x,
        l_header_in  
TYPE bapisdh1,
        l_po_history 
LIKE TABLE OF bapiekbes,
        w_po_history 
LIKE bapiekbes,
        l_lips_vbeln 
TYPE vbeln,
        l_lips_posnr 
TYPE posnr.

  
DATA: lt_return TYPE STANDARD TABLE OF bapiret2.
  
DATA : g_it_ekpo TYPE STANDARD TABLE OF ekpo,
         g_wa_ekpo 
TYPE ekpo,
         l_ekkn_ebeln 
TYPE ebeln,
         l_ekkn_ebelp 
TYPE ebelp,
         lv_ebeln 
TYPE ebeln.

  
DATA : l_lines LIKE sy-tabix.                             "D10K989190
  
DATA : l_po_banfn TYPE TABLE OF ekpo  WITH HEADER LINE.   "D10K989190

  
SORT g_it_mseg BY kdauf kdpos.
  
LOOP AT g_it_vbak INTO g_wa_vbak.
    
CLEAR: g_wa_vbep, g_wa_mseg.
    g_wa_vbak
-flag = 'Y'.
    
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.

    
READ TABLE g_it_vbep INTO g_wa_vbep
      
WITH KEY vbeln = g_wa_vbak-vbeln BINARY SEARCH.
    
IF sy-subrc EQ 0.
      
LOOP AT g_it_vbep INTO g_wa_vbep FROM sy-tabix WHERE wmeng > 0.
        
IF g_wa_vbep-vbeln = g_wa_vbak-vbeln.
          
IF g_wa_vbep-ettyp = 'CX'."No Inventory management
            
CLEAR g_wa_vbep.
            
CONTINUE.
          
ENDIF.
*          IF g_wa_vbep-lfrel = 'X'." Item is relevant for delivery" D- D10K988843 20-Oct-2016
*Check if PR is done for this SO item
          
IF g_wa_vbep-banfn IS NOT INITIAL.
*Check if PO is created
* Change for - D10K989190
* There can be more than one PO created for a PR. Need to check all the
* POs to see if any of them has been GR complete. If even one is not,
* the SO cannot have the billing block removed.
*            CLEAR lv_ebeln.                                   "D10K989190
*            SELECT SINGLE ebeln FROM ekpo INTO lv_ebeln WHERE "D10K989190
*              banfn = g_wa_vbep-banfn.                     "D10K989190
            
CLEAR l_lines.                                  "D10K989190
            
REFRESH l_po_banfn.                             "D10K989190
            
SELECT * FROM ekpo INTO TABLE l_po_banfn        "D10K989190
                 
WHERE banfn = g_wa_vbep-banfn.             "D10K989190
            
DESCRIBE TABLE l_po_banfn LINES l_lines.        "D10K989190
*            IF sy-subrc EQ 0.                              "D10K989190
            
IF l_lines > 0.                                 "D10K989190
              
LOOP AT l_po_banfn.                           "D10K989190
                
REFRESH l_po_history.
                
CALL FUNCTION 'BAPI_PO_GETDETAIL'
                  
EXPORTING
                    purchaseorder          
= l_po_banfn-ebeln
                    history                
= 'X'
                  
TABLES
                    po_item_history_totals 
= l_po_history.
                
IF l_po_history[] IS INITIAL.               "D10K989190
                  g_wa_vbak
-flag = 'N'.                     "D10K989190
                  
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag. "D10K989190
                  
CLEAR g_wa_vbak.                          "D10K989190
                  
EXIT.                                     "D10K989190
                
ELSE.                                       "D10K989190
                  
CLEAR : l_ekkn_ebeln, l_ekkn_ebelp.
                  
SELECT SINGLE ebeln ebelp FROM ekkn INTO (l_ekkn_ebeln, l_ekkn_ebelp) WHERE vbeln = g_wa_vbep-vbeln
                                                                                         
AND vbelp = g_wa_vbep-posnr.
*                  IF sy-subrc EQ 0.
                  
CLEAR w_po_history.
                  
READ TABLE l_po_history INTO w_po_history WITH KEY l_ekkn_ebelp.
                  
IF w_po_history-deliv_qty NE g_wa_vbep-wmeng.
                    g_wa_vbak
-flag = 'N'.
                    
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.
                    
CLEAR g_wa_vbak.
                    
EXIT.
                  
ELSE.
                    
CLEAR g_wa_vbep.
                    
CONTINUE.
                  
ENDIF.
*                  ENDIF.
                
ENDIF.                                      "D10K989190
              
ENDLOOP.
            
ELSE.
              g_wa_vbak
-flag = 'N'.
              
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.
              
CLEAR g_wa_vbak.
              
EXIT.
            
ENDIF.
          
ELSE.
            
CLEAR g_wa_vbuk.
            
LOOP AT g_it_vbuk INTO g_wa_vbuk WHERE vgbel = g_wa_vbep-vbeln.
*                                                   AND wbstk NE c_wbstk.
              
IF g_wa_vbuk-wbstk NE c_wbstk.
                g_wa_vbak
-flag = 'N'.
                
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.
                
CLEAR g_wa_vbak.
                
EXIT.
              
ENDIF.
            
ENDLOOP.
            
IF sy-subrc <> 0.
              g_wa_vbak
-flag = 'N'.
              
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.
              
CLEAR g_wa_vbak.
              
EXIT.
            
ENDIF.
*compare order qty with pgi qty
            
CLEAR g_wa_mseg.
            
READ TABLE g_it_mseg INTO g_wa_mseg
            
WITH KEY kdauf = g_wa_vbep-vbeln
                     kdpos 
= g_wa_vbep-posnr
                     
BINARY SEARCH.
            
IF sy-subrc = 0.
*              IF g_wa_vbep-wmeng NE g_wa_mseg-menge.
              
IF g_wa_vbep-wmeng NE g_wa_mseg-menge.
*PGI is partial, billing block cannot be removed for this SO
*Go to next SO
                g_wa_vbak
-flag = 'N'.
                
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.
                
CLEAR g_wa_vbak.
                
EXIT.
              
ENDIF.
            
ELSE.
              
CLEAR: l_lips_vbeln, l_lips_posnr.
              
SELECT SINGLE vbeln posnr FROM lips INTO (l_lips_vbeln, l_lips_posnr)
                
WHERE vgbel = g_wa_vbep-vbeln
                
AND   vgpos = g_wa_vbep-posnr.
              
IF sy-subrc NE 0.
                g_wa_vbak
-flag = 'N'.
                
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING flag.
                
CLEAR g_wa_vbak.
                
EXIT.
              
ENDIF.
            
ENDIF.
          
ENDIF.
*        ENDIF." D- D10K988843 20-Oct-2016
        
ELSE.
          
CLEAR g_wa_vbak.
          
EXIT.
        
ENDIF.
        
CLEAR g_wa_vbep.
      
ENDLOOP.

    
ENDIF.
    
CLEAR g_wa_vbak.
  
ENDLOOP.
  
LOOP AT g_it_vbak INTO g_wa_vbak WHERE flag NE 'N'.
*update the flag.
    l_header_inx
-updateflag = 'U'.
    l_header_inx
-bill_block = 'X'.  " Billing
    l_header_in
-bill_block  = ''.   " Remove Billing block.
*Call the bapi.
    
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
      
EXPORTING
        salesdocument    
= g_wa_vbak-vbeln
        order_header_in  
= l_header_in
        order_header_inx 
= l_header_inx
      
TABLES
        
return           = lt_return.
*check for errors.
    
LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type = 'A' OR type = 'E'.
      
EXIT.
    
ENDLOOP.

    
IF sy-subrc = 0.
      g_wa_vbak
-message = 'Error in updating'.
      
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING message.
    
ELSE.
      g_wa_vbak
-message = 'Billing block removed'.
      
MODIFY g_it_vbak FROM g_wa_vbak TRANSPORTING message.
      
COMMIT WORK AND WAIT.
    
ENDIF.
  
ENDLOOP.
ENDFORM.                    " PROCESS_DATA

***************************************************************
Email implementation
***************************************************************
*- Initial Development Delete billing block report                    *
***********************************************************************

  s_erdat
-sign = 'I'.
  s_erdat
-option = 'EQ'.
  s_erdat
-low = ( sy-datum - 180 ).
  s_erdat
-high = sy-datum.
  
APPEND s_erdat TO s_erdat[].
  /sbdp10/cl_s_sales_order
=>get_order(
    
IMPORTING
      et_return 
= g_it_auart    " Return value
  
).
*  SELECT z_return FROM zzvar INTO TABLE g_it_auart
*    WHERE z_name = '/SBDP10/SSD006'
*    AND   z_key  = 'VBAK-AUART'.
*  IF sy-subrc EQ 0.
*    SELECT z_return FROM zzvar INTO TABLE g_it_pstyv
*     WHERE z_name = '/SBDP10/SSO001'
*     AND   z_key  = 'VBAK-PSTYV'.
  /sbdp10/cl_s_sales_order
=>get_billingblock(
   
IMPORTING
     et_return 
= g_it_faksk    " Return value
 
).
*    SELECT z_return FROM zzvar INTO TABLE g_it_faksk
*     WHERE z_name = '/SBDP10/SSD006'
*     AND   z_key  = 'VBAK-FAKSK'.
*  ENDIF.
  
LOOP AT g_it_auart INTO g_wa_auart.
    
CLEAR s_auart.
    s_auart
-sign = 'I'.
    s_auart
-option = 'EQ'.
    s_auart
-low = g_wa_auart-z_return.
    
APPEND s_auart TO s_auart[].
  
ENDLOOP.
*  LOOP AT g_it_pstyv INTO g_wa_pstyv.
*    CLEAR s_pstyv.
*    s_pstyv-sign = 'I'.
*    s_pstyv-option = 'EQ'.
*    s_pstyv-low = g_wa_auart-z_return.
*    APPEND s_pstyv TO s_pstyv[].
*  ENDLOOP.
  
LOOP AT g_it_faksk INTO g_wa_faksk.
    
CLEAR s_faksk.
    s_faksk
-sign = 'I'.
    s_faksk
-option = 'EQ'.
    s_faksk
-low = g_wa_faksk-z_return.
    
APPEND s_faksk TO s_faksk[].
  
ENDLOOP.
*----------------------------------------------------------------------*
*       CLASS lcl_email IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
  
CLASS lcl_email IMPLEMENTATION.

    
METHOD send_email.
      
DATA:
        lt_messages        
TYPE STANDARD TABLE OF solisti1,
        lt_receivers       
TYPE STANDARD TABLE OF somlrec90,
        lt_field_cat       
TYPE lvc_t_fcat,

        la_message         
LIKE LINE OF lt_messages,
        la_title           
TYPE sodocchgi1,

        lt_choice          
TYPE if_salv_bs_xml=>t_type_xml_choice,
        ls_choice          
TYPE if_salv_bs_xml=>s_type_xml_choice,
        r_result_data      
TYPE REF TO cl_salv_ex_result_data_table,
        lr_data            
TYPE REF TO data,
        l_xml              
TYPE xstring,
        l_version          
TYPE string,
        l_just             
TYPE text6,
        l_value            
TYPE text200,

        r_columns          
TYPE REF TO cl_salv_columns_table,
        r_aggregations     
TYPE REF TO cl_salv_aggregations,
        r_table            
TYPE REF TO data,
        r_filters          
TYPE REF TO cl_salv_filters,

        lo_send_request    
TYPE REF TO cl_bcs,
        lo_document        
TYPE REF TO cl_document_bcs,
        lo_recipient       
TYPE REF TO if_recipient_bcs,
        lo_bcs_exception   
TYPE REF TO cx_bcs,
        lo_sender          
TYPE REF TO cl_sapuser_bcs,
        lv_currency        
TYPE waers,
        lv_unit            
TYPE meins,
        lv_receiver        
TYPE so_name,
        lv_email_subject   
TYPE so_obj_des,
        lv_gentext         
TYPE itex132,
        lv_binary_content  
TYPE solix_tab,
        lv_binary_content2 
TYPE solix_tab,
        lv_size            
TYPE so_obj_len,
        lv_size2           
TYPE so_obj_len,
        lv_length          
TYPE i,
        lv_sent_to_all     
TYPE os_boolean,
        lv_distlst         
TYPE so_obj_nam,
        lv_mailto          
TYPE ad_smtpadr,
        lv_email_sent      
TYPE os_boolean,
        lv_user            
TYPE sy-uname,
        lv_attach_name     
TYPE so_obj_des.

      
FIELD-SYMBOLS :
        <field_cat>       
LIKE LINE OF lt_field_cat.
*Attachment for no Ack
* Convert ALV in current layout to Excel and send as attachement

      
IF go_salv1 IS BOUND.
        
CALL METHOD go_salv1->get_columns
          RECEIVING
            
value = r_columns.
      
ENDIF.

      lt_field_cat 
= cl_salv_controller_metadata=>get_lvc_fieldcatalog(
        r_columns      
= r_columns
        r_aggregations 
= r_aggregations ).

      
SORT lt_field_cat BY no_out col_pos.

      
LOOP AT lt_field_cat ASSIGNING <field_cat>
                                  
WHERE no_out  = ' '
                                  
AND   hotspot = 'X'.
        
CLEAR <field_cat>-hotspot.
        
MODIFY lt_field_cat FROM <field_cat> TRANSPORTING hotspot.
      
ENDLOOP.
* Use Excel .XLSX format.
      lt_choice 
= cl_salv_export_xml_dialog=>get_gui_spreadsheet_formats(  ).
      
READ TABLE lt_choice INTO ls_choice
           
WITH KEY xml_type = '10'.

      
GET REFERENCE OF g_it_vbak INTO lr_data.


      r_result_data 
= cl_salv_ex_util=>factory_result_data_table(
       r_data                      
= lr_data
       t_fieldcatalog              
= lt_field_cat ).

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

      
CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform
        
EXPORTING
          xml_type      
= ls_choice-xml_type
          xml_version   
= l_version
          r_result_data 
= r_result_data
          xml_flavour   
= if_salv_bs_c_tt=>c_tt_xml_flavour_export
        
IMPORTING
          xml           
= l_xml.
* convert the text string into UTF-16LE binary data including
* byte-order-mark. Mircosoft Excel prefers these settings
* all this is done by new class cl_bcs_convert (see note 1151257)

      
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
        
EXPORTING
          
buffer        = l_xml
        
IMPORTING
          output_length 
= lv_length
        
TABLES
          binary_tab    
= lv_binary_content.
      lv_size 
= lv_length.
*Attachment for with Ack
* Convert ALV in current layout to Excel and send as attachement
*        CALL private mehtod TO START email transmission USING bcs_class
      lv_size2 
= lv_length.
*        lv_receiver = im_name.
      lv_email_subject 
= text-t15.
*  Email body

      la_message
-line = text-t14 .
      
APPEND la_message TO lt_messages.
*  Send email

      
TRY .
*     -------- create persistent send request ------------------------
          lo_send_request 
= cl_bcs=>create_persistent( ).
*     -------- create and set document with attachment ---------------
          lo_document 
= cl_document_bcs=>create_document(
            i_type    
= im_doc_type
            i_text    
= lt_messages
            i_subject 
= lv_email_subject ).                 "#EC NOTEXT
*            IF im_attachment_name IS INITIAL.
          lv_attach_name 
= text-t15.
*            ENDIF.
*            IF im_content_hex IS NOT INITIAL.
**     Add the document as and attachment to email document object
          lo_document
->add_attachment(
            i_attachment_type    
= im_attachment_type
            i_attachment_subject 
= lv_attach_name
            i_attachment_size    
= lv_size
            i_att_content_hex    
= lv_binary_content
            
).
*            ENDIF.
*     add document object to send request
          lo_send_request
->set_document( lo_document ).
* --------- Set the sender to the User Running the Report ---------
          lo_sender 
= cl_sapuser_bcs=>create( sy-uname ).
          lo_send_request
->set_sender( lo_sender ).

          
LOOP AT s_mail[] INTO s_mail.
            lv_mailto 
= s_mail-low.

            
CHECK lv_mailto IS NOT INITIAL.
            lo_recipient 
= cl_cam_address_bcs=>create_internet_address( lv_mailto ).
          
CLEAR lv_mailto.
*     add recipient object to send request
            
CALL METHOD lo_send_request->add_recipient
              
EXPORTING
                i_recipient 
= lo_recipient
                i_express   
= 'X'.
            
FREE: lo_recipient.
          
ENDLOOP.
*     ---------- send document ---------------------------------------
          lv_email_sent 
= lo_send_request->send( i_with_error_screen = 'X' ).

          
COMMIT WORK.

          
IF lv_email_sent IS INITIAL.
            
MESSAGE i500(sbcoms) WITH s_mail-low.
          
ELSE.
            
MESSAGE s022(so).
          
ENDIF.
*   ------------ exception handling ----------------------------------
*   replace this rudimentary exception handling with your own one !!!
        
CATCH cx_bcs INTO lo_bcs_exception.
          
MESSAGE i865(so) WITH lo_bcs_exception->error_type.

      
ENDTRY.
    
ENDMETHOD.                           "send_email

  
ENDCLASS.                              "lcl_email IMPLEMENTATION