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.