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.