Power BI’da Yönetici Raporu

Murat Mutlu
Akkim Akademi
Published in
6 min readDec 8, 2022

Merhabalar,

Bu yazıda Power BI’da yayınlanan raporların kontrolünü ve takibini yapabilmek adına hazırladığım yönetici raporundan bahsedeceğim.

Bu proje sayesinde Kullanıcı hareketleri (Rapor yayınlama, silme ve görüntüleme zamanları), Raporların yenileme zamanları ve kullanıcılara hangi raporların paylaşıldığı gibi bilgilere tek bir rapor üzerinden erişebileceğiz.

Proje için ihtiyacımız olan Çalışma Alanları, Veri Kümeleri, Raporlar, Kullanıcılar ve Kullanıcı Hareketleri gibi verilere ulaşabilmek için Power BI REST API’leri kullanacağız.

Power BI REST API’leri projemizde kullanmak için uygulamanız gereken adımlar aşağıda belirtilmiştir.

  1. Uygulamanızı Azure Active Directory’e kaydediniz.
  2. API için yetki veriniz.
  3. Bir erişim belirteci alınız(access token).

Bu adımlar ile ilgili detaylar sırası ile aşağıda belirtilmiştir.

İlk olarak Microsoft yönetici hesabı ile oturum açtıktan sonra aşağıda belirtilen adres üzerinden yeni bir uygulama oluşturmanız gerekmektedir.

https://app.powerbi.com/embedsetup/AppOwnsData

İleri dedikten sonra uygulamaya bir isim verip aşağıda belirtilen API’leri ve erişim düzeylerini seçerek kaydediniz. Artık Azure Active Directory üzerinde uygulamamızın kaydı gerçekleşmiştir.

API izinlerini onaylamak için Microsoft Azure portalına giriş yapınız. Giriş yaptıktan sonra API izinlerini ayarlamak için sırasıyla aşağıdaki adımları takip edelim.

  1. Arama bölümünden Uygulama kayıtlarını aratıp açınız.

2. Uygulama kayıtları sayfasında tüm uygulamalar bölümünde oluşturmuş olduğunuz uygulamayı seçiniz.

3. Uygulamayı açtıktan sonra soldaki menüde bulunan API izinleri sayfasını açınız. Bu bölümde uygulamanızda bulunan API izinleri listelenmektedir. Power BI Service üzerine tıklayarak buraya Tenant.Read.All iznini de ekleyiniz. Daha sonra yönetici onayı ver diyerek izinleri aktif hale getiriniz.

İzinlerini aktif ettikten sonra Power BI’da API sorgularını çağırmak için erişim belirteci(access token) oluşturmamız gerekmektedir.

Power BI’a geçmeden önce postman.com üzerinden erişim belirteci oluşturalım. Kullandığım API isteği ve bu adrese gönderilecek parametreler aşağıda belirtilmiştir.

https://login.microsoftonline.com/tenant_id/oauth2/token
tenant_id: Dizin (kiracı) kimliği
grant_type: password
username: Microsoft kullanıcı adı
password: Microsoft kullanıcı şifresi
client_id: Uygulama (istemci) kimliği
resource: https://analysis.windows.net/powerbi/api
scope: openid

Kiracı ve istemci kimliği bilgilerine uygulamanın Genel Bakış bölümünden erişebilirsiniz.

Postman.com üzerinde Post işleminin ardından access token aşağıda görüldüğü gibi hatasız bir şekilde oluşmaktadır.

Artık Power BI’a geçmek için hazırız.

Çalışma Alanları

Power BI Desktop üzerinden yeni bir proje oluşturup veri kaynağı olarak Web’i seçiniz.

Aşağıda belirtilen çalışma alanı ve onunla ilişkili veri kümesi ve raporları getiren API sorgusunu URL parts bölümüne yapıştırınız. HTTP request header alanına Authorization yanındaki alana ise başına “Bearer” ifadesini ekleyerek access_token kodunu yapıştırınız.

https://api.powerbi.com/v1.0/myorg/admin/groups$top=1000&$expand=datasets,reports

Web kaynağı bağlantısını onayladıktan sonra karşımıza bir liste gelecektir. Bu listeyi aşağıda belirtilen adımları takip ederek tablo formatına dönüştürünüz.

Çalışma alanlarının tutulduğu tablomuzun son hali aşağıdaki gibidir.

Diğer tablolara geçmeden önce veri kaynağı bağlantısında kullandığımız access_token kısa ömürlü bir koddur. Kaynaklara erişmeye devam etmek için süresi dolduktan sonra yeni bir access_token kodu almamız gerekmektedir. Bunun önüne geçebilmek için güncel access_token kodu oluşturan API isteğimizi aşağıda belirtildiği şekilde bir fonksiyon haline getiriyoruz. Bu sayede rapor her yenilendiğinde veri kaynağına sorunsuz erişecektir.

GET Access Token

()=>
let
body=”grant_type=password&resource=
https://analysis.windows.net/powerbi/api&client_id=68***********&username=murat**@***&password=*****",
Data=Json.Document(Web.Contents(“
https://login.microsoftonline.com/common/oauth2/token/",
[Headers=[#”Content-Type”=”application/x-www-form-urlencoded”],
Content=Text.ToBinary(body)])),
access_token = Data[access_token]
in
access_token

GET Access Token fonksiyonunu hazırladıktan sonra Workspace tablosu üzerinden Advanced Editörü açınız. Authorization bölümünden access_token kodu yerine GET Access Token fonksiyonunu ekleyip onaylayınız.

Veri Kümesi ve Raporlar

Veri kümesi ve rapor tablolarını çalışma alanı tablosu üzerinden oluşturacağız.

Veri kümesi tablosu için aşağıdaki adımları takip ediniz.

  1. Workspace tablosunu kopyalayınız.
  2. groupId ve datasets dışındaki sütunları kaldırınız.
  3. datasets sütunundaki satırları genişletiniz.
  4. id sütun adını datasetId olarak değiştiriniz.

Rapor tablosu için veri kümesi tablosu ile aynı adımları takip ediniz.

  • id sütun adını reportId olarak değiştiriniz.

Kullanıcılar

Kullanıcıları Workspace tablosu üzerinden listelersek sadece çalışma alanına erişim izni verilen kullanıcılara ulaşırız. Raporlara erişim izni verilen kullanıcıları görmek istiyorsak aşağıdaki sorguyu kullanabiliriz.

https://api.powerbi.com/v1.0/myorg/admin/reports/{reportId}/users

Her bir rapora tanımlı kullanıcıları listelemek için bu sorguyu fonksiyon haline getirmemiz gerekir.

GET Users

(reportId as text) =>
let
Source = Json.Document(Web.Contents(“
https://api.powerbi.com/v1.0/myorg/",
[
RelativePath=”admin/
reports/” & reportId & “/users”,
Headers=[Authorization=”Bearer “ & #”
GET Access Token”()]
] )),
value=Source[value]
in
value

Kullanıcı tablosunu hazırlamak için aşağıdaki adımları takip ediniz.

  1. Reports tablosunu Duplicate ediniz.
  2. reportId dışındaki sütunları kaldırınız.
  3. Invoke Custom Function diyerek GET Users fonksiyonunu dahil ediniz.
  4. GET Users sütunundaki satırları genişletiniz.

Kullanıcı tablomuzun son hali aşağıdaki gibidir.

Rapor Yenilemeleri

Rapor yenilemeleri tablosunu veri kümesi tablosu üzerinden oluşturacağız. Raporların yinelenme durumu ve zamanına ulaşmak için aşağıdaki sorguyu kullanabilirsiniz.

https://api.powerbi.com/v1.0/myorg/datasets/{datasetId}/refreshes

Her bir rapora ait yenilenme tarihçesini listelemek için bu sorguyu fonksiyon haline getirmemiz gerekir.

GET Refreshes

(datasetId as text) =>
let
Source = Json.Document(Web.Contents(“
https://api.powerbi.com/v1.0/myorg/",
[
RelativePath=”admin/
datasets/” & datasetId & “/refreshes”,
Headers=[Authorization=”Bearer “ & #”
GET Access Token”()]
] )),
value=Source[value]
in
value

Rapor yenilemeleri tablosunu hazırlamak için aşağıdaki adımları takip ediniz.

  1. Datasets tablosunu Duplicate ediniz.
  2. datasetId dışındaki sütunları kaldırınız.
  3. Invoke Custom Function diyerek GET Refreshes fonksiyonunu dahil ediniz.
  4. GET Refreshes sütunundaki satırları genişletiniz.

Kullanıcı Hareketleri

Kullanıcıların hareketlerine ulaşmak için aşağıdaki sorguyu kullanabilirsiniz.

https://api.powerbi.com/v1.0/myorg/admin/activityevents?startDateTime={startDateTime}&endDateTime={endDateTime}

Sorguda belirtilen başlangıç ve bitiş zamanlarının aynı tarihte olması gerekiyor. Aksi taktirde hata verecektir.

İki zaman arasındaki hareketleri listelemek için bu sorguyu fonksiyon haline getirmemiz gerekir.

GET Activity

(accessToken as text, optional startDate as text, optional endDate as text) =>
let
Source = Json.Document(Web.Contents(“
https://api.powerbi.com/v1.0/myorg/",
[
RelativePath= “admin/activityevents?startDateTime=” &
startDate& “&endDateTime=” &endDate& “”,
Headers=[Authorization=”Bearer “ &
accessToken]
]
)),
Data = Source[activityEventEntities],
DataList = List.Combine({Data})
in
DataList

Kullanıcı Hareketleri tablosunu hazırlamak için aşağıdaki adımları takip ediniz.

  1. Başlangıç ve bitiş tarihleri bulunan bir tablo oluşturunuz. İki tarih arasındaki hareketlerin eksiksiz gelmesi için saat farkının 1'den fazla olmaması gerekir.

Son 1 haftayı içeren saatlik tarih listesini oluşturmak için aşağıdaki sorguyu kullanabilirsiniz.

let
Source = List.DateTimes,
#”Invoked FunctionSource” = Source(Date.AddDays(DateTime.FixedLocalNow(), -7), 168, #duration(0, 1, 0, 0))
in
#”Invoked FunctionSource”

2. Tarih listesini tabloya dönüştürünüz. Tarih sütununu çoğaltıp yeni sütunun veri tipini zaman olarak değiştiriniz.

3. API istediğimizde kullanacağımız başlangıç ve bitiş tarihleri ISO 8601 uyumlu UTC formatında (“yyyy’-’MM’-’dd’T’HH’:’mm’:’ss’.’ fffZ”) olmalıdır. Custom Column ekleyip aşağıda belirtildiği şekilde başlangıç ve bitiş tarihlerini oluşturunuz.

4. Başlangıç ve bitiş tarihlerinin aynı günde kalması için zaman sütununu 23:00 dan küçük olacak şekilde filtreleyiniz.

5.Invoke Custom Function diyerek GET Activity fonksiyonunu dahil ediniz.

6. GET Activity sütunundaki satırları genişletiniz.

Raporunuz için gerekli olan tabloları oluşturduktan sonra veri modelleme ve görselleştirme bölümüne geçebilirsiniz.

Veri modelinin son hali aşağıda belirtilmiştir.

Bu yöntemleri uygulayarak sizde kendi yönetim raporunuzu hazırlayabilirsiniz.

--

--

Murat Mutlu
Akkim Akademi

Business Intelligence Responsible | HTML/CSS | JavaScript | C# | ASP.NET MVC | Python | Machine Learning | PowerBI | Excel | SQL | SSAS | SSRS |SSIS