SAP ABAP: Çoklu Excel Sayfası (Multi-Sheet) Okuma ve Veri İşleme

Bu dokümanda, standart ABAP fonksiyonlarının yetersiz kaldığı durumlarda, Desktop Office Integration (DOI) tekniğini kullanarak bir Excel dosyasındaki birden fazla çalışma sayfasından (Sheet) nasıl veri okuyacağımızı ve işleyeceğimizi adım adım inceleyeceğiz. Bu yöntem, özellikle karmaşık veri aktarımı veya raporlama senaryolarında hayati öneme sahiptir.

1. Giriş: Desktop Office Integration (DOI) Nedir?

Desktop Office Integration (DOI), SAPGUI ile kullanıcının yerel bilgisayarında yüklü olan Microsoft Office uygulamaları (Excel, Word vb.) arasında etkileşim kurmayı sağlayan bir ABAP teknolojisidir.

Neden DOI Kullanmalıyız?

  • Çoklu Sayfa Okuma: Standart ABAP fonksiyonları genellikle tek bir Excel sayfasını okuyabilir. DOI, dosyanın tamamına erişerek tüm sayfaları listeleyebilir ve okuyabilir.
  • İleri Düzey Kontrol: Excel uygulamasını bir SAP ekranı içinde gömülü (in-place) olarak açabilir ve sayfa seçme, hücre okuma, formatlama gibi işlemleri kod ile yönetebilirsiniz.

2. Programın Mimarisi ve Ana Nesneler

Bu kod, tamamen ABAP Nesne Yönelimli Programlama (OOP) prensiplerine dayanır ve Excel’i yönetmek için özel SAP sınıflarını (Interface’leri) kullanır.

3. Seçim Ekranı ve Parametreler

Program, kullanıcıdan temel olarak üç girdi ister:

PARAMETERS:
  p_file TYPE  localfile OBLIGATORY,  " Excel Dosya Yolu
  p_rows TYPE i DEFAULT 2000 OBLIGATORY,   " Okunacak Maksimum Satır Sayısı
  p_cols TYPE i DEFAULT 25 OBLIGATORY.    " Okunacak Maksimum Sütun Sayısı
  • p_file: Okunacak Excel dosyasının tam yolu.
  • p_rows / p_cols: Excel’den okunacak veri aralığını dinamik olarak belirlemek için kullanılır. Bu, kodun esnekliğini artırır.


3.1 F4 Yardımının Oluşturulması (SUB_FILE_F4)

  • AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file olay bloğu tetiklendiğinde çalışan bu alt program, kullanıcının dosya yolu seçmesini kolaylaştırır:
  • CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY: Kullanıcının Masaüstü yolunu alır.
  • CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG: Standart Windows/GUI dosya açma penceresini açar ve seçilen dosya yolunu p_file parametresine atar.

4. DOI Nesnelerinin Başlatılması (INITIALIZATION)

DOI kullanmanın en kritik adımı, Selection Screen’in yüklenmesinden önce (yani INITIALIZATION anında) gerekli kontrol nesnelerini oluşturmaktır.

  1. Ana Kontrol Nesnesi:
CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = iref_control
      error   = iref_error.
  IF iref_error->has_failed = 'X'.
    CALL METHOD iref_error->raise_message
      EXPORTING
        type = 'E'.
  ENDIF. 


Bu, tüm Office entegrasyonunu yönetecek temel kontrol nesnesini (iref_control) yaratır.

2. Ana Kontrol Nesnesi:

CREATE OBJECT oref_container
EXPORTING
container_name = 'CONT'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE e001(00) WITH 'Error while creating container'.
ENDIF.

Ekran üzerinde (bu programda gösterilmese de), Excel’i görüntülemek için sanal bir alan (CONT) oluşturulur.

3. Kontrolün Başlatılması:

 CALL METHOD iref_control->init_control
EXPORTING
inplace_enabled = 'X'
r3_application_name = 'EXCEL CONTAINER'
parent = oref_container
IMPORTING
error = iref_error
EXCEPTIONS
javabeannotsupported = 1
OTHERS = 2.
IF iref_error->has_failed = 'X'.
CALL METHOD iref_error->raise_message
EXPORTING
type = 'E'.
ENDIF.

Kontrol nesnesi, oluşturulan konteynere bağlanır ve Excel entegrasyonu için yapılandırılır.

4. Doküman Nesnesi:

  CALL METHOD iref_control->get_document_proxy
EXPORTING
document_type = soi_doctype_excel_sheet
IMPORTING
document_proxy = iref_document
error = iref_error.
IF iref_error->has_failed = 'X'.
CALL METHOD iref_error->raise_message
EXPORTING
type = 'E'.
ENDIF.

Belge (Doküman) arayüzü (iref_document) alınır. soi_doctype_excel_sheet parametresi, çalışacağımız uygulamanın Excel olduğunu belirtir.


5. Çoklu Sayfa Okuma Akışı (START-OF-SELECTION)

Programın esas işlevi, ana olay bloğunda gerçekleşir.

5.1 Excel Dosyasının Açılması

CONCATENATE 'FILE://' p_file INTO v_document_url.

CALL METHOD iref_document->open_document
EXPORTING
document_title = 'Excel'
document_url = v_document_url
open_inplace = 'X'" SAP ekranı içinde gömülü aç
IMPORTING
error = iref_error.
IF iref_error->has_failed = 'X'.
CALL METHOD iref_error->raise_message
EXPORTING
type = 'I'.
LEAVE LIST-PROCESSING.
ENDIF.

Excel dosyası, dosya yolu FILE:// öneki eklenerek bir URL formatında hazırlanır ve open_document metodu ile açılır.

5.2 Spreadsheet Arayüzünün Alınması

  CALL METHOD iref_document->get_spreadsheet_interface
EXPORTING
no_flush = ' '
IMPORTING
error = iref_error
sheet_interface = iref_spreadsheet.

IF iref_error->has_failed = 'X'.
CALL METHOD iref_error->raise_message
EXPORTING
type = 'I'.
LEAVE LIST-PROCESSING.
ENDIF.

Açılan dökümanın Excel çalışma sayfalarıyla etkileşim kurmak için özel arayüz (iref_spreadsheet) elde edilir.

5.3 Sayfaların Listelenmesi

CALL METHOD iref_spreadsheet->get_sheets
EXPORTING
no_flush = ' '
IMPORTING
sheets = i_sheets " Tüm sayfa isimlerini bu tabloya alır
error = iref_error.
IF iref_error->has_failed = 'X'.
CALL METHOD iref_error->raise_message
EXPORTING
type = 'I'.
LEAVE LIST-PROCESSING.
ENDIF.

Bu metot, Excel dosyasındaki tüm çalışma sayfalarının isimlerini (Sheet Name) i_sheets iç tablosuna doldurur. Bu, çoklu sayfa okuma işleminin başlangıç noktasıdır.

5.4 Sayfalar Arasında Döngü ve Veri Okuma

Esas veri okuma işlemi, i_sheets tablosu üzerinde bir LOOP kurularak yapılır:

LOOP AT i_sheets INTO wa_sheets.
CALL METHOD iref_spreadsheet->select_sheet
EXPORTING
name = wa_sheets-sheet_name
IMPORTING
error = iref_error.
IF iref_error->has_failed = 'X'.
CONTINUE.
ENDIF.
CALL METHOD iref_spreadsheet->set_selection
EXPORTING
top = 4
left = 1
rows = p_rows
columns = p_cols.

CALL METHOD iref_spreadsheet->insert_range
EXPORTING
name = 'Test'
rows = p_rows
columns = p_cols
no_flush = ''
IMPORTING
error = iref_error.
IF iref_error->has_failed = 'X'.
EXIT.
ENDIF.

REFRESH i_data.

CALL METHOD iref_spreadsheet->get_ranges_data
EXPORTING
rangesdef = lt_range
IMPORTING
contents = i_data
error = iref_error
CHANGING
ranges = i_ranges.
DELETE i_data WHERE value IS INITIAL OR value = space.
ULINE.
WRITE:/1 wa_sheets-sheet_name COLOR 6.
ULINE.
ENDLOOP.

5.4.1 Sayfa Seçimi: iref_spreadsheet->select_sheet metodu, döngüdeki mevcut sayfa adına (wa_sheets-sheet_name) göre aktif çalışma sayfasını değiştirir.

5.4.2 Okunacak Aralığın Tanımlanması: lt_range tablosu, okunacak satır ve sütun aralığını (4. satır 1. sütundan başlayarak P_ROWS ve P_COLS kadar) belirler.

5.4.3 Verinin Alınması (get_ranges_data):

  • Bu metot, tanımlanan aralıktaki veriyi okur.
  • Okunan veri, genel tipteki bir iç tablo olan i_data’ya aktarılır. i_data tablosu, hücre değerini, satır numarasını ve sütun numarasını tutan standart bir yapıdır (soi_generic_item).

5.5 Verinin Listelenmesi

Okunan veri (i_data), programın sonunda satır ve sütun numaralarına göre basit bir WRITE komutuyla ekrana basılır.

LOOP AT i_data INTO wa_data.
WRITE:(50) wa_data-value.
AT END OF row. " Her satır bittiğinde
NEW-LINE. " Yeni satıra geçer
ENDAT.
ENDLOOP.

6. Veriyi İşlemek İçin İyileştirme (Yorum Satırları)

Kod bloğunuzdaki yorum satırları, okunan genel formatlı veriyi (i_data) istenen formatta bir iç tabloya aktarmak için mükemmel bir yöntem önermektedir. Bu, gerçek projeler için zorunlu bir adımdır:

6.1 Veri Dönüşümü Mantığı

6.1.1 Satırları Ayırma: i_data tablosu, hücre bazında veri içerir. Önce SORT lt_data_row BY row ve DELETE ADJACENT DUPLICATES FROM lt_data_row COMPARING row ile benzersiz satır numaraları listesi oluşturulur.

6.1.2 Satırları Ayırma:

LOOP AT lt_data_row.       " Satır bazında döngü
LOOP AT i_data INTO wa_data WHERE row = lt_data_row-row. " Hücre bazında döngü
CASE wa_data-column. " Sütun numarasına göre alan atama
WHEN '1'.
lt_table-Malzeme_No = wa_data-value.
...
ENDCASE.
ENDLOOP.
APPEND lt_table. " Yeni satırı tabloya ekle
ENDLOOP.

Bu döngü, her satır için (lt_data_row döngüsü), o satırdaki tüm hücreleri (i_data döngüsü) tarar ve sütun numarasına göre (CASE wa_data-column) kullanıcı tanımlı hedef tabloya (lt_table) atar. Bu sayede veriyi ABAP standartlarında işlenebilir hale getirmiş olursunuz.


Gördüğünüz gibi, doğru araçlar ve yaklaşımla, SAP ABAP’ta “imkansız” denilen birçok işi otomatikleştirebiliriz. Desktop Office Integration (DOI), özellikle karmaşık veri aktarımlarında ve kullanıcı etkileşimli çözümlerde elinizi çok güçlendirecektir.

Bu kod parçası ve teknik, standart SAP kısıtlamalarının ötesine geçmenizi sağlayacak güçlü bir referanstır.

Kodun Tamamına Erişin ve Deneyin

Teoriyi pratiğe dökmek her zaman en iyi öğrenme yöntemidir! Bu kapsamlı çoklu sayfa okuma çözümünün tamamlanmış ve çalışır durumdaki ABAP koduna GitHub deposundan ulaşabilirsiniz.

GitHub Deposu Linki:

🔗 github/serkanbasdag


İletişim

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir