Kategori arşivi: İş Zekası

Excel VBA ile Sütun Satır Çevrilmesi (Unpivot)

k1, k2, k3, ssc_kaynak_1, ssc_kaynak_2, ssc_kaynak_3, ssc_kaynak_4, ssc_hedef_1,ssc_hedef_2

Kolonlarına sahip bir excel dosyasını

k1, k2, k3, ssc_kaynak, ssc_hedef

kolonlarına sahip hale getirmek için aşağıdaki VBA (Visual Basic Applications) Script kullanılabilir. Buradaki amaç ssc_kaynak kolonları için 4 kolonu 4 satıra, ssc_hedef kolonları için 2 kolonu 2 satıra, toplam 4+2=6 kolonu 4*2=8 satıra çevirmek.

Örneğin:

veri_k1,veri_k2, veri_k3, veri_ssc_kaynak_1, veri_ssc_kaynak_2, veri_ssc_kaynak_3, veri_ssc_kaynak_4, veri_ssc_hedef_1, veri_ssc_hedef_2

halinden aşağıdaki hale çevirmek

veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_1, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_1, veri_ssc_hedef_2
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_2, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_2, veri_ssc_hedef_2
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_3, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_3, veri_ssc_hedef_2
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_4, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_4, veri_ssc_hedef_2

excel_vba_unpivot.xlsm.zip


Option Explicit
Dim sourceWorksheet As Excel.Worksheet
Dim targetWorksheet As Excel.Worksheet
Dim sourceWorksheetRowCount As Integer
Dim targetWorksheetI As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer

Sub Unpivot()

    Set sourceWorksheet = ThisWorkbook.Worksheets("normal")
    Set targetWorksheet = ThisWorkbook.Worksheets("unpivot")
    targetWorksheet.Unprotect

    targetWorksheet.Cells(1, 1).Value = sourceWorksheet.Cells(1, 1).Value
    targetWorksheet.Cells(1, 2).Value = sourceWorksheet.Cells(1, 2).Value
    targetWorksheet.Cells(1, 3).Value = sourceWorksheet.Cells(1, 3).Value
    targetWorksheet.Cells(1, 4).Value = sourceWorksheet.Cells(1, 4).Value
    targetWorksheet.Cells(1, 5).Value = sourceWorksheet.Cells(1, 8).Value

    sourceWorksheetRowCount = sourceWorksheet.UsedRange.Rows.Count
    targetWorksheetI = 2

    For i = 2 To sourceWorksheetRowCount
        For j = 4 To 7
            For k = 8 To 9
                If (IsNull(sourceWorksheet.Cells(i, j)) = False And Trim(sourceWorksheet.Cells(i, j).Value) <> "" And IsNull(sourceWorksheet.Cells(i, k)) = False And Trim(sourceWorksheet.Cells(i, k).Value) <> "") Then
                    targetWorksheet.Cells(targetWorksheetI, 1) = sourceWorksheet.Cells(i, 1)
                    targetWorksheet.Cells(targetWorksheetI, 2) = sourceWorksheet.Cells(i, 2)
                    targetWorksheet.Cells(targetWorksheetI, 3) = sourceWorksheet.Cells(i, 3)
                    targetWorksheet.Cells(targetWorksheetI, 4) = sourceWorksheet.Cells(i, j)
                    targetWorksheet.Cells(targetWorksheetI, 5) = sourceWorksheet.Cells(i, k)
                    targetWorksheetI = targetWorksheetI + 1
                End If
            Next k
        Next j
    Next i

End Sub

Sap BO RestFul Web Servis ile kullanıcı listesi çıkarılması

(Sap BO user list exctraction with Restful Web Service)

Sap Business Objects ortamında kullanıcı listesi ResftFul Web Service SDK (Python dilinde) almak için aşağıdaki kod kullanılabilir.

#!/usr/bin/python
# -*- coding: utf-8 -*-



import sys
reload(sys)
sys.setdefaultencoding('utf8')



import requests, json, re

baseurl = 'http://hostname_ip:port/biprws' # change hostname ip port, example: 192.168.56.101:6405

headerJson = {'accept': 'application/json'}

r = requests.get(baseurl+'/logon/long', headers=headerJson)

headerJson2 = {'accept': 'application/json', 'content-type': 'application/json'}

postDataJson = '{"userName":"Administrator","password":"PassWD","auth":"secEnterprise"}' # change password

r = requests.post(baseurl+'/logon/long', headers=headerJson2, data=postDataJson)

sapBoLogonToken = '"' + json.loads(r.text)['logonToken'] + '"'

headerJson3 = {'accept': 'application/json', 'X-SAP-LogonToken': sapBoLogonToken}



looperPage = 1
looperPageSize = 50

r = requests.get(baseurl+'/v1/users?page='+str(looperPage)+'&pagesize='+str(looperPageSize), headers=headerJson3)
parsedJson = json.loads(r.text)

userList = []
while len(parsedJson["entries"]) == looperPageSize:
  userList.extend( parsedJson["entries"] )
  looperPage += 1
  r = requests.get(baseurl+'/v1/users?page='+str(looperPage)+'&pagesize='+str(looperPageSize), headers=headerJson3)
  parsedJson = json.loads(r.text)



# rest log off
headerJson4 = {'accept': 'application/json', 'content-type': 'application/json', 'X-SAP-LogonToken': sapBoLogonToken}
r = requests.post(baseurl+'/logoff', headers=headerJson4)



f = open('./user_list.csv','w')

f.write("user_id,user_name,user_fullname\n")
for uli in userList:
  f.write(uli["id"]+","+uli["name"]+","+uli["fullname"]+"\n")

"""
# maybe needed for some users detection
f.write("user_id,user_name,user_name_length,user_fullname,user_fullname_length,reg_exp_flag\n")
for uli in userList:
  if ( len(re.findall("[a-zA-Z]{2}[0-9]{4}",uli["name"])) > 0 ):
    reg_exp_flag = "1"
  else:
    reg_exp_flag = "0"
  f.write(uli["id"]+","+uli["name"]+","+str(len(uli["name"]))+","+uli["fullname"]+","+str(len(uli["fullname"]))+","+reg_exp_flag+"\n")
# reg_exp_flag=1, user_fullname_length<>0, user_name_length=6
"""

f.close()

Dosya olarak indirmek için: re_cmc_user_list.py

çoklu bağlantılı platformlar tavsiye (multisource universe recommendation)

Sap Business Objects bir universe ün (unx) birden fazla bağlantı ile oluşturulmasına (kullanılabilmesine) olanak sağlar. Bunun için BI Platformda Data Federation servisinin oluşturulması gerekir. Çoklu bağlanıtılı universe özelliği universe ün farklı veritabanlarından aldığı veriyi Data Federation servisi ile birleştirerek (veritabanı gibi davranarak) raporlara sonuç verisini sağlamasıyla olur. Çoklu bağlantılı universe oluşturulurken bir kere çoklu kaynaklı olduğu belirlenir sonradan tek bağlantılı universe e çevrilemez.

Kişisel tavsiyem Çoklu Bağlantılı (MultiSource) universe özelliğinin zorunlu olunmadıkça kullanılmaması yönünde. Çünkü çoklu bağlantılı platformlar farklı veri kaynaklarından alınan veriyi veritabanı gibi (BI platformun veritabanı görevi yapması performansı çok negatif etkileyen bir faktör, hem işlemci hem de bellek kullanımı açısından) davranarak birleştirmesi gerekir. Özellikle farklı kaynaklardaki objelerin data foundation da join lenmesi durumunda.

Çoklu bağlantılı universe ler yerine veriyi Veri Entegrasyonu (Data Integration), ETL (Extract Transform Load) Araçları ile tek veritabanında birleştirmek ve tek bağlantılı universe ile bu veritabanından raporlamak daha doğru bir çözüm olacaktır. Veri Entegrasyonu araçları farklı veritabanı yönetim sistemlerine bağlanıp veri aktarımı yapabilmektedir. Bu sayede BI Platforma veri tabanı yükü bindirilmemiş olur ve sorgulama dilinin en hızlı çalıştığı ortamda veri alınarak performanslı raporlama yapılmış olur.

Not 1: tecrübelerimde çoklu kaynaklı universe ler ile ilgili çeşitli hatalarla (bug) karşılaştığımı söyleyebilirim.

Not 2: çoklu bağlantılı universe ler ile çalışırken tekli bağlantılı universe lere göre daha yavaş çalışırlar sebebi MultiSource universe lerin üzerinde geliştirme yapılırken işlemlerin yerel makinada değil sunucuda (bi platform) yapılıyor olmasıdır.

Not 2 Kaynak: IDT client tool slows dramatically in business layer

sap design studio geomap geojson tr Türkiye

Sap Design Studio ortamında GeoMap komponentinin GeoJson ile belirlenmiş alanlarını (Türkiye’nin illerini) istenen iki renk aralığında gösterge (measure, kpi) değerlerine göre renklendirebilmek için notlar.

Öncelikle Türkiye’nin illerinin GeoJson bilgisine design studio geomap komponentinin kabul ettiği formatta ihtiyaç var. Bunun için https://github.com/cihadturhan/tr-geojson adresindeki açık kaynak (open source) proje kullanılabilir. Buradaki Json formatı Design Studio’da kullanılabilecek şekle getirmek için aşağıdaki Python kodu kullanılabilir.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json

f = open('./tr-cities-utf8.json','r')

parsedJson = json.loads(f.read())

f.close()



parsedFeatures = parsedJson["features"]
parsedFeatures_new = []

for ipf in parsedFeatures:
    ipf_new = {}
    ipf_new["type"] = ipf["type"]
    ipf_new["properties"] = {}
    ipf_new["properties"]["city_name"] = ipf["properties"]["name"]
    ipf_new["properties"]["city_id"] = ipf["id"]
    ipf_new["geometry"] = ipf["geometry"]
    parsedFeatures_new.append(ipf_new)



f = open('./tr-cities-utf8-2.json','w')

f.write('{"type":"FeatureCollection","features":\n')
json.dump(parsedFeatures_new, f)
f.write('}\n')

f.close()

Bunun dışında tercihsel olarak Türkçe karakterlerin gösterimleri değiştirilmek istenirse aşağıdaki dönüşüm kullanılabilir:
\u0131 > ı, \u011f > ğ, \u00f6 > ö, \u00c7 > Ç, \u00fc > ü, \u015f > ş, \u0130 > İ, \u015e > Ş
‘ {“geometry”:’ > ‘\n{“geometry”:’

tr-cities-utf8.json dosyasının yukarıdaki Python kodu ile işlenmeden önceki (tr-cities-utf8.json) ve işlendikten sonraki (tr-cities-utf8-2.json) hallerini aşağıdaki bağlantıdan indirebilirsiniz.
python_geojson

Örnek çıktıda tr-cities-utf8-2.json dosyası GeoMap komponentinde kullanılmış ve değerler (gösterge, measure, kpi) beyazdan siyaha değerin büyüklüğüne göre ifade edilmiştir.

sap design studio dashboard masaüstü kısayolu ve Chrome tarayıcısı uygulama modu

Sap Design Studio Dashboard Desktop Shortcut and Chrome browser app (application) mode

Geliştirilen Sap Design Studio Dasboard’larına hızlı erişim için bir tercih olarak yer imlerine eklenerek ulaşılabilir, bir tercih olarak da bilgisayarın masaüstüne bir kısayol oluşturulabilir.

Dashboard’ları görüntülerken ya da 7*24 açık bırakılan dashboard’larda tarayıcının adres (url) kısmının görünmemesi için Chrome app mode kullanılabilir. Oluşturulan kısayol ile dashboard url –app parametresiyle açıldığında url kısmı görünmez.

Örneğin: “C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” –app=https://sap_bo:8080/BOE/OpenDocument/opendoc/openDocument.jsp?sIDType=CUID&iDocID=CuidOfYourDashboard

Benzer fonksiyonellik firefox tarayıcısında kısayoluna -new-window parametresi eklenerek yapılabilir; ancak url doğrudan parametrelerle gizlenemez. Url’yi gizlemek için firefox’un hide navigation bar eklentisi (add-on) (varsayılan gizleme fonksiyonu tuşu F2) kullanılabilir.

Örneğin: “C:\Program Files (x86)\Mozilla Firefox\firefox.exe” -new-window https://sap_bo:8080/BOE/OpenDocument/opendoc/openDocument.jsp?sIDType=CUID&iDocID=CuidOfYourDashboard

Bunların dışında eğer birden fazla dashboard’un tek ekranda belli zaman aralıkları ile değişmesi (rotate) isteniyorsa Chrome tarayıcısında Tab Revolver eklentisi, Firefox tarayıcısında da Tab Rotater eklentisi kullanılabilir.

Not: 7*24 açık duran dashboard’lar için Chrome tarayıcısının yıllardır varolan dağıtık bellek sızıntısı bug’ı göz önünde bulunulabilir.
Chrome massive memory leak bug: https://productforums.google.com/forum/#!topic/chrome/86yzpxX7aws

Kaynaklar:
https://stackoverflow.com/questions/16124877/how-do-you-hide-the-address-bar-in-google-chrome-for-chrome-apps
https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options
https://addons.mozilla.org/en-US/firefox/addon/hide-navigation-bar/
https://chrome.google.com/webstore/detail/revolver-tabs/dlknooajieciikpedpldejhhijacnbda
https://addons.mozilla.org/en-US/firefox/addon/tab-rotator/