ABAP Batch Input

Övünç DİNÇ

Çözüm Ekibi
Kayıtlı Üye
Katılım
8 Eki 2016
Mesajlar
928
Çözümler
4
Tepki puanı
256
Puanları
63
Yaş
39
Konum
İzmir
Web Sitesi
sapofis.com
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
Çözümler
4
Tepki puanı
256
Puanları
63
Yaş
39
Konum
İzmir
Web Sitesi
sapofis.com
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
Çözümler
4
Tepki puanı
256
Puanları
63
Yaş
39
Konum
İzmir
Web Sitesi
sapofis.com
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