SAP’den Excel’e Veri Çekme

Bugunku konumuz benim gibi SAP kullanan arkadaslarimizi daha cok ilgilendirecek bir konu;

Konu basligindan da anlasilacagi uzere SAP’den real time data cekebilmek icin uzerinde calistigim bir konunun taslak halini sizlerle paylasacagim, Calismamizda oncelik tablo adinin verilmesi ve tablo alanlarinin bir form uzerinde belirmesi daha sonra ihtiyac duyulan alanlarin secilerek SAP’ye gonderilmesi ve tablo iceriginin alinmasi gibi bir surec takip edecegiz.

Oncelikle tablo adinin verilmesi ve tabloya ait alanlarin listbox icerisine doldurulmasi ile ilgili bir calismamizin olmasi gerekiyor, Ben “VBRK” tablosunu kullanacagim fkay tablosunun “BSEG” yahut herhangi bir baska tablo olmasi birsey degistirmezdi.

Tablo adini girip onayladiginizda SAP giris ekrani ile karsilasacaksiniz, sonrasinda islem yapmak istediginiz sistemi secip kullanici adi ve sifrenizi girmeniz gerekmekte. (Kod icerisinde de default olarak atanabilir.)

Baglanti bilgileriniz girdiginizde SAP’den tablo alanlarinin teknik adlarini ve aciklamalarini listbox icerisinde gormus olacaksiniz. Bu gorunume ve formun anlatimina gecmeden once bu bolume kadar kullandigimiz kodlari paylasmak istiyorum. (bu bolume kadar tablo alanlarini cekmek icin bir islem yaptik.)

 

Public Giris_degeri As Variant
Sub Get_Table_Headers()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Giris_degeri = UCase(Application.InputBox(“Tablo Adini Giriniz.”, “SAP Table Name Input”, “VBRK”))
‘Cancel Butonu kullanilirsa kapat
If Giris_degeri = False Then Exit Sub
If Left(UCase(Giris_degeri), 1) = “Z” Then
frmZQuery.txtTableName.Text = UCase(Giris_degeri)
frmZQuery.txtSelect.Text = UCase(“SAMPLE FIELD” & ” EQ ‘#'”)
frmZQuery.Show
Exit Sub
End If
Logon – SAP
Dim SAP_R3_Connection As Object
Set SAP_R3_Connection = CreateObject(“SAP.Functions”) ‘Create ActiveX object
Set SAP_R3_Connection = CreateObject(“SAP.Functions”)
SAP_R3_Connection.Connection.System = “PEP”
SAP_R3_Connection.Connection.Client = “100”
SAP_R3_Connection.Connection.User = “user”
SAP_R3_Connection.Connection.Password = “pass”
SAP_R3_Connection.Connection.Language = “EN”
If SAP_R3_Connection.Connection.logon(0, False) <> True Then ‘Try Logon
MsgBox “Cannot Log on to SAP”
Exit Sub
End If
**********************************************
Fonksiyonun Tanimlanmasi
**********************************************
Dim RFC_Function As Object
Set RFC_Function = SAP_R3_Connection.Add(“RFC_READ_TABLE”)
Dim SAP_Query_Table, SAP_Row_Count As Object
Set SAP_Query_Table = RFC_Function.exports(“QUERY_TABLE”)
**********************************************
Tablo Secimi
**********************************************
SAP_Query_Table.Value = Giris_degeri
Set SAP_Row_Count = RFC_Function.exports(“ROWCOUNT”)
Dim returnFunc As Boolean
Dim exception As String
RFC_Function.exports(“NO_DATA”) = 0
returnFunc = RFC_Function.Call
exception = RFC_Function.exception
If exception = “INVALID_TABLE” Then
MsgBox “Table entered is not present in SAP”
Exit Sub
End If
If exception = “NO_AUTHORITY” Then
MsgBox “You have no authority to view table contents”
Exit Sub
End If
If returnFunc = True Then
Dim objtable As Object
Set objtable = RFC_Function.tables.Item(“FIELDS”)
frmStQuery.ListBox1.Clear
frmStQuery.ListBox2.Clear
For i = 1 To objtable.RowCount
ActiveSheet.Cells(2, i) = objtable(i, “FIELDNAME”)
ActiveSheet.Cells(1, i) = objtable(i, “FIELDTEXT”)
frmStQuery.ListBox1.ColumnCount = 2
frmStQuery.ListBox1.AddItem
frmStQuery.ListBox1.List(i – 1, 0) = objtable(i, “FIELDNAME”)
frmStQuery.ListBox1.List(i – 1, 1) = objtable(i, “FIELDTEXT”)
Next i
End If
frmStQuery.Show
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
err_handler:
If Err.Description = “ActiveX component can’t create object” Then
MsgBox “No connection to SAP available”
Else
If Err.Description = “SAP Remote Function Call” Then
MsgBox “RFC Function module not available in called system”
Else
MsgBox Err.Description
End If
End If
Exit Sub
End Sub

Tablomuzdan gelen alanlarin bulundugu bir formu yukarida gorebiliyorsunuz, bu asamadan sonra tablo uzerindeki nesneleri taniyacagiz ve istedigimiz alanlarla ilgili SAP’den data cekme islemine baslayacagiz.

Formumuzun solunda bulunan yukarida gordugumuz bolum SAP tablomuzun tum alanlarinin ve aciklarinin ilk etapta listelendigi listbox’a ait; bu listbox icerisindeki alan adlarini yukaridaki sekilde secerek diger listbox’imiza aktarmak kaydi ile alan adlari secimimizi yapiyoruz.

Formumuzun sol ust kosesinde bulunan siralama butonlari SAP’den aldigimiz alan adlarinin A’dan Z’ye ve Z’den A’ya siralanmasini saglamak amaclidir. Bazen bu sekilde teknik adlardan aradigimiz alanlara ulasmamiz kolaylasabiliyor.

Hemen yaninda bulunan filtre Alani ise hali hazirda teknik adlarini bildigimiz alanlarin adini yazarak alanlarin secilmesini saglamak amacli kullanilacaktir.

Yesil butonlar ise listboxlar arasi tasima yapmamizi saglayan butonlardir, ilk butonumuz listbox uzerinde secili olan alanlari ikinci listbox’imiz uzerine tasimaktadir.

Ikinci butonumuz ise listbox uzerindeki butun alanlari 2. listbox uzerine tasimak icin kullanilacaktir.

Fakat bazi tablolarda SAP’ye gonderebileceginiz sorgu sayisindan daha fazla alan bulunmaktadir bu durumda yukarida gordugunuz 40 kalemden az seciniz uyarisini goreceksiniz.

Ucuncu butonumuz ikinci listbox’a tasidigimiz yanlis bir Alani ilk listbox’a geri tasimak icin kullandigimiz bir butondur.

Yaptigimiz butun secimlerin ilk listbox’a geri dondurulmesini saglar ve hic bir secim yapmadan onceki haline doner.

Formun en sag ust bolumunde bulunan bu kucuk excel iconlarinin bulundugu butonlar ise 5. ve 10. Siradaki ozel listelerinizi secim olarak gorecektir.

Ekranda goruldugu uzere ozel listelerde default olarak 4 ayri secim bulunmaktadir, buraya kendi alan adlarinizi ekleyerek hizli bir filtreleme yapabilirsiniz. (Ozel listeleri ayarlamak icin secenekler/gelismis/ozel listeleri duzenle secenekleri izlenir)

Seceneler bolumunde ise sectimiz alanlari tekrar filtre uygulayabilir.

SD seklindeki buton yukarida gordugunuz filtre seceneklerinin onceden atandigi bir butondur, bu tarz butonlar coklanarak varyantlar olusturulabilir.

Clear butonu tum secimlerin temizlenmesini saglar.

Listelenmesini istediginiz belirli bir satir sayisi varsa bu bolume yazabilirsiniz, default olara “0” yazildiginda tum verinin gelmesini saglar aksi halde yazdiginiz kadar sayida satir listelenecektir.

Filtre secenekleri ise yukarida gordugunuz gibi teknik adlarina gore belirli secenekler verebileceginiz filtre kriterleri vermenizi saglar. (esittir, esit degildir, buyuktur, kucuktur, buyuk esittir ve kucuk esittir seceneklerini kullanabilirsiniz)

Sorgumuzu gondermemize yarayan butondur, butona basildiktan sonra Tekrar SAP giris ekrani belirecek ve system ve kullanici bilgilerinizi sormak kaydi ile sorgunuzu SAP’ye gonderecektir, sonrasinda ilgili sayfadaki tablomuza bu alanlar ve satir bilgileri akacaktir.

Sub Fetch_Data_From_SAP_Standard()
Sub Fetch_Data_From_SAP_Standard()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
‘Logon – SAP
Dim SAP_R3_Connection As Object
Set SAP_R3_Connection = CreateObject(“SAP.Functions”) ‘Create ActiveX object
‘SAyfa Secimi
Worksheets(“Standard”).Select
‘Tablo iceriginin silinmesi
Dim lo As Excel.ListObject
‘To delete content of relavent table object
Set lo = ActiveSheet.ListObjects(1)
‘With Sheet1.ListObjects(“Table1”).ListRows
With lo
If Not .DataBodyRange Is Nothing Then
.DataBodyRange.Delete
End If
End With
With lo.ListColumns
Do While .Count > 1
.Item(1).Delete
Loop
End With
Set SAP_R3_Connection = CreateObject(“SAP.Functions”)
‘SAP_R3_Connection.Connection.System = “PEP”
‘SAP_R3_Connection.Connection.Client = “100”
‘SAP_R3_Connection.Connection.User = “user”
‘SAP_R3_Connection.Connection.Password = “pass”
‘SAP_R3_Connection.Connection.Language = “EN”
If SAP_R3_Connection.Connection.logon(0, False) <> True Then ‘Try Logon
MsgBox “Cannot Log on to SAP”
Exit Sub
End If
‘**********************************************
‘Fonksiyon Tanimlanmasi
‘**********************************************
Dim RFC_Function As Object
Set RFC_Function = SAP_R3_Connection.Add(“RFC_READ_TABLE”)
Dim SAP_Query_Table, SAP_Row_Count As Object
Set SAP_Query_Table = RFC_Function.exports(“QUERY_TABLE”)
‘**********************************************
‘Tablo Secimi
‘**********************************************
SAP_Query_Table.Value = Giris_degeri
Set SAP_Row_Count = RFC_Function.exports(“ROWCOUNT”)
‘**********************************************
‘KAc Satir Getiriliceginin Secimi
‘**********************************************
If frmStQuery.Row_Count_Text.Value <> 0 Then
SAP_Row_Count.Value = frmStQuery.Row_Count_Text.Value + 1
End If
Dim SAP_Options_Table, SAP_Fields_Table, SAP_Data_Table As Object
Set SAP_Options_Table = RFC_Function.tables(“OPTIONS”)
Set SAP_Fields_Table = RFC_Function.tables(“FIELDS”)
Set SAP_Data_Table = RFC_Function.tables(“DATA”)
SAP_Options_Table.FreeTable
‘**********************************************
”Kondisyonlar
‘**********************************************
‘SAP_Options_Table.Rows.Add
‘SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = “BUKRS = ” and ”
‘SAP_Options_Table.Rows.Add
‘SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = “FKSTO = ”” ‘Check cancel indicator
If frmStQuery.ComboBox4.Value <> “” Then
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox1.Value) & ” ” & UCase(frmStQuery.ComboBox5.Value) & ” ‘” & UCase(frmStQuery.TextBox1.Text) & “‘ and ”
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox2.Value) & ” ” & UCase(frmStQuery.ComboBox6.Value) & ” ‘” & UCase(frmStQuery.TextBox2.Text) & “‘ and ”
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox3.Value) & ” ” & UCase(frmStQuery.ComboBox7.Value) & ” ‘” & UCase(frmStQuery.TextBox3.Text) & “‘ and ”
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox4.Value) & ” ” & UCase(frmStQuery.ComboBox8.Value) & ” ‘” & UCase(frmStQuery.TextBox4.Text) & “‘”
ElseIf frmStQuery.ComboBox3.Value <> “” Then
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox1.Value) & ” ” & UCase(frmStQuery.ComboBox5.Value) & ” ‘” & UCase(frmStQuery.TextBox1.Text) & “‘ and ”
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox2.Value) & ” ” & UCase(frmStQuery.ComboBox6.Value) & ” ‘” & UCase(frmStQuery.TextBox2.Text) & “‘ and ”
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox3.Value) & ” ” & UCase(frmStQuery.ComboBox7.Value) & ” ‘” & UCase(frmStQuery.TextBox3.Text) & “‘”
ElseIf frmStQuery.ComboBox2.Value <> “” Then
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox1.Value) & ” ” & UCase(frmStQuery.ComboBox5.Value) & ” ‘” & UCase(frmStQuery.TextBox1.Text) & “‘ and ”
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox2.Value) & ” ” & UCase(frmStQuery.ComboBox6.Value) & ” ‘” & UCase(frmStQuery.TextBox2.Text) & “‘”
ElseIf frmStQuery.ComboBox1.Value <> “” Then
SAP_Options_Table.Rows.Add
SAP_Options_Table(SAP_Options_Table.RowCount, “TEXT”) = UCase(frmStQuery.ComboBox1.Value) & ” ” & UCase(frmStQuery.ComboBox5.Value) & ” ‘” & UCase(frmStQuery.TextBox1.Text) & “‘”
End If
‘**********************************************
‘Getirilecek Alanlar
‘**********************************************
SAP_Fields_Table.FreeTable
For intindex = 0 To frmStQuery.ListBox2.ListCount – 1
SAP_Fields_Table.Rows.Add
SAP_Fields_Table(SAP_Fields_Table.RowCount, “FIELDNAME”) = frmStQuery.ListBox2.List(intindex, 0)
Next
If RFC_Function.Call = False Then
MsgBox RFC_Function.exception
Exit Sub
End If
Dim SAP_Row_Records As Object
Dim SAP_Column_Records As Object
For Each SAP_Row_Records In SAP_Data_Table.Rows
For Each SAP_Column_Records In SAP_Fields_Table.Rows
‘**********************************************
‘Verinin Baslik bilgilerinin yazilmasi
‘**********************************************
If SAP_Row_Records.Index = 1 Then
‘Cells(SAP_Row_Records.Index, SAP_Column_Records.Index) = SAP_Fields_Table(SAP_Column_Records.Index, “FIELDNAME”)
Cells(SAP_Row_Records.Index, SAP_Column_Records.Index) = SAP_Fields_Table(SAP_Column_Records.Index, “FIELDTEXT”)
Else
‘**********************************************
‘Row data iceriginin alinmasi
‘**********************************************
Cells(SAP_Row_Records.Index, SAP_Column_Records.Index) = Mid(SAP_Row_Records(“WA”), SAP_Column_Records(“OFFSET”) + 1, SAP_Column_Records(“LENGTH”))
‘Cells(SAP_Row_Records.Index, SAP_Column_Records.Index).NumberFormat = “@”
End If
Next
Next
Unload frmStQuery
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Yazar: mmustafaaslan

2004 yilindan itibaren ozel bir sirketin finans departmaninda calismaktadir. Kendini excel, visual basic kullaniminda gelistirmis olan yazarimiz; Meslegi geregi SAP konusunda ileri derecede bilgilidir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


3 + 2 =