ABAP Fonksiyonları-1 (Exelli mail atma)

Her programcının acil durumlar için sakladığı güzel bir kütüphanesi vardır muhakkak. Abap için de aynı durum söz konusu. Bu makaledeki fonksiyonda hayli işlev gören nadide bir parça :)

SAP denilince raporlama ve denetleme geliyor. Bir kurumdaki patrondan kullanıcıya kadar herkesin kullandığı bir sistem SAP. Bu da onu işlevli kılıyor. Aşağıda farklı bir kaç talebi görelim :

–    Yöneticinin isteği : Ben bu hafta işe gelmeyenleri Cuma akşamı mailimde excel formatında görmek istiyorum.

–    İç denetimin isteği : Maaş ile ilgili şeyleri görenleri mailimde excel formatında görmek istiyorum.

–    Kullanıcının isteği: İşten aldığım, kullandığım izin günlerini toplu olarak exel formatında görmek istiyorum.

Bu ve buna benzer milyon tane isteği karşılamaksa abapçının görevi :) Aşağıdaki fonksiyonda bu tip istekler olduğunda verileri çekip exel  dosyası biçiminde ilgili kişiye gönderiyor. Kodlara ait açıklamaları yanlarında görebilirsiniz.

FUNCTION zbtpro_mail_at.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IP_REC) TYPE  BCSY_SMTPA OPTIONAL 
*"     REFERENCE(IP_REC_CC) TYPE  BCSY_SMTPA OPTIONAL
*"     REFERENCE(IP_BODY) TYPE  SRM_T_SOLISTI1 OPTIONAL
*"     REFERENCE(IP_SENDER) TYPE  SO_REC_EXT OPTIONAL
*"     REFERENCE(LV_SIZE) TYPE  I OPTIONAL
*"     REFERENCE(LI_CONTENT_HEX) TYPE  SOLIX_TAB
*"----------------------------------------------------------------------
*" IP_REC bu parametre mailin gideceği kişilerin mail adreslerini içerir.
*" IP_REC_CC bu parametre mailin CC’sinde olacak kişilerin mail adreslerini içerir.
*" IP_BODY bu kısım mailin içeriğidir.
*” IP_SENDER bu parametre maili atanın mail adresini içerir.
*” LV_SIZE bu parametre oluşturduğumuz excelin boyutudur.
*” LI_CONTENT_HEX bu parametre ise oluşturulan excelin hex halidir.

 

DATA: lt_swastrtab TYPE TABLE OF swastrtab,
          lt_att       TYPE solix_tab,
          gs_text      TYPE soli,
          gt_text      TYPE soli_tab  ,
          lv_length    TYPE so_obj_len,
          it_rec       TYPE  bcsy_smtpa ,
          it_rec_cc    TYPE  bcsy_smtpa ,
          lv_status_mail    TYPE bcs_stml,
          lv_date    TYPE char10 ,
          lv_date1   TYPE char10 ,
          lv_datestr TYPE char21 ,
          lv_intadd  TYPE ad_smtpadr .

  LOOP AT ip_rec INTO  lv_intadd.”// mail gideceklerin mail adreslerinin “eklenmesi
    APPEND lv_intadd TO it_rec.
    CLEAR lv_intadd.
  ENDLOOP.

  LOOP AT ip_rec_cc INTO  lv_intadd.”mailin ccsinde olacakların adreslerinin alınması
    APPEND lv_intadd TO it_rec_cc.
    CLEAR lv_intadd.
  ENDLOOP.
  DATA:
        lc_send_request       TYPE REF TO cl_bcs,
        lc_document           TYPE REF TO cl_document_bcs,
        lc_recipient          TYPE REF TO if_recipient_bcs,
        lc_exception_info     TYPE REF TO if_os_exception_info,
        lc_bcs_exception      TYPE REF TO cx_bcs,
        lc_sender             TYPE REF TO cl_cam_address_bcs.

  " part 1 - receivers
  DATA :receivers TYPE somlreci1_t .
  DATA :ls_rec TYPE somlreci1.
  DATA :l_pernr TYPE pernr_d ,
        lv_so10 TYPE tdobname ,
        lt_body TYPE srm_t_solisti1 ,
        ls_body TYPE solisti1 ,
        lv_header TYPE so_obj_des ,
        lv_pdf_title TYPE so_obj_des ,
        lv_sender   TYPE  so_rec_ext,
        lv_sender_add_type TYPE  so_adr_typ VALUE 'INT',
        lv_doc_type        TYPE so_obj_tp VALUE 'HTM' ,
        lt_rec      TYPE somlreci1_t,
        lv_subrc TYPE subrc  .
  DATA: ls_cont TYPE solisti1,
        ls_head TYPE thead,
        lt_text TYPE TABLE OF tline,
        ls_text TYPE tline.

  lv_sender = ip_sender .
  lv_header = 'BAŞLIK'. // Bu kısım mailin başlığıdır. Kimin tarafından gönderildiğini yazar.

  " KULLANICILARIN MAİL ADRESLERİNİN ALINMASI
  DATA ls_adr6 TYPE adr6 .
  DATA ls_usr21 TYPE usr21 .

  CLASS:cl_cam_address_bcs     DEFINITION LOAD,
        cl_abap_char_utilities DEFINITION LOAD.

  DATA lv_sender_address TYPE adr6-smtp_addr .
  lv_sender_address = lv_sender .

  LOOP AT  ip_body INTO ls_body.
    CLEAR gs_text.
    gs_text-line = ls_body-line.
    APPEND gs_text TO gt_text.
  ENDLOOP.

  DESCRIBE TABLE gt_text LINES lv_length.
  lv_length = lv_length  * 255 .
  DATA  lv_len  TYPE so_obj_len .

  DATA : employeenumber  LIKE  bapi7004-pernr VALUE '1001'.
  DATA :  sequencenumber  LIKE  bapi7004_rl-sequencenumber VALUE '350'.
  DATA : payslipvariant  LIKE  bapi7004-payslip_variant  VALUE 'DF01'.
  DATA : lv_xstring TYPE xstring.

  DATA : lv_isim TYPE so_obj_des.

  lv_isim = 'EXCEL İsmi'. // mail ekindeki excel ekinin ismi.
  TRY.// class yapısı ile mailin hazırlanması 
      lc_send_request = cl_bcs=>create_persistent( ).
      lc_sender = cl_cam_address_bcs=>create_internet_address( i_address_string = lv_sender_address ).
      CALL METHOD lc_send_request->set_sender
        EXPORTING
          i_sender = lc_sender.
      LOOP AT it_rec INTO lv_intadd.
        lc_recipient = cl_cam_address_bcs=>create_internet_address( lv_intadd ).
        CALL METHOD lc_send_request->add_recipient
          EXPORTING
            i_recipient  = lc_recipient
            i_express    = ''
            i_copy       = ''
            i_blind_copy = ''
            i_no_forward = ''.
      ENDLOOP.
* Add recipient with its respective attributes to send request
      LOOP AT it_rec_cc INTO lv_intadd. //
        lc_recipient = cl_cam_address_bcs=>create_internet_address( lv_intadd ).
        CALL METHOD lc_send_request->add_recipient
          EXPORTING
            i_recipient  = lc_recipient
            i_express    = ''
            i_copy       = abap_true
            i_blind_copy = ''
            i_no_forward = ''.
      ENDLOOP.

* Build the Main Document
      lc_document = cl_document_bcs=>create_document(
          i_type        = 'HTM'
          i_subject     = lv_header
          i_length      = lv_length
          i_sensitivity = 'F'
          i_text        = gt_text
          i_sender      = lc_sender ) .

      DATA : lv_sizee TYPE  sood-objlen .
      lv_sizee = lv_size.
      IF NOT li_content_hex IS INITIAL.// eğer excelim boş değilse maile ekle 
        lc_document->add_attachment(
          i_attachment_type      =  'xls' “ bu kısım excell için xls olmalı
          i_attachment_subject   =  lv_isim
          i_attachment_size      =   lv_sizee
          i_att_content_hex      =   li_content_hex ).
        CLEAR lv_isim.

      ENDIF.

      CALL METHOD lc_send_request->set_document( lc_document ).
      lv_status_mail = 'E'.
      CALL METHOD lc_send_request->set_status_attributes
        EXPORTING
          i_requested_status = 'E'
          i_status_mail      = lv_status_mail.
      lc_send_request->set_send_immediately( 'X' ).
      CALL METHOD lc_send_request->send( ).
      COMMIT WORK.
    CATCH cx_bcs INTO lc_bcs_exception.

  ENDTRY .

ENDFUNCTION.

 

** excell oluşturma işlemi…
** data tanımlama 
  CONSTANTS:
    gc_tab  TYPE c VALUE cl_bcs_convert=>gc_tab, “ excellde kolon geç 
    gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf.”excell de satır atla

  DATA main_text      TYPE bcsy_text.
  DATA binary_content TYPE solix_tab. “tanımlar 
  DATA size           TYPE so_obj_len. 

**********************************************************************
** excelli hazırla..

  DATA lv_string TYPE string.
  DATA ls_vbrk TYPE vbrk.

**********************************************************************
** excellin en üst kısmında yazan şey...
  CONCATENATE ' Deneme Yapılıyor'                "#EC NOTEXT
              gc_crlf gc_crlf
              INTO lv_string.

 

** veri formatında başlık oluşturduk
  CONCATENATE lv_string
              'VBELN'    gc_tab " gc_tab demek excelde bir kolon atla demek
              'VKORG'    gc_tab
              'BUKRS'    gc_tab
              'STCEG'    gc_crlf  " gc_crlf ise bir alt satıra geç demek..
              INTO lv_string.

* data lines
  SELECT * FROM vbrk INTO ls_vbrk
    WHERE vbeln = p_vbeln.

    CONCATENATE lv_string
                ls_vbrk-vbeln gc_tab
                ls_vbrk-vkorg gc_tab
                ls_vbrk-bukrs gc_tab
                ls_vbrk-stceg  gc_crlf
                INTO lv_string.

  ENDSELECT.

** oluşturduğumuz strigin binary_content’e dönüştürmek gerekiyor bu şekilde maile eklenebilir.
** bu işlem için aşağıdaki class biçilmiş kaftandır  
  TRY.
      cl_bcs_convert=>string_to_solix(
        EXPORTING
          iv_string   = lv_string
          iv_codepage = '4103' “ bu kodu ben iki gün aradım  ben yandım eller yanmasın  4103 türkçe karakter sorununa çözümdür  
          iv_add_bom  = 'X'
        IMPORTING
          et_solix  = binary_content
          ev_size   = size ).
    CATCH cx_bcs.
      MESSAGE e445(so).
  ENDTRY.

Bu parametreleri üsteki fonksiyona verin ondan sonra mailiniz gitmiş olacak 😉

Not: Veriler için arkadaşım Mustafa Önder’ e teşekkür ederken bir de teessüf etmek istiyorum. Bilgisi ve anlatımı kuvvetli olmasına rağmen hala bir blog açıp bildiklerini aktarmamakta diretmesine de hiiiiiç anlam veremiyorum doğrusu. Belki bu makaleden sonra üstüne alınır da başlar 🙂

Allah zihin açıklığı versin.

Published by gulistan

Süleyman Demirel üniversitesi bilgisayar mühendisliği öğrencisiyim.Network ile ilgilenirken birden kendimi SAP-ABAP içinde buldum.İşimden sonra en büyük ilgi alanımsa yemek yapmak :)

Join the Conversation

3 Comments

  1. Hiç açıklayıcı değil ki siz bilince herkesi biliyor sanıyorsunuz herhalde sap nedir ne değildir herhangi bir ders videosuna bakında ondan sonra yayınlayın en temel şey nedir nasıl başlanır kodlar görevleri nelerdir

    1. Eleştirinizi dikkate alağım, çok teşekkür ederim 🙂 Bu arada SAP kategorisi altında temel yazıları da bulabilirsiniz aslında 🙂

Leave a comment

Your email address will not be published. Required fields are marked *