Sorun Cevaplayalım

İşinizle ilgili öngörüler edinin, gerçek zamanlı bilgilere göre karar alın.

SAP Eğitim ve Sertifika Dönemleri

Uzmanlığınızı ve deneyiminizi SAP çözümleri kullanarak tasdik edin.

Çözüm Ekibi Başvurusu

Kullanıcılara hızlı ve pratik çözümler üreterek görev almak isteyenler.

ABAP Batch Input

Övünç DİNÇ

Çözüm Ekibi
Kayıtlı Üye
Katılım
8 Eki 2016
Mesajlar
928
Tepki puanı
246
Konum
İzmir
Kullandığınız SAP Modülleri
  1. SAP MM
  2. SAP PP
Katılım Bölgesi
  1. İzmir
Batch Input SAP’de var olan standart programlara veri girişi yapabilmek için oluşturulmuş bir otomatik veri giriş sistemidir. Program içerisinden uygun parametreler ile CALL TRANSACTIONkomutu ile yapılır. Hangi alana hangi parametrenin gelmesi gerektiğini İşlem Kodu Kaydedici(SHDB) ile yapılan kayıtlardan görebilirsiniz. 3 farklı mod ile yapılabilir :

  • A‘ – Tum adımları göster.
  • E‘ – Sadece hata mesajlarını göster.
  • N‘ – Hiçbirşey gösterme.
İki farklı update modu ile yapılır:

  • S‘ – Verilerin kaydedilmesini bekle.
  • A‘ – Verilerin kaydedilmesini bekleme.
Batch Input yaparken ekranlara dikkat edilmeli çünkü ekranlar değişirse yaptığınız batch input çalışmayacaktır.

Örnek Batch input programı:

Kod:
*-----------------------------------------------------------------------
* ABAP Name : ZMA_BATCHINPUT
*
* Transactions called : ZMA01
* Modifications :
* Recorder : SHDB
*-----------------------------------------------------------------------
REPORT zma_batchinput .
TYPE-POOLS: slis .
*************************** Constants *****************************
CONSTANTS: gc_alv_item_table TYPE slis_tabname VALUE 'GT_ALV', gc_program_name LIKE sy-repid VALUE 'ZMA_BATCHINPUT', gc_title LIKE sy-title VALUE 'MM: Veri Giriş Ekranı.', gc_structure_name LIKE dd02l-tabname VALUE 'ZMA_BIALV'.
****************************** Data *******************************
DATA: gt_flcat TYPE slis_t_fieldcat_alv, gt_layout TYPE slis_layout_alv, gt_event TYPE slis_t_event.
DATA: gf_flcat LIKE LINE OF gt_flcat, gf_event LIKE LINE OF gt_event.
****************************** Data *******************************
DATA: gv_default_folder(128) TYPE c VALUE 'C:\'.
************************* Internal Tables *************************
DATA: BEGIN OF gt_bdctab OCCURS 0. INCLUDE STRUCTURE bdcdata.
DATA: END OF gt_bdctab.
DATA: BEGIN OF gt_tab OCCURS 0, check(1) TYPE c, firmasehir(10) TYPE c, firmatarih(8) TYPE c, firmatelefon(11) TYPE c, firmaadi(10) TYPE c, kullaniciadi(10) TYPE c, sifre(10) TYPE c, email(10) TYPE c, telefon(10) TYPE c, END OF gt_tab.
************************ Selection Screen *************************
SELECTION-SCREEN BEGIN OF BLOCK m1 WITH FRAME TITLE text-001.
PARAMETERS : p_fname LIKE rlgrap-filename DEFAULT 'C:\deneme.txt'.
SELECTION-SCREEN END OF BLOCK m1.
*********************** At Selection Screen ***********************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname. PERFORM value_request_filename USING p_fname.
*********************** Start of selection ************************
START-OF-SELECTION. PERFORM get_data.
END-OF-SELECTION . PERFORM show_data .
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
FORM get_data . CALL FUNCTION 'WS_UPLOAD' EXPORTING filename = p_fname filetype = 'DAT' TABLES data_tab = gt_tab. IF sy-subrc <> 0. WRITE: / 'Dosya Okunamadı'. ENDIF.
ENDFORM. " get_data
*&---------------------------------------------------------------------*
*& Form value_request_filename
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_FNAME text
*----------------------------------------------------------------------*
FORM value_request_filename USING p_p_fname. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING def_filename = '' def_path = gv_default_folder mask = ',*.*,*.*.' mode = 'O' title = 'Mesaj' IMPORTING filename = p_p_fname EXCEPTIONS inv_winsys = 01 no_batch = 02 selection_cancel = 03 selection_error = 04.
ENDFORM. " value_request_filename
*&---------------------------------------------------------------------*
*& Form start_batch
*&---------------------------------------------------------------------*
FORM start_batch. PERFORM open_group_bdc USING 'ZMA001'. LOOP AT gt_tab WHERE check = 'X' . REFRESH gt_bdctab. CLEAR gt_bdctab. PERFORM dynpro USING : 'X' 'ZMA_GENELDENEME' '1000', ' ' 'FIRMASHR' gt_tab-firmasehir, ' ' 'FIRMATRH' gt_tab-firmatarih, ' ' 'FIRMATLF' gt_tab-firmatelefon, ' ' 'FIRMAADI' gt_tab-firmaadi, ' ' 'KULLAAD' gt_tab-kullaniciadi, ' ' 'SIFRE' gt_tab-sifre, ' ' 'EMAIL' gt_tab-email, ' ' 'TELEFON' gt_tab-telefon, ' ' 'BDC_OKCODE' '=ONLI'. PERFORM run_bi_session USING 'ZMA01'. CLEAR gt_tab. ENDLOOP. PERFORM close_group_bdc. WRITE : 'Sistem problemsiz çalıştı.' .
ENDFORM. " start_batch
*&---------------------------------------------------------------------*
*& Form dynpro
*&---------------------------------------------------------------------*
FORM dynpro USING dynbegin name value. CLEAR gt_bdctab. IF dynbegin = 'X'. MOVE: name TO gt_bdctab-program, value TO gt_bdctab-dynpro, 'X' TO gt_bdctab-dynbegin. ELSE. MOVE: name TO gt_bdctab-fnam, value TO gt_bdctab-fval. ENDIF. APPEND gt_bdctab.
ENDFORM. " dynpro
*&---------------------------------------------------------------------*
*& Form open_group_bdc
*&---------------------------------------------------------------------*
FORM open_group_bdc USING p_group. CALL FUNCTION 'BDC_OPEN_GROUP' EXPORTING group = p_group user = sy-uname.
ENDFORM. " open_group_bdc
*&---------------------------------------------------------------------*
*& Form insert_bdc
*&---------------------------------------------------------------------*
FORM insert_bdc USING p_tcode. CALL FUNCTION 'BDC_INSERT' EXPORTING tcode = p_tcode TABLES dynprotab = gt_bdctab.
ENDFORM. " insert_bdc
*&---------------------------------------------------------------------*
*& Form close_group_bdc
*&---------------------------------------------------------------------*
FORM close_group_bdc. CALL FUNCTION 'BDC_CLOSE_GROUP'.
ENDFORM. " close_group_bdc
*&---------------------------------------------------------------------*
*& Form run_bi_session
*&---------------------------------------------------------------------*
FORM run_bi_session USING lv_tcode. CALL TRANSACTION lv_tcode USING gt_bdctab MODE 'N'.
ENDFORM. " run_session
*&---------------------------------------------------------------------*
*& Form show_data
*&---------------------------------------------------------------------*
FORM show_data. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = gc_program_name i_internal_tabname = gc_alv_item_table i_client_never_display = 'X' i_inclname = gc_program_name i_structure_name = gc_structure_name CHANGING ct_fieldcat = gt_flcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3.
* Görüntüleme Özellikleri. gt_layout-zebra = 'X'. gt_layout-window_titlebar = gc_title. gt_layout-colwidth_optimize = 'X'. gt_layout-box_fieldname = 'CHECK'. gt_layout-box_tabname = 'GT_ALV'.
* Event Tanımları. gf_event-name = 'PF_STATUS_SET'. gf_event-form = 'ALV_STATUS'. APPEND gf_event TO gt_event. gf_event-name = 'USER_COMMAND'. gf_event-form = 'ALV_COMMAND'. APPEND gf_event TO gt_event.
* Listeleme. CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING it_fieldcat = gt_flcat i_callback_program = gc_program_name
* i_callback_user_command = 'user_command' i_save = 'A' is_layout = gt_layout it_events = gt_event TABLES t_outtab = gt_tab.
ENDFORM. " show_data
*&---------------------------------------------------------------------*
*& Form ALV_STATUS
*&---------------------------------------------------------------------*
FORM alv_status USING x. SET PF-STATUS '0100'.
ENDFORM. "alv_status
**&---------------------------------------------------------------------
**& Form alv_command
**&---------------------------------------------------------------------
FORM alv_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield. CASE r_ucomm. WHEN 'BBB'. PERFORM start_batch . ENDCASE.
ENDFORM. "alv_status-1
 

Övünç DİNÇ

Çözüm Ekibi
Kayıtlı Üye
Katılım
8 Eki 2016
Mesajlar
928
Tepki puanı
246
Konum
İzmir
Kullandığınız SAP Modülleri
  1. SAP MM
  2. SAP PP
Katılım Bölgesi
  1. İzmir
Avantajları Nelerdir ?
Bana göre en büyük avantajı veriyi valide etmeden işlem yapılabilmesidir. Veriyi var olan program üzerinden içeri aktardardığı için geçersiz giriş yapılma riski yoktur. Program üzerinden manuel olarak giremeyeceğiniz hiç bir veriyi batch input ilede giremezsiniz.

Öncelikle f-47 ekranını inceleyelim.

batch_input_programlama_1.png


Burada “Belge Tarihi”, “Belge Türü”, “Şirket Kodu”, “Kayıt Tarihi”, “Para Birimi”, “Referans”, “Hesap” ve “Hedef ÖDK Gös.” alanları zorunlu alandır. Bu bilgileri girip enter a basarak ikinci ekrana geçiyorum.

batch_input_programlama_3.png


Burada “Tutar”, “Vade Tarihi”, “Ödeme Biçimi”, “Tayin” ve “Metin Alanlarının” doldurulması gerekiyor. Bu bilgileride doldurup kaydet butonuna bastığımız zaman ilk ekrana geri dönerek aşağıdaki uyarıyı alıyoruz.

batch_input_programlama_5.png


Peşinat talebimizi oluşturmuş olduk. Aynı işlemin 300 kullanıcı için yapıldığını düşündüğümüzde (Avans ödemesi, masraf ödemesi dönemlerinde olduğu gibi) tek tek yapmak oldukça vakit kaybına yol açacaktır. Bu örnekte aynı işlemi batch input methodu ile birden çok kişi için tek seferde excelden topluca okuyarak yapacağız.
 

Övünç DİNÇ

Çözüm Ekibi
Kayıtlı Üye
Katılım
8 Eki 2016
Mesajlar
928
Tepki puanı
246
Konum
İzmir
Kullandığınız SAP Modülleri
  1. SAP MM
  2. SAP PP
Katılım Bölgesi
  1. İzmir
Transaction Kaydı Nasıl Oluşturulur ?
Transaction kaydını oluşturmak için, shdb işlem kodunu kullanıyoruz.

batch_input_programlama_7.png


Yeni kayıt diyerek aşağıdaki alanları dolduruyoruz.

batch_input_programlama_8.png


Kayıt ismini yazıp (ZF-47) işlem kodunu girdikten sonra kaydı başlat diyoruz ve f-47 işlem kodunu çalıştırmaya başlıyoruz. Ben güncelleme tipi olarak senkron seçeneğini seçiyorum. Duruma göre özellikle büyük datalarda asenkron seçeneğini seçmemiz gerekebilir.

batch_input_programlama_9.png


Yukarıda f-47 işlem kodunu anlatmıştım. Aynı şekilde burada gerekli alanları dolduruyoruz ve sonrasında kaydediyoruz. Kayıt tamamlandıktan sonra karşımıza aşağıdaki ekran çıkıyor.

batch_input_programlama_10.png


Bu ekranıda kayıt ettikten sonra transaction kaydımız tamamlanmış oluyor. Tekrar shdb işlem koduna giderek yeni oluşturduğumuz kaydı görüyoruz.

batch_input_programlama_11.png


Kaydı oluşturduk ancak programda nasıl kulanacağımızı görmemiz için lgili kaydı seçip program butonuna basarak aşağıda görüldüğü şekilde yeni bir program oluşturuyoruz.

batch_input_programlama_12.png


batch_input_programlama_13.png


Source code butonuna tıklayarak programa gidiyoruz.

Kod:
report ZF47_ABAP_BATCH_PROGRAMLAMA no standard page heading line-size 255.
include bdcrecx1.
parameters: dataset(132) lower case.
*** DO NOT CHANGE - the generated data section - DO NOT CHANGE ***
*
* If it is nessesary to change the data section use the rules:
* 1.) Each definition of a field exists of two lines
* 2.) The first line shows exactly the comment
* '* data element: ' followed with the data element
* which describes the field.
* If you don't have a data element use the
* comment without a data element name
* 3.) The second line shows the fieldname of the
* structure, the fieldname must consist of
* a fieldname and optional the character '_' and
* three numbers and the field length in brackets
* 4.) Each field must be type C.
*
*** Generated data section with specific formatting - DO NOT CHANGE ***
data: begin of record,
* data element: BLDAT BLDAT_001(010),
* data element: BLART BLART_002(002),
* data element: BUKRS BUKRS_003(004),
* data element: BUDAT BUDAT_004(010),
* data element: WAERS WAERS_005(005),
* data element: KURSF KURSF_006(010),
* data element: XBLNR1 XBLNR_007(016),
* data element: NEWKO NEWKO_008(017),
* data element: DZUMSK ZUMSK_009(001),
* data element: WRBTR WRBTR_010(016),
* data element: DZFBDT ZFBDT_011(010),
* data element: DZLSPR ZLSPR_012(001),
* data element: SCHZW_BSEG ZLSCH_013(001),
* data element: DZUONR ZUONR_014(018),
* data element: SGTXT SGTXT_015(050), end of record.
*** End generated data section ***
start-of-selection.
perform open_dataset using dataset.
perform open_group.
do.
read dataset dataset into record.
if sy-subrc <> 0. exit. endif.
perform bdc_dynpro using 'SAPMF05A' '0112'.
perform bdc_field using 'BDC_CURSOR' 'RF05A-ZUMSK'.
perform bdc_field using 'BDC_OKCODE' '=NP'.
perform bdc_field using 'BKPF-BLDAT' record-BLDAT_001.
perform bdc_field using 'BKPF-BLART' record-BLART_002.
perform bdc_field using 'BKPF-BUKRS' record-BUKRS_003.
perform bdc_field using 'BKPF-BUDAT' record-BUDAT_004.
perform bdc_field using 'BKPF-WAERS' record-WAERS_005.
perform bdc_field using 'BKPF-KURSF' record-KURSF_006.
perform bdc_field using 'BKPF-XBLNR' record-XBLNR_007.
perform bdc_field using 'RF05A-NEWKO' record-NEWKO_008.
perform bdc_field using 'RF05A-ZUMSK' record-ZUMSK_009.
perform bdc_dynpro using 'SAPMF05A' '0304'.
perform bdc_field using 'BDC_CURSOR' 'BSEG-SGTXT'.
perform bdc_field using 'BDC_OKCODE' '=BU'.
perform bdc_field using 'BSEG-WRBTR' record-WRBTR_010.
perform bdc_field using 'BSEG-ZFBDT' record-ZFBDT_011.
perform bdc_field using 'BSEG-ZLSPR' record-ZLSPR_012.
perform bdc_field using 'BSEG-ZLSCH' record-ZLSCH_013.
perform bdc_field using 'BSEG-ZUONR' record-ZUONR_014.
perform bdc_field using 'BSEG-SGTXT' record-SGTXT_015.
perform bdc_transaction using 'F-47'.
enddo.
perform close_group.
perform close_dataset using dataset.

Program oluştu ancak veriyi excelden almamız gerektiği için programı kendimize göre özelleştirmemiz gerekiyor. Ben özelleştirmeyi buradan ihtiyacım olan satırları alarak yeni bir programda yapacağım. Ancak siz bu program üzerinde yapabilirsiniz.

Yazacağımız program aşağıdaki aşamalardan oluşacaktır.

  1. Kullanıcının elindeki excel ve statik olarak almak istediğimiz bilgiler için selection screen hazırlanması.
  2. Exceli okuyup verilerinin alv ile ekrana yazdırılması.
  3. Batch input methodu ile peşinat taleblerinin oluşturulması.
  4. Kullanıcıya geri dönüş bilgisinin verilmesi.
İçeri aktarılan excel formatı aşağıdaki gibi olmalıdır.

batch_input_programlama_6.png


f-47 ekranındaki diğer zorunlu alanlar (Belge Tarihi, Kayıt Tarihi, Vade Tarihi) selection screen den girilecektir. Ancak tercihe göre excelden de okunabilir.

Kod:
REPORT ZFI_ODEME_TALEPLERI_OKU.
* +++ İçeri Aktarılan Excel Şablonu
* GT_DOSYA
* Belge Türü
* Şirket Kodu
* Para Birimi
* Referans
* Hesap
* Hedef ÖDK gös.
* Tutar
* Ödeme Biçimi
* Tayin
* Metin
* --- İçeri Aktarılan Excel Şablonu
*Alv için gerekli tip havuzu
TYPE-POOLS slis.
*Veriyi geçici olarak tutacağımız internal tablo tanımı
DATA: BEGIN OF gt_dosya OCCURS 0, BLDAT TYPE BLDAT, BLART TYPE BLART, BUKRS TYPE BUKRS, BUDAT TYPE BUDAT, WAERS TYPE WAERS, XBLNR1 TYPE XBLNR1, NEWKO TYPE NEWKO, DZUMSK TYPE DZUMSK, WRBTR TYPE STRING, DZFBDT TYPE DZFBDT, SCHZW_BSEG TYPE SCHZW_BSEG, DZUONR TYPE DZUONR, SGTXT TYPE SGTXT, MESAJ TYPE c LENGTH 50, COLTAB TYPE lvc_t_scol, END OF gt_dosya.
*Alv ve batch input için gerekli tanımlamalar
DATA : gt_fcat TYPE slis_t_fieldcat_alv, gs_fcat TYPE slis_fieldcat_alv, gs_renk TYPE lvc_s_scol, gs_layout TYPE slis_layout_alv, GT_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE, GT_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE, gv_sayac TYPE sy-tabix value 0, gv_error TYPE n LENGTH 1 VALUE 0.
*Belge tarihi / Kayıt Tarihi, Vade Tarihi ve Local dosyayı almamız için gerekli
*tanımlamalar.
PARAMETERS p_bldat TYPE BLDAT OBLIGATORY.
PARAMETERS p_dzfbdt TYPE DZFBDT OBLIGATORY.
PARAMETERS p_fname TYPE localfile OBLIGATORY.
*f4 ile dosya araması yapılabilmesi için f4_name subroutin i çağırıyoruz
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname. PERFORM f4_fname.
*Gerekli alanları doldurup çalıştır dediğimizde sırası ile upload_data(Excelden
*veriyi okuyoruz), generate_fcat(Alv için field catalog düzenlenmesi),
*generate_layout(Alv için layout düzenlenmesi) ve dipslay_data(Alv ile verileri
*gösteriyoruz) subrouitinlerini çağırıyoruz. Son olarak Alv içinden user_command
*routini çağırarak batch input işlemimizi yapıyoruz.
START-OF-SELECTION. PERFORM upload_data. CHECK gt_dosya[] IS NOT INITIAL. PERFORM generate_fcat. PERFORM generate_layout. PERFORM display_data.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form f4_fname
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f4_fname . DATA: file_table TYPE filetable, file_line TYPE file_table, rc TYPE i. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING default_extension = '' CHANGING file_table = file_table rc = rc EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5. READ TABLE file_table INTO file_line INDEX 1. IF sy-subrc = 0. p_fname = file_line-filename. ENDIF.
ENDFORM. "f4_fname
*&---------------------------------------------------------------------*
*& Form upload_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM upload_data . DATA: lt_file LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = p_fname i_begin_col = 1 i_begin_row = 2 i_end_col = 10 i_end_row = 1000 TABLES intern = lt_file EXCEPTIONS inconsistent_parameters = 1 upload_ole = 2 OTHERS = 3. IF sy-subrc NE 0 OR lt_file[] IS INITIAL. MESSAGE 'Dosya Okunamadı !' TYPE 'I'. ELSE. REFRESH gt_dosya. LOOP AT lt_file. gt_dosya-bldat = p_bldat. gt_dosya-budat = p_bldat. gt_dosya-dzfbdt = p_dzfbdt. CASE lt_file-col. WHEN '0001'. MOVE lt_file-value TO gt_dosya-blart. WHEN '0002'. MOVE lt_file-value TO gt_dosya-bukrs. WHEN '0003'. MOVE lt_file-value TO gt_dosya-waers. WHEN '0004'. MOVE lt_file-value TO gt_dosya-xblnr1. WHEN '0005'. MOVE lt_file-value TO gt_dosya-newko. WHEN '0006'. MOVE lt_file-value TO gt_dosya-dzumsk. WHEN '0007'. MOVE lt_file-value TO gt_dosya-wrbtr. WHEN '0008'. MOVE lt_file-value TO gt_dosya-schzw_bseg. WHEN '0009'. MOVE lt_file-value TO gt_dosya-dzuonr. WHEN '0010'. MOVE lt_file-value TO gt_dosya-sgtxt. ENDCASE. AT END OF row. APPEND gt_dosya. CLEAR gt_dosya. ENDAT. ENDLOOP. IF gt_dosya[] IS INITIAL. MESSAGE 'Dosyada Data Bulunamadı!' TYPE 'I'. ENDIF. ENDIF.
ENDFORM. "upload_data
*&---------------------------------------------------------------------*
*& Form convert_string_to_date
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_STR text
* -->P_DAT text
*----------------------------------------------------------------------*
FORM convert_string_to_date USING p_str CHANGING p_dat. CONCATENATE p_str+6(4) p_str+3(2) p_str(2) INTO p_dat.
ENDFORM. "convert_string_to_date
*&---------------------------------------------------------------------*
*& Form GENERATE_FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM GENERATE_FCAT. PERFORM appalv USING 'BLDAT' 'GT_DOSYA' 'Belge Tarihi' '10'. PERFORM appalv USING 'BLART' 'GT_DOSYA' 'Belge Türü' '10'. PERFORM appalv USING 'BUKRS' 'GT_DOSYA' 'Şirket Kodu' '10'. PERFORM appalv USING 'BUDAT' 'GT_DOSYA' 'Kayıt Tarihi' '10'. PERFORM appalv USING 'WAERS' 'GT_DOSYA' 'Para Birimi' '10'. PERFORM appalv USING 'XBLNR1' 'GT_DOSYA' 'Referans' '10'. PERFORM appalv USING 'NEWKO' 'GT_DOSYA' 'Hesap' '10'. PERFORM appalv USING 'DZUMSK' 'GT_DOSYA' 'Hedef ÖDK gös.' '10'. PERFORM appalv USING 'WRBTR' 'GT_DOSYA' 'Tutar' '10'. PERFORM appalv USING 'DZFBDT' 'GT_DOSYA' 'Vade Tarihi' '10'. PERFORM appalv USING 'SCHZW_BSEG' 'GT_DOSYA' 'Ödeme Biçimi' '10'. PERFORM appalv USING 'DZUONR' 'GT_DOSYA' 'Tayin' '10'. PERFORM appalv USING 'SGTXT' 'GT_DOSYA' 'Metin' '30'. PERFORM appalv USING 'MESAJ' 'GT_DOSYA' 'Mesaj' '50'.
ENDFORM. "GENERATE_FCAT
*&---------------------------------------------------------------------*
*& Form appalv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FN text
* -->P_TN text
* -->P_TXT text
* -->P_FIX text
* -->P_KEY text
* -->P_NO_ZERO text
*----------------------------------------------------------------------*
FORM appalv USING p_fn p_tn p_txt p_out. CLEAR gs_fcat. gs_fcat-fieldname = p_fn . "ITAB da tanımladığımız sütun adı gs_fcat-tabname = p_tn . "ITAB adı gs_fcat-seltext_m = p_txt . "ALV de görünecek sütun başlığı gs_fcat-outputlen = p_out. APPEND gs_fcat TO gt_fcat.
ENDFORM. "appalv
*&---------------------------------------------------------------------*
*& Form generate_layout
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM generate_layout. gs_layout-zebra = 'X'. gs_layout-coltab_fieldname = 'COLTAB'.
ENDFORM. "generate_layout
*Batch input burada başlıyor. Gerekli satırları yukarıdaki programdan
*alıyorum(Sarı ile işaretli satırlar).
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_UCOMM text
* -->IS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING i_ucomm TYPE syucomm is_selfield TYPE slis_selfield. "#EC CALLED CASE i_ucomm. WHEN 'EXEC'. is_selfield-refresh = 'X'. LOOP AT gt_dosya. gv_sayac = gv_sayac + 1. REFRESH gt_bdcdata. REFRESH gt_messtab. PERFORM convert_date_format USING gt_dosya-BLDAT CHANGING gt_dosya-BLDAT. PERFORM convert_date_format USING gt_dosya-BUDAT CHANGING gt_dosya-BUDAT. PERFORM convert_date_format USING gt_dosya-DZFBDT CHANGING gt_dosya-DZFBDT. perform bdc_dynpro using 'SAPMF05A' '0112'. perform bdc_field using 'BDC_CURSOR' 'RF05A-ZUMSK'. perform bdc_field using 'BDC_OKCODE' '=NP'. perform bdc_field using 'BKPF-BLDAT' gt_dosya-BLDAT. perform bdc_field using 'BKPF-BLART' gt_dosya-BLART. perform bdc_field using 'BKPF-BUKRS' gt_dosya-BUKRS. perform bdc_field using 'BKPF-BUDAT' gt_dosya-BUDAT. perform bdc_field using 'BKPF-WAERS' gt_dosya-WAERS. perform bdc_field using 'BKPF-XBLNR' gt_dosya-XBLNR1. perform bdc_field using 'RF05A-NEWKO' gt_dosya-NEWKO. perform bdc_field using 'RF05A-ZUMSK' gt_dosya-DZUMSK. perform bdc_dynpro using 'SAPMF05A' '0304'. perform bdc_field using 'BDC_CURSOR' 'BSEG-SGTXT'. perform bdc_field using 'BDC_OKCODE' 'BU'. perform bdc_field using 'BSEG-WRBTR' gt_dosya-WRBTR. perform bdc_field using 'BSEG-ZFBDT' gt_dosya-DZFBDT. perform bdc_field using 'BSEG-ZLSCH' gt_dosya-SCHZW_BSEG. perform bdc_field using 'BSEG-ZUONR' gt_dosya-DZUONR. perform bdc_field using 'BSEG-SGTXT' gt_dosya-SGTXT.
*Herbir satırı call transaction methodu ile işliyorum. Hata anında durması için
*MODE 'E' diyorum. Hata verdiğinde ilgi kayıt düzeltilipp devam edilebilir. Veya
*düzeltilmeden çıkış yapılabilir. CALL TRANSACTION 'F-47' USING gt_bdcdata MODE 'E' UPDATE 'S' MESSAGES INTO gt_messtab. IF sy-msgv1 EQ ''. gv_error = 1. gt_dosya-mesaj = 'Belge kaydedilemedi'. CLEAR gs_renk. gs_renk-fname = 'MESAJ'. gs_renk-color-col = '6'. gs_renk-color-int = '1'. gs_renk-color-inv = '0'. APPEND gs_renk TO gt_dosya-coltab. ELSE. CONCATENATE sy-msgv1 'Numaralı belge kaydedildi' INTO gt_dosya-mesaj SEPARATED BY ''. CLEAR gs_renk. gs_renk-fname = 'MESAJ'. gs_renk-color-col = '5'. gs_renk-color-int = '1'. gs_renk-color-inv = '0'. APPEND gs_renk TO gt_dosya-coltab. ENDIF. MODIFY gt_dosya FROM gt_dosya INDEX gv_sayac TRANSPORTING mesaj coltab. ENDLOOP. IF gv_error EQ 1. MESSAGE 'Kayıt edilemeyen belgeler var kontrol ediniz.' TYPE 'I'. ELSE. MESSAGE 'Tüm belgeler kayıt edildi.' TYPE 'S'. ENDIF. ENDCASE.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form convert_date_format
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_STR text
* -->P_DAT text
*----------------------------------------------------------------------*
FORM convert_date_format USING p_str CHANGING p_dat. CONCATENATE p_str+6(2) p_str+4(2) p_str(4) INTO p_dat.
ENDFORM. "convert_date_format
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PROGRAM text
* -->DYNPRO text
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO. CLEAR GT_BDCDATA. GT_BDCDATA-PROGRAM = PROGRAM. GT_BDCDATA-DYNPRO = DYNPRO. GT_BDCDATA-DYNBEGIN = 'X'. APPEND GT_BDCDATA.
ENDFORM. "BDC_DYNPRO
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL. CLEAR GT_BDCDATA. GT_BDCDATA-FNAM = FNAM. GT_BDCDATA-FVAL = FVAL. APPEND GT_BDCDATA.
ENDFORM. "BDC_FIELD
*&---------------------------------------------------------------------*
*& Form pf_status_set
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->UT_EXTAB text
*----------------------------------------------------------------------*
FORM pf_status_set USING ut_extab TYPE slis_t_extab. SET PF-STATUS 'STANDARD_FULLSCREEN' .
ENDFORM. " PF_STATUS_SET
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DISPLAY_DATA. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_pf_status_set = 'PF_STATUS_SET' i_callback_user_command = 'USER_COMMAND' is_layout = gs_layout it_fieldcat = gt_fcat i_callback_program = sy-repid TABLES t_outtab = gt_dosya.
ENDFORM. "DISPLAY_DATA


Programı çalıştırdığımız zaman ekran görüntüleri aşağıdaki gibi olacaktır.

batch_input_programlama_14.png


asd.jpg


Değerleri doldurup çalıştır dediğimizde excel i okuyup verileri alv ile ekrana yazıdırıyoruz.

batch_input_programlama_16.png


Çalıştır dediğimize batch input tetikleniyor. Yukarıdaki satırları incelediğimiz zaman 3. satırda hesap kolonunun boş olduğunu görüyoruz. Bu durumda ilk satırı kayıt edip 3. satırda hata vermesi gerekiyor.

batch_input_programlama_17.png


Gördüğünüz gibi 3. satırda hata verdi. Gerekli düzeltmeyi yapıp devam edebilirim ancak ben yukarıdan çıkış butonuna basıp kaydetmeden çıkıyorum.

batch_input_programlama_18.png


batch_input_programlama_19.png


Gördüğünüz gibi kullanıcıya gerekli bilgiler ve uyarılar verildi.

Böylelikte örneğimizin sonuna geldik. Batch input çok kullanılan bir methodtur. Elimden geldiğince ayrıntılı bir şekilde anlatmaya çalıştım umarım faydalı olmuştur.
 
Üst