Aylık arşivler: Ekim 2015

Sap Bo RESTful Sdk – Webi Rapor Sorguları Çıkarma – 2

Sap Business Objects ortamında Webi rapor sorgularının çıkarılması için yazdığım önceki yazımda raporların id’lerine (si_id) sıralı parçalar halinde Restful Web Service üzerinden ( http://10.1.2.3:6405/biprws/raylight/v1/documents?offset=200&limit=50 ) erişiliyordu. Bu durumda Webi rapor adetlerinin çok fazla olduğu üretim (production) ortamlarında BO Enterprise veritabanına çok karmaşık Sql sorguları gönderdiği için veritabanı sunucusunu çok olumsuz etkileyebiliyor. Örneğimizde veritabanı Oracle ve üretilen sorgunun where ifadesinde binlerce karşılaştırma yapılıyor, Oracle’a özel analitik fonksiyonlar kullanılmıyor, tüm veritabanlarında çalışabilecek çok uzun ve karmaşık Ansii Sql üretiliyor. Sonuç olarak rapor id’lerini Web Servis üzerinden değil de Admin Tools (Query Builder) üzerinden aşağıdaki sorgu ile metin dosyasına yazıp o dosyadaki id’lerin sorgularını çıkarma yoluna gidiyoruz. (Extract Report Sql by Sap BO RestFul Web Service Sdk and Python Request Json 2)

select si_id
from ci_infoobjects
where si_kind = 'Webi'

import requests
import json
import codecs

def restlogin( baseurl, u, p, logontype ):
  headerJson = {'accept': 'application/json'}
  r = requests.get(baseurl+'/logon/long', headers=headerJson)
  headerJson2 = {'accept': 'application/json', 'content-type': 'application/json'}
  postDataJson = '{"userName":"'+u+'","password":"'+p+'","auth":"'+logontype+'"}'
  r = requests.post(baseurl+'/logon/long', headers=headerJson2, data=postDataJson)
  logontoken = '"' + json.loads(r.text)['logonToken'] + '"'
  return logontoken

def restlogoff( logontoken ):
  headerJson4 = {'accept': 'application/json', 'content-type': 'application/json', 'X-SAP-LogonToken': logontoken}
  r = requests.post(baseurl+'/logoff', headers=headerJson4)

def reportNameToString( rn ):
  if type(rn) is int:
    return str(rn)
  else:
    return rn

def getReportSqls( i ):
  sql = ''
  r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"]), headers=headerJson3)
  if r.status_code == 200:
    r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"])+'/dataproviders', headers=headerJson3)
    if r.status_code == 200:
      parsedJsonDP = json.loads(r.text)
      if type(parsedJsonDP['dataproviders']) is not str and type(parsedJsonDP['dataproviders']) is not unicode and type(parsedJsonDP['dataproviders']['dataprovider']) is not str and type(parsedJsonDP['dataproviders']['dataprovider']) is not unicode:
        if type(parsedJsonDP['dataproviders']['dataprovider']) is dict:
          if 'dataSourceType' in parsedJsonDP['dataproviders']['dataprovider'].keys() and parsedJsonDP['dataproviders']['dataprovider']['dataSourceType'][0:2] == "un":
            r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"])+'/dataproviders/'+str(parsedJsonDP['dataproviders']['dataprovider']['id']), headers=headerJson3)
            if r.status_code == 200 and 'query' in json.loads(r.text)['dataprovider'].keys():
              sql += '\n' + json.loads(r.text)['dataprovider']['query'] + '\n'
        else:
          for j in parsedJsonDP['dataproviders']['dataprovider']:
            if 'dataSourceType' in j.keys() and j['dataSourceType'][0:2] == "un":
              r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"])+'/dataproviders/'+str(j['id']), headers=headerJson3)
              if 'query' in json.loads(r.text)['dataprovider'].keys():
                sql += '\n' + json.loads(r.text)['dataprovider']['query'] + '\n'
  return sql



baseurl = "http://10.1.2.3:6405/biprws"
uname = "Administrator"
pword = "PassWD"
logontype = "secEnterprise"

logontoken = restlogin(baseurl, uname, pword, logontype)

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

f = codecs.open('C:/sqllist.txt', 'w', encoding='utf8')



f2 = open('C:/si_id.txt','r')
si_id_list = f2.read().split('\n') # [:-1]

print "bas 1"

for j in si_id_list:
  print "for: " + str(j)
  r = requests.get(baseurl+'/raylight/v1/documents/'+str(j), headers=headerJson3)
  if r.status_code == 200:
    i = json.loads(r.text)['document']
    sql = getReportSqls(i);
    f.write('\nsi_id:' + str(i["id"]) + '\nsi_name:' + reportNameToString(i["name"]) + '\n' + sql)

print "son 1"

f.close()

restlogoff( logontoken )

Sap BO Tomcat Konfigürasyon Bellek Arttırımı

SAP Business Objects Platformu varsayılan web sunucusu (web application server) Tomcat ile kullanılıyorsa ve BO ortamında çalışan kişi sayısı fazla ise performans iyileştirmesi için Tomcat konfigürasyonunda bellek arttırımı yapılabilir. (Sap BO Tomcat Configuration Increase Memory)

Sap BO ile birlikte gelen Tomcat Configuration aracı yönetici olarak çalıştırılır (run as administrator).

sap_bo_tomcat_configuration_1

Apache Tomcat for BI 4 Properties penceresinde Java sekmesine gidilir, Initial Memory Pool (~ 1024-2048 MB) ve Maximum Memory Pool (~ 4096-16384 MB) parametreleri ihtiyaca göre güncellenir, Tomcat yeniden başlatılır.

sap_bo_tomcat_configuration_2

Kaynak:
Sap BO Admnistration Guide – Sayfa 739

Sap BO Webi Veri İzleme (Data Tracking)

Sap Business Objects Web Intelligence ortamında rapor içeriğinin (verinin) değişimi Veri İzleme (Data Tracking) ile takip edilebilir.

Örneğin, aşağıdaki gibi bir tablomuz olsun.

sap_bo_webi_data_tracking_1

Tabloyu olduğu gibi içeren raporda data tracking özelliği aktif edilir.

sap_bo_webi_data_tracking_2

Tablodan 3, 5 ürün numaralı kayıtlar silinir; 7 ürün numaralı kayıt eklenir ve 2 ürün numaralı kaydın rengi maviden sarıya güncellenir.

sap_bo_webi_data_tracking_4

Sonra raporun veri izleme özelliği aktif iken rapor yenilenir. Sonuç aşağıdaki gibi olur.

sap_bo_webi_data_tracking_3

Özellikle ölçülen değerlerin (measures) yenilenmeden önce ve sonraki değerlerini karşılaştırmak için RafValue([Dimension]) fonksiyonu kullanılabilir.

Kaynak:
Web Intelligence 4.0: Track changes to data

Sap BO Webi Oturum Zamanaşımı (Session Timeout)

SAP Business Objects Web Intelligence Platformunda oturum süresini değiştirmek için aşağıdaki dizinlerdeki konfigürasyon dosyalarında session-timeout değerleri (dakika) değiştirilir ve Tomcat web sunucusu yeniden başlatılır.

Web Sunucusu – C:\Program Files (x86)\SAP BusinessObjects\tomcat\conf\web.xml

BI Launchpad – C:\Program Files (x86)\SAP BusinessObjects\tomcat\webapps\BOE\WEB-INF\web.xml

Ayrıca Web Intelligence Processing Server’ın oturum zamanaşımı değerleri güncellenir ve servis yeniden başlatılır.

Timeout Before Recycling (seconds):
Idle Document Timeout (seconds):
Idle Connection Timeout (minutes):

Burada Universe (Platform) üzerinde sorgu süresi limiti olmamasına ve Universe lerin kullandıkları Veri Tabanı bağlantılarının oturum zamanaşımı sürelerini de unutmamak gerek.

Ayrıca Load Balancer (Yük Dağıtıcı) kullanılıyorsa bunun da oturum zamanaşımı süresinin gerektiği kadar uzun olması gerekir.

Fazladan bir bilgi olarak da Yük Dağıtıcının Önbelleğe Alma (Caching) özelliği kapalı olmalı.

Sap BO Webi Dinamik Boyut (Dynamic Dimension)

SAP Business Objects Web Intelligence ortamında ölçütlerin (measures) yanında gösterilecek boyutların dinamik olarak değiştirilmesi için aşağıdaki adımlar izlenebilir.

Webi’de oluşturulacak veri girişini (input control) bağlamak için sahte (dummy) bir değişken oluşturulur.

sap_bo_webi_dynamic_dimension_1

Yeni bir giriş kontrolü (input kontrol oluşturulur. Giriş kontrolünün alabileceği değerler özel (custom) olarak belirlenir.

sap_bo_webi_dynamic_dimension_2

sap_bo_webi_dynamic_dimension_3

Girilen değere göre gösterilecek boyuta karar veren değişken oluşturulur.

sap_bo_webi_dynamic_dimension_6

Örneğin sonucu aşağıdaki gibi olur.

sap_bo_webi_dynamic_dimension_4

sap_bo_webi_dynamic_dimension_5

Kaynak:
blog.davidg.com.au/2011/09/dynamic-measures-in-webi-on-any-data.html

Sap BO Multisource Universe (Çok Kaynaklı Platform)

SAP Business Objects iş zekası ortamında birden fazla veritabanındaki verilerin tek platformda (universe) ilişkilendirilerek kullanılabilmesine imkan sağlar. (Data Federator) Bu durumda Sap BO birden fazla veritabanına bağlanarak bu veritabanlarını bir üst katmanda (data foundation – veri altyapısında) tek veritabanı gibi kullanıcılara sunar. Üst katmanda temel Ansii veritabanı fonksiyonlarının kullanılabilmesini sağlar.

Multisource Universe’te üretilen sorgunun çalıştırılabilmesi için farklı veritabanlarındaki tabloların tamamının Sap BO ortamına alınıp işlenmesi gerekir. Bu yüzden çok büyük tabloların Multisource Universe’te kullanılması Sap BO’nun performansını olumsuz etkileyebilir.

Bir platformun çok kaynaklı olması sadece platform oluşturulurken belirlenebilir, sonradan çok kaynaklı yapılamaz.

sap_bo_multisource_universe_data_federetor

Kaynaklar:
Sap BO Multisource Universe
Information design tool 4.0: Concept – Create a multisource-enabled universe

Sap BO Webi Hesaplama Bağlamları (Calculation Contexts)

Sap Business Objects Web Intelligence ortamında analitik hesaplamalar yapmak amacıyla kullanılır. Veri tabanlarında çoğunlukla analitik fonksiyonlarla çözülen problemler Webi’de hesaplama bağlamı operatörleri kullanılarak çözülür.

Operatörler:

Doğrudan boyut belirtilerek kullanılan operatörler;

In: Tam olarak hangi boyutların (dimension) hesaplamaya ekleneceğini belirtir.

ForEach: Bir bağlama boyut eklemek için kullanılır.

ForAll: Bir bağlamdan boyutu çıkarmak için kullanılır.

Boyut belirtmeksizin rapor yapısına göre hesaplama yapan operatörler;

In Report: İlgili rapor bileşeninden bağımsız olarak tüm rapor bağlamında hesaplama yapar. Örneğin bir tabloda filtre kullanılmış ise In Report bağlamı bu filtreden etkilenmez.

In Block: Yatay Dikey Çapraz (Crosstab) Tablo gibi rapor içindeki bir bileşen bağlamında hesaplama yapmaya yarar.

In Body: Varsayılan, herhangi bir bağlam belirtilmediğinde geçerli olan bağlamdır.

sap_bo_webi_colculation_context_1

sap_bo_webi_colculation_context_2