Aylık arşivler: Kasım 2017

universe design tool (unv universe) toplu obje güncelleme (bulk object update)

Sap Business Objects ortamında universelerin metadata sına ilgili sdk (software development kit) ile erişilebilir. Unv universe lere .net sdk ile unx lere java sdk ile erişilebilir.

VBA (Visual Basic Application) Scripts ile ilgili .net kütüphanesi kurulu olan ortamda, yani bizim durumumuzda Sap Business Objects Client Tools kurulu olan bir bilgisayarda VBA kodu ile Universe Design Tool uygulaması kod ile yönetilebilir (toplu işlemler otomatize edilebilir). VBA kodu excel üzerinde yazılıp çalıştırılabilir.

Bu yazıdaki amaç Unv universe lerdeki objeleri toplu olarak güncellemek (gizlemek, bulk object hide in unv).

.net sdk ile yazılmış örnek kodlar için Business Objects Board (BOB) un 2. kaynaktaki sayfasına göz atılabilir.

Windows XP sonrası (Windows 7, 10, …) işletim sistemlerinde, benim durumumda Windows 8.1, Excel üzerindeki VBA kodu çalıştırabilmek için C:\Program Files (x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win32_x86\designer.exe yi uyumluluk ayarlarından yönetici olarak çalıştır işaretlemek gerekliydi. (designer.exe right click compatibility “run this program as administrator”) Ayrıca UAC den (Kullanıcı Hesap Kontrolü Ayarlarından, User Account Control Settings) bildirim seviyesini en düşüğe çekmek gerekiyordu. Ve sonra da Excel uygulamasının da yönetici olarak çalıştırılması gerekiyordu. (Run Excel as Administrator) Kaynak 3

Universe design tool ile universe obje yapısına erişim için 1. kaynaktaki Business Objects Object Model Diagram (OMD) dokümanına başvurulabilir. Kaynak 4 ve 5 teki iki örnekte de universe objelerine (sınıflarına) erişim kodu yer alıyor.


' Objects named excel sheet must include "class name" and "object name" information at column 1 and column 2 without any header line
' Objects isimli excel sayfası "klasör ismi" ve "obje ismi" bilgisini 1. ve 2. kolonlarda tumalıdır ve başlık satırı kullanılmamalıdır

Option Explicit 'require variables to be declared before being used
Dim DesignerApp As Designer.Application
Dim Univ As Designer.Universe
Dim Cls As Designer.Class
Dim Obj As Designer.Object
Dim Pdc As Designer.PredefinedCondition
Dim Wksht As Excel.Worksheet
Dim Ssttrr As String
Dim Rn As Integer
Dim WorksheetRowCount As Integer
Dim StatusChangeFlag As Boolean
Dim CheckList(1 To 10000, 1 To 2) As String


Sub GetData()
    
    Set DesignerApp = New Designer.Application
    DesignerApp.Visible = True
    Call DesignerApp.LogonDialog
    Set Univ = DesignerApp.Universes.Open
    
    'Set Univ = DesignerApp.Universes.Import("/deneme_klasor", "deneme_unv")
    'DesignerApp.Visible = False
    
    Set Wksht = ThisWorkbook.Worksheets("Objects")
    Wksht.Unprotect
    
    WorksheetRowCount = Wksht.UsedRange.Rows.Count
    
    For Rn = 1 To WorksheetRowCount
        CheckList(Rn, 1) = Wksht.Cells(Rn, 1).Value
        CheckList(Rn, 2) = Wksht.Cells(Rn, 2).Value
    Next Rn
    
    Call GoClasses(Univ.Classes)
    
    Wksht.Protect
    
End Sub


Sub GoClasses(Clss)
    
    For Each Cls In Clss
        For Each Obj In Cls.Objects
            StatusChangeFlag = False
            For Rn = 1 To WorksheetRowCount
                If (Cls.Name = CheckList(Rn, 1)) And (Obj.Name = CheckList(Rn, 2)) Then
                    StatusChangeFlag = True
                    Wksht.Cells(Rn, 3).Value = "done"
                End If
            Next Rn
            If (StatusChangeFlag = True) And (Obj.Show = True) Then
                Obj.Show = False
                Obj.Description = Obj.Description & " #hide_unused_object_201709#"
            End If
        Next Obj
        For Each Pdc In Cls.PredefinedConditions
            StatusChangeFlag = False
            For Rn = 1 To WorksheetRowCount
                If (Cls.Name = CheckList(Rn, 1)) And (Pdc.Name = CheckList(Rn, 2)) Then
                    StatusChangeFlag = True
                    Wksht.Cells(Rn, 3).Value = "done"
                End If
            Next Rn
            If (StatusChangeFlag = True) And (Pdc.Show = True) Then
                Pdc.Show = False
                Pdc.Description = Pdc.Description & " #hide_unused_object_201709#"
            End If
        Next Pdc
        
        If Cls.Classes.Count > 0 Then
            Call GoClasses(Cls.Classes)
        End If
        
    Next Cls
    
End Sub

Kod indirme adresi:
unv_bulk_update_objects.xlsm.zip

Sonraki yazı

Kaynaklar:
1) BO OMD (Object Model Diagram) dokümanı, alternatif adres
2) Business Objects Board SDK (VBA/ASP/JSP)
3) Excel VBA problems’ solutions
4) Document a universe using Excel and the Designer SDK
5) Mass update to object names / descriptions

sap design studio dropdown box özel sıralama (custom sort)

Sap Design Studio ile dashboard (gösterge paneli) geliştirilirken dropdown box bileşeni (component) ile bir seçim yapılması sağlanıyorsa ve dropdown box taki değerler harf sıralaması ile değil de isteğe bağlı özel sıralanmak isteniyorsa, aşağıdaki adımlar izlenebilir.

Veri kaynağımızın adı DS_DROPDOWN_DATA_SOURCE olsun. Sıralamak istediğimiz universe objesi ddSortId (t.sortid) olsun. Dropdown bileşeninde kullanılmak istenen universe objesi ddName (t.name) olsun. Böyle bir durumda sorguyu ddSortId objesine göre sıralanmış olarak alsak da, initial view da ddSortId ye göre sıralasak da dropdown bileşenindeki değerler ddName objesine göre sıralı olarak gelecektir. SortId ye göre sıralamak için “ddSortId and ddName” objesini aşağıdaki gibi oluştururuz.

lpad(t.sortid,10,'0')||t.name -- "ddSortId and ddName"

DS_DROPDOWN_DATA_SOURCE veri kaynağı sorgusunu “ddSortId and ddName” e göre sıralı olarak alırız. Performansı etkilememek için tercihsel olarak Initial view da herhangi bir sıralama yapmayız. Sonra da gösterge panelinin On Startup kısmında aşağıdaki kod ile “ddSortId and ddName” objesinin ilk 10 karakterinden sonrasını (sıralamak için geçici olarak birleştirdiğimiz kısmını) ayırıp Dropdown bileşenine istediğimiz sıra ile eklemiş oluruz.

var dropdownMembersAscending = DS_DROPDOWN_DATA_SOURCE.getMembers("_ddSortId_and_ddName_", 1000);

businessMembersAscending.forEach(function(element, index) {

  DROPDOWN_BUSINESS.addItem(Convert.subString(element.internalKey, 10), Convert.subString(element.text, 10));

});