Aylık arşivler: Aralık 2017

tarihçe yöneticisi excel’e çıkarma (export instance manager list to excel)

Sap Business Objects (BO) ortamında örneğin yinelenen tarihçe (recurring instances) dışa aktarılmak istendiğinde varsayılan olarak bu özelliği sağlamaz. Tarihçe yöneticisi tarihçeyi sorgulama (filtreleme) işlerini yapsa da dışa aktarılmasına olanak sağlamıyor mevcut haliyle. İhtiyaç duyulduğunda tarihçe yöneticisindeki istenen listeyi dışarı aktarmak için aşağıdaki yöntem uygulanabilir.

Çıkarılmak istenen tarihçe sayısına göre bir sayfada gösterilecek öğe sayısı Tercihler (Preferences) > CMC Tercihleri (CMC Preferences) > Sayfa başına nesne sayısı üst sınırı (Number of objects per pages) kısmından maksimum 500 girilecek şekilde arttırılabilir. Tarihçe yöneticisinde (örnek yöneticisi, instance manager) istenen filtreleme ya da sorgulama ile istenen tarihçe listelenir. Sonra bir tarihçe (instance) seçilir. Sonra da tarayıcıda hepsini seç (select all, kısayolu ctrl+a, shortcut ctrl+a) komutu verilir. Seçim sonucu sayfadaki tüm öğeler seçilmiş olur. Sonra tarayıcıda seçili olan tüm öğeler (tüm alan) kopyalanır (kısayolu ctrl+c, shortcut ctrl+c). Kopyalanan tüm öğeler boş bir excel dosyasına yapıştırılır (kısayolu ctrl+v, shortcut ctrl+v). Excel içinde yapıştırılan kısmın sadece tarihçe satırlarını ifade eden kısmı seçilerek farklı boş bir excel sekmesine (sheet ine) kesilip (ctrl+x) yapıştırıldığında (ctrl+v) tarihçe listesi yalın (sade) bir halde excel dosyasına çıkarılmış olur.

sap design studio dashboard oturum zaman aşımı hatası

Sap Design Studio ile geliştirilen ve sürekli açık kalması gereken dashboard lar için aşağıdaki hatalar alınıyorsa sebebi aşağıdaki durum olabilir.

Hatalar:
“An error occured: Please restart the application. Most likely your session is not valid anymore.”
“Analysis Application: Server Session Timeout”

Yukarıdaki hataların alındığı senaryoda Yük Dengeleyici (Load Balancer, LB) arkasında iki web sunucusu (Tomcat, W1 ve W2) yer alıyor, iki web sunucusu da tek uygulama (application, AP) sunucusuna bağlanıyor.

Tomcat ve Web Intelligence Processing Server larda oturum zaman aşımı süresi 60 dk olarak atanmış durumda. Design Studio (Analysis Application) servisinin oturum zaman aşımı süresi 20 dk kod içinde belirtildiği için (hardcoded) değiştirilemiyor. (Kaynak 1)

Geliştirilen dashboard timer (zamanlayıcı) bileşeni (component) ile 17 dk da bir veri kaynaklarını yeniliyor ve oturumun sonlanmamasını sağlıyor. Ama zaman zaman yukarıdaki hatalar alınabiliyordu. Sebebini dashboard u uygulama sunucusu (AP) üzerindeki tomcat ten açık bırakarak tespit ettik. Uygulama sunucusu üzerinden açılan dashboard larda oturum zaman aşımı hatası alınmadı. Hata sebebi Yük Dengeleyicinin (Load Balancer) zaman aşımı süresiydi. Yük Dengeleyicinin zaman aşımı süresi arttırıldı, session sticky (yapışkan oturum) özelliği aktifleştirildi.

Kaynaklar:
1) Design Studio Idle Session Timeout
2) Sap BO Webi Oturum Zamanaşımı (Session Timeout)
3) Timeout settings in BI Platform 4.x

oracle Türkçe karakter büyük harf küçük harf çevrimi

Oracle veritabanında tutulan Türkçe karakterin olduğu metinleri Türkçe karakterler bozulmadan büyük harfe ya da küçük harfe çevrimi için NLS_UPPER() ve NLS_LOWER() fonksiyonu kullanılır. (NLS: National Language Support)

Örneğin:

select nls_upper('deli','nls_sort=xturkish') from dual; -- sonuç: 'DELİ'

select nls_lower('DELİ','nls_sort=xturkish') from dual; -- sonuç: 'deli'

Kaynak:
NLS_UPPER – Oracle Database SQL Reference

sap design studio veri kaynakları yüklenmemesi problem çözümü

Sap Business Objects (BO) Design Studio ile geliştirilen dashboard ta “Data source not loaded” hatası alındığında. Veya “Cannot load InfoProvider DSL (data provider DS: Exception occurred during creation)” hatası alındığında. Veya dashboard yerel bilgisayarda (localhost) başarılı bir şekilde çalışıp sunucuda çalıştırıldığında veri kaynakları yüklenmesi ile ilgili problem yaşanıyorsa. Aşağıdaki yöntem uygulanarak çözümlenebilir.

CMC (Central Management Console) den Design Studio servisinin (Analysis Applicatin Service) parametrelerine aşağıdaki parametreyi eklemek hatayı düzeltebilir. CMC > Servers > Analysis Application Server > Properties > Command Line Parameters. Aşağıdaki parametre çift tırnaklar ile birlikte parametrelerin sonuna bir boşluk bırakılarak eklenebilir.

“-Dbusinessobjects.connectivity.directory=D:\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\dataAccess\connectionServer”

Kaynak tartışma:
Design Studio constantly crashes on launchpad
BusinessObjects Explorer The creation of the data source object tree failed

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

Önceki iki yazıda (birinci yazı, ikinci yazı) paylaşılan kodun tam tersini, yani gizleme yerine gösterme, yapan kod. İlgili objeleri görünür hale getirip gerekiyorsa üst klasörlerini de görünür hale getiren VBA Script.

Kod indirme adresi:
UnhideWithParents.xlsm.zip


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 20000, 1 To 2) As String
Dim DeepHideList(1 To 20000, 1 To 6) As String
' 1:Level, 2:ObjectType, 3:ObjectName, 4:ObjectStatus, 5:ParentClass, 6:HideChangeFlag
Dim DeepHideIndex As Integer
Dim DeepHideLevel As Integer
Dim WkshtDoc As Excel.Worksheet
Dim WkshtRes As Excel.Worksheet



' başlangıç metodu
Sub GetData()
    
    Set DesignerApp = New Designer.Application
    DesignerApp.Visible = True
    Call DesignerApp.LogonDialog
    Set Univ = DesignerApp.Universes.Open
    ''Set Univ = DesignerApp.Universes.Import("/Universes/ayhan_deneme", "base_unv_for_link")
    
    '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)
    
    DeepHideIndex = 1
    DeepHideLevel = 0
    Call DocumentDeepHideList(Univ.Classes, 0, DeepHideIndex, "Root")
    
    Set WkshtDoc = ThisWorkbook.Worksheets("Doc")
    For Rn = 1 To (DeepHideIndex - 1)
        If (DeepHideLevel < CInt(DeepHideList(Rn, 1))) Then
            DeepHideLevel = CInt(DeepHideList(Rn, 1))
        End If
        WkshtDoc.Cells(Rn, 1).Value = DeepHideList(Rn, 1)
        WkshtDoc.Cells(Rn, 2).Value = DeepHideList(Rn, 2)
        WkshtDoc.Cells(Rn, 3).Value = DeepHideList(Rn, 3)
        WkshtDoc.Cells(Rn, 4).Value = DeepHideList(Rn, 4)
        WkshtDoc.Cells(Rn, 5).Value = DeepHideList(Rn, 5)
        WkshtDoc.Cells(Rn, 6).Value = DeepHideList(Rn, 6)
    Next Rn
    WkshtDoc.Cells(Rn + 1, 1).Value = "Max Lvl"
    WkshtDoc.Cells(Rn + 1, 2).Value = CStr(DeepHideLevel)
    
    Call CalculateDeepUnhide(1)
    
    Set WkshtRes = ThisWorkbook.Worksheets("Res")
    For Rn = 1 To (DeepHideIndex - 1)
        WkshtRes.Cells(Rn, 1).Value = DeepHideList(Rn, 1)
        WkshtRes.Cells(Rn, 2).Value = DeepHideList(Rn, 2)
        WkshtRes.Cells(Rn, 3).Value = DeepHideList(Rn, 3)
        WkshtRes.Cells(Rn, 4).Value = DeepHideList(Rn, 4)
        WkshtRes.Cells(Rn, 5).Value = DeepHideList(Rn, 5)
        WkshtRes.Cells(Rn, 6).Value = DeepHideList(Rn, 6)
    Next Rn
    WkshtRes.Cells(Rn + 1, 1).Value = "Max Lvl"
    WkshtRes.Cells(Rn + 1, 2).Value = CStr(DeepHideLevel)
    
    Call FolderDeepUnhideClasses(Univ.Classes)
    
    Call FolderDeepUnhideObjects(Univ.Classes)
    
    'WkshtRes.Protect
    'WkshtDoc.Protect
    'Wksht.Protect
    
End Sub



' klasörler, objeler, filtreler üzerinde özyinelemeli gezilerek listedeki objeler görünür hale getiriliyor ve varsa açıklamasındaki kısım siliniyor
Sub GoClasses(Clss)
    
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempPdcName As String
    
    For Each Cls In Clss
        TempClsName = Cls.Name
        For Each Obj In Cls.Objects
            TempObjName = Obj.Name
            'Rn = Rn + 1
            'Wksht.Cells(Rn, 1).Value = Cls.Name
            'Wksht.Cells(Rn, 2).Value = Obj.Name
            StatusChangeFlag = False
            For Rn = 1 To WorksheetRowCount
                If (TempClsName = CheckList(Rn, 1)) And (TempObjName = CheckList(Rn, 2)) Then
                    StatusChangeFlag = True
                    Wksht.Cells(Rn, 3).Value = "done"
                End If
            Next Rn
            If (StatusChangeFlag = True) And (Obj.Show = False) Then
                Obj.Show = True
                Obj.Description = Replace(Replace(Replace(Obj.Description, " #hide_unused_object_201709#", ""), "#hide_unused_object_201709#", ""), "#Hide_Unused_Object_201709", "")
            End If
        Next Obj
        For Each Pdc In Cls.PredefinedConditions
            TempPdcName = Pdc.Name
            'Rn = Rn + 1
            'Wksht.Cells(Rn, 1).Value = Cls.Name
            'Wksht.Cells(Rn, 2).Value = Obj.Name
            StatusChangeFlag = False
            For Rn = 1 To WorksheetRowCount
                If (TempClsName = CheckList(Rn, 1)) And (TempPdcName = CheckList(Rn, 2)) Then
                    StatusChangeFlag = True
                    Wksht.Cells(Rn, 3).Value = "done"
                End If
            Next Rn
            If (StatusChangeFlag = True) And (Pdc.Show = False) Then
                Pdc.Show = True
                Pdc.Description = Replace(Replace(Replace(Pdc.Description, " #hide_unused_object_201709#", ""), "#hide_unused_object_201709#", ""), "#Hide_Unused_Object_201709", "")
            End If
        Next Pdc
        
        If Cls.Classes.Count > 0 Then
            Call GoClasses(Cls.Classes)
        End If
        
    Next Cls
    
End Sub



' hata ayıklayabilmek ve yapılan işlemleri takip edebilmek için universe objeleri excel in Doc sheet ine yaılıyor
Sub DocumentDeepHideList(Clss, Lvl, DeepHideIndex, DeepHideParentClassName)
    
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempPdcName As String
    
    For Each Cls In Clss
        'If (Cls.Show = True) Then
            TempClsName = Cls.Name
            
            DeepHideList(DeepHideIndex, 1) = CStr(Lvl)
            DeepHideList(DeepHideIndex, 2) = "Class"
            DeepHideList(DeepHideIndex, 3) = TempClsName
            DeepHideList(DeepHideIndex, 4) = Cls.Show ' "True" ' object status
            DeepHideList(DeepHideIndex, 5) = DeepHideParentClassName ' parent class
            DeepHideList(DeepHideIndex, 6) = "False" ' hide change flag
            DeepHideIndex = DeepHideIndex + 1
            
            For Each Obj In Cls.Objects
                'If (Obj.Show = True) Then
                    DeepHideList(DeepHideIndex, 1) = CStr(Lvl + 1)
                    DeepHideList(DeepHideIndex, 2) = "Object"
                    DeepHideList(DeepHideIndex, 3) = Obj.Name
                    DeepHideList(DeepHideIndex, 4) = Obj.Show ' "True" ' object status
                    'If (Obj.Show = True) Then
                    '    DeepHideList(DeepHideIndex, 4) = "True"
                    'Else
                    '    DeepHideList(DeepHideIndex, 4) = "False"
                    'End If
                    DeepHideList(DeepHideIndex, 5) = TempClsName ' parent class
                    DeepHideList(DeepHideIndex, 6) = "False" ' hide change flag
                    DeepHideIndex = DeepHideIndex + 1
                'End If
            Next Obj
            For Each Pdc In Cls.PredefinedConditions
                'If (Pdc.Show = True) Then
                    DeepHideList(DeepHideIndex, 1) = CStr(Lvl + 1)
                    DeepHideList(DeepHideIndex, 2) = "Filter"
                    DeepHideList(DeepHideIndex, 3) = Pdc.Name
                    DeepHideList(DeepHideIndex, 4) = Pdc.Show ' "True" ' object status
                    DeepHideList(DeepHideIndex, 5) = TempClsName ' parent class
                    DeepHideList(DeepHideIndex, 6) = "False" ' hide change flag
                    DeepHideIndex = DeepHideIndex + 1
                'End If
            Next Pdc
            
        'End If
        
        If Cls.Classes.Count > 0 Then
            Call DocumentDeepHideList(Cls.Classes, Lvl + 1, DeepHideIndex, TempClsName)
        End If
        
    Next Cls
    
End Sub



' görünür hale getirilen objeler sebebiyle görünür yapılması gereken üst klasörler var mı diye hesaplanıyor
Sub CalculateDeepUnhide(abc)
    Dim DeepHideLevel_i As Integer
    Dim DeepHide_i As Integer
    Dim Change_i As Integer
    Dim DeepHide_ii As Integer
    
    For DeepHideLevel_i = DeepHideLevel To 0 Step -1
        ' MsgBox "" & DeepHideLevel_i
        For DeepHide_i = 1 To (DeepHideIndex - 1)
            If (DeepHideList(DeepHide_i, 2) = "Class") And (DeepHideList(DeepHide_i, 4) = "False") And (DeepHideLevel_i = DeepHideList(DeepHide_i, 1)) Then
                Change_i = 0
                For DeepHide_ii = 1 To (DeepHideIndex - 1)
                    If ((DeepHide_i <> DeepHide_ii) And (CStr(CInt(DeepHideList(DeepHide_i, 1)) + 1) = DeepHideList(DeepHide_ii, 1)) And (DeepHideList(DeepHide_i, 3) = DeepHideList(DeepHide_ii, 5)) And (DeepHideList(DeepHide_ii, 4) = "True")) Then
                        Change_i = 1
                        Exit For ' DeepHide_ii = (DeepHideIndex - 1) ' Exit For
                    End If
                Next DeepHide_ii
                If (Change_i = 1) Then
                    DeepHideList(DeepHide_i, 4) = "True" ' object status
                    DeepHideList(DeepHide_i, 6) = "True" ' hide change flag
                End If
            End If
        Next DeepHide_i
    Next DeepHideLevel_i
    
End Sub



' hesaplama sonucu görünürlüğü değiştirilecek objelerin görünürlüğü aktif hale getiriliyor
Sub FolderDeepUnhideClasses(Clss)
    ' 1:Level, 2:ObjectType, 3:ObjectName, 4:ObjectStatus, 5:ParentClass, 6:HideFlag
    
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempPdcName As String
    
    For Each Cls In Clss
        TempClsName = Cls.Name
        
        For Rn = 1 To (DeepHideIndex - 1)
            If ((DeepHideList(Rn, 6) = "True") And (TempClsName = DeepHideList(Rn, 3))) Then
                Cls.Show = True
                Cls.Description = Replace(Replace(Replace(Cls.Description, " #hide_unused_object_201709#", ""), "#hide_unused_object_201709#", ""), "#Hide_Unused_Object_201709", "")
                WkshtRes.Cells(Rn, 7).Value = "done"
            End If
        Next Rn
        
        If Cls.Classes.Count > 0 Then
            Call FolderDeepUnhideClasses(Cls.Classes)
        End If
        
    Next Cls
    
End Sub



' klasör görünür hale getirilince altındaki tüm objeler de görünür duruma dönüştüğü için fazladan dönüşen objeler ilk görünürlük hallerine çevriliyor
Sub FolderDeepUnhideObjects(Clss)
    ' 1:Level, 2:ObjectType, 3:ObjectName, 4:ObjectStatus, 5:ParentClass, 6:HideFlag
    
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempObjShow As String
    Dim TempPdcName As String
    Dim TempPdcShow As String
    Dim DeepHide_i As Integer
    Dim Change_i As Integer
    
    For Each Cls In Clss
        TempClsName = Cls.Name
        
        For Each Obj In Cls.Objects
            TempObjName = Obj.Name
            TempObjShow = Obj.Show
            For DeepHide_i = 1 To (DeepHideIndex - 1)
                Change_i = 0
                If (TempClsName = DeepHideList(DeepHide_i, 5) And TempObjName = DeepHideList(DeepHide_i, 3)) Then
                    If (TempObjShow = DeepHideList(DeepHide_i, 4)) Then
                        Change_i = 0
                    Else
                        Change_i = 1
                    End If
                    Exit For
                End If
            Next DeepHide_i
            If (Change_i = 1) Then
                Obj.Show = DeepHideList(DeepHide_i, 4)
                WkshtRes.Cells(DeepHide_i, 8).Value = "done"
            End If
        Next Obj
        For Each Pdc In Cls.PredefinedConditions
            TempPdcName = Pdc.Name
            TempPdcShow = Pdc.Show
            For DeepHide_i = 1 To (DeepHideIndex - 1)
                Change_i = 0
                If (TempClsName = DeepHideList(DeepHide_i, 5) And TempPdcName = DeepHideList(DeepHide_i, 3)) Then
                    If (TempPdcShow = DeepHideList(DeepHide_i, 4)) Then
                        Change_i = 0
                    Else
                        Change_i = 1
                    End If
                    Exit For
                End If
            Next DeepHide_i
            If (Change_i = 1) Then
                Pdc.Show = DeepHideList(DeepHide_i, 4)
                WkshtRes.Cells(DeepHide_i, 8).Value = "done"
            End If
        Next Pdc
        
        If Cls.Classes.Count > 0 Then
            Call FolderDeepUnhideObjects(Cls.Classes)
        End If
        
    Next Cls
    
End Sub

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

Önceki yazıda paylaşılan kodun performansı iyileştirilmiştir. Ayrıca toplu obje gizleme işlemi sonucunda boş kalan klasörleri de belirleyip gizleme yapmaktadı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 20000, 1 To 2) As String
Dim DeepHideList(1 To 20000, 1 To 6) As String
' 1:Level, 2:ObjectType, 3:ObjectName, 4:ObjectStatus, 5:ParentClass, 6:HideFlag
Dim DeepHideIndex As Integer
Dim DeepHideLevel As Integer
Dim WkshtDoc As Excel.Worksheet
Dim WkshtRes As Excel.Worksheet



' başlangıç metodu
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
    'Rn = 0
   
    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)
   
    DeepHideIndex = 1
    DeepHideLevel = 0
    Call DocumentDeepHideList(Univ.Classes, 0, DeepHideIndex, "Root")
   
    Set WkshtDoc = ThisWorkbook.Worksheets("Doc")
    For Rn = 1 To (DeepHideIndex - 1)
        If (DeepHideLevel < CInt(DeepHideList(Rn, 1))) Then
            DeepHideLevel = CInt(DeepHideList(Rn, 1))
        End If
        WkshtDoc.Cells(Rn, 1).Value = DeepHideList(Rn, 1)
        WkshtDoc.Cells(Rn, 2).Value = DeepHideList(Rn, 2)
        WkshtDoc.Cells(Rn, 3).Value = DeepHideList(Rn, 3)
        WkshtDoc.Cells(Rn, 4).Value = DeepHideList(Rn, 4)
        WkshtDoc.Cells(Rn, 5).Value = DeepHideList(Rn, 5)
        WkshtDoc.Cells(Rn, 6).Value = DeepHideList(Rn, 6)
    Next Rn
    WkshtDoc.Cells(Rn + 1, 1).Value = "Max Lvl"
    WkshtDoc.Cells(Rn + 1, 2).Value = CStr(DeepHideLevel)
   
    Call CalculateDeepHide(1)
   
    Set WkshtRes = ThisWorkbook.Worksheets("Res")
    For Rn = 1 To (DeepHideIndex - 1)
        WkshtRes.Cells(Rn, 1).Value = DeepHideList(Rn, 1)
        WkshtRes.Cells(Rn, 2).Value = DeepHideList(Rn, 2)
        WkshtRes.Cells(Rn, 3).Value = DeepHideList(Rn, 3)
        WkshtRes.Cells(Rn, 4).Value = DeepHideList(Rn, 4)
        WkshtRes.Cells(Rn, 5).Value = DeepHideList(Rn, 5)
        WkshtRes.Cells(Rn, 6).Value = DeepHideList(Rn, 6)
    Next Rn
    WkshtRes.Cells(Rn + 1, 1).Value = "Max Lvl"
    WkshtRes.Cells(Rn + 1, 2).Value = CStr(DeepHideLevel)
   
    Call FolderDeepHide(Univ.Classes)
   
    'WkshtRes.Protect
    'WkshtDoc.Protect
    'Wksht.Protect
   
End Sub



' excel listesindeki objeler, klasör ve objeler üzerinde özyinelemeli olarak gezilerek görünürlükleri devre dışı bırakılıyor
Sub GoClasses(Clss)
   
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempPdcName As String
   
    For Each Cls In Clss
        TempClsName = Cls.Name
        For Each Obj In Cls.Objects
            TempObjName = Obj.Name
            'Rn = Rn + 1
            'Wksht.Cells(Rn, 1).Value = Cls.Name
            'Wksht.Cells(Rn, 2).Value = Obj.Name
            StatusChangeFlag = False
            For Rn = 1 To WorksheetRowCount
                If (TempClsName = CheckList(Rn, 1)) And (TempObjName = 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
            TempPdcName = Pdc.Name
            'Rn = Rn + 1
            'Wksht.Cells(Rn, 1).Value = Cls.Name
            'Wksht.Cells(Rn, 2).Value = Obj.Name
            StatusChangeFlag = False
            For Rn = 1 To WorksheetRowCount
                If (TempClsName = CheckList(Rn, 1)) And (TempPdcName = 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



' ilgili excel verisine göre obje gizleme işinden sonra boş klasörleri tespit etmek için obje ve klasör envanteri çıkarılıyor
Sub DocumentDeepHideList(Clss, Lvl, DeepHideIndex, DeepHideParentClassName)
   
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempPdcName As String
   
    For Each Cls In Clss
        If (Cls.Show = True) Then
            TempClsName = Cls.Name
           
            DeepHideList(DeepHideIndex, 1) = CStr(Lvl)
            DeepHideList(DeepHideIndex, 2) = "Class"
            DeepHideList(DeepHideIndex, 3) = TempClsName
            DeepHideList(DeepHideIndex, 4) = "True" ' object status
            DeepHideList(DeepHideIndex, 5) = DeepHideParentClassName ' parent class
            DeepHideList(DeepHideIndex, 6) = "False"
            DeepHideIndex = DeepHideIndex + 1 ' hide flag
           
            For Each Obj In Cls.Objects
                If (Obj.Show = True) Then
                    DeepHideList(DeepHideIndex, 1) = CStr(Lvl + 1)
                    DeepHideList(DeepHideIndex, 2) = "Object"
                    DeepHideList(DeepHideIndex, 3) = Obj.Name
                    DeepHideList(DeepHideIndex, 4) = "True" ' object status
                    'If (Obj.Show = True) Then
                    '    DeepHideList(DeepHideIndex, 4) = "True"
                    'Else
                    '    DeepHideList(DeepHideIndex, 4) = "False"
                    'End If
                    DeepHideList(DeepHideIndex, 5) = TempClsName ' parent class
                    DeepHideList(DeepHideIndex, 6) = "False" ' hide flag
                    DeepHideIndex = DeepHideIndex + 1
                End If
            Next Obj
            For Each Pdc In Cls.PredefinedConditions
                If (Pdc.Show = True) Then
                    DeepHideList(DeepHideIndex, 1) = CStr(Lvl + 1)
                    DeepHideList(DeepHideIndex, 2) = "Filter"
                    DeepHideList(DeepHideIndex, 3) = Pdc.Name
                    DeepHideList(DeepHideIndex, 4) = "True" ' object status
                    DeepHideList(DeepHideIndex, 5) = TempClsName ' parent class
                    DeepHideList(DeepHideIndex, 6) = "False" ' hide flag
                    DeepHideIndex = DeepHideIndex + 1
                End If
            Next Pdc
           
        End If
       
        If Cls.Classes.Count > 0 Then
            Call DocumentDeepHideList(Cls.Classes, Lvl + 1, DeepHideIndex, TempClsName)
        End If
       
    Next Cls
   
End Sub



' en derin seviyeden en üst seviyeye doğru tümseviyelerde alt seviyesinde görünür obje olup olmadığına göre hesaplama yapılıyor
Sub CalculateDeepHide(abc)
    Dim DeepHideLevel_i As Integer
    Dim DeepHide_i As Integer
    Dim change_i As Integer
    Dim DeepHide_ii As Integer
   
    For DeepHideLevel_i = DeepHideLevel To 0 Step -1
        ' MsgBox "" & DeepHideLevel_i
        For DeepHide_i = 1 To (DeepHideIndex - 1)
            If (DeepHideList(DeepHide_i, 2) = "Class") And (DeepHideLevel_i = DeepHideList(DeepHide_i, 1)) Then
                change_i = 0
                For DeepHide_ii = 1 To (DeepHideIndex - 1)
                    If ((DeepHide_i <> DeepHide_ii) And (CStr(CInt(DeepHideList(DeepHide_i, 1)) + 1) = DeepHideList(DeepHide_ii, 1)) And (DeepHideList(DeepHide_i, 3) = DeepHideList(DeepHide_ii, 5)) And (DeepHideList(DeepHide_ii, 4) = "True")) Then
                        change_i = 1
                        Exit For ' DeepHide_ii = (DeepHideIndex - 1) ' Exit For
                    End If
                Next DeepHide_ii
                If (change_i = 0) Then
                    DeepHideList(DeepHide_i, 4) = "False" ' object status
                    DeepHideList(DeepHide_i, 6) = "True" ' hide flag
                End If
            End If
        Next DeepHide_i
    Next DeepHideLevel_i
   
End Sub



' gizlenecek olarak belirlenen klasörler gizleniyor
Sub FolderDeepHide(Clss)
    ' 1:Level, 2:ObjectType, 3:ObjectName, 4:ObjectStatus, 5:ParentClass, 6:HideFlag
   
    Dim TempClsName As String
    Dim TempObjName As String
    Dim TempPdcName As String
   
    For Each Cls In Clss
        TempClsName = Cls.Name
       
        For Rn = 1 To (DeepHideIndex - 1)
            If ((DeepHideList(Rn, 6) = "True") And (TempClsName = DeepHideList(Rn, 3))) Then
                Cls.Show = False
                Cls.Description = Cls.Description & " #hide_unused_object_201709#"
                WkshtRes.Cells(Rn, 7).Value = "done"
            End If
        Next Rn
       
        If Cls.Classes.Count > 0 Then
            Call FolderDeepHide(Cls.Classes)
        End If
       
    Next Cls
   
End Sub