Report Serverın ayarları açık ise report servera her bir istek gönderildiği zaman report serverda bir kayıt oluşur.Yani reportserverda ne zaman view report tuşuna basılırsa veya kaydetme tuşlarından excel,pdf veya başka bir formata rapor alınmak istenirse report serverda kaydı tutulur
Eğer değiştirilmediyse report serverın default log tutma süresi 60 gündür ve bu özellik açık olarak gelir.Ancak report serverın propertiesinden bu süre arttırılabilir veya report serverın loglaması kapatılabilir
Daha sonra Report Server db sine giderek ExecutionLogStorage tablosuna bakalırsa işlem logları bu tabloda tutulmaktadır
Select * from ExecutionLogStorage
ExecutionLogStorage tablosundaki bazı önemli alanlar şunlardır
UserName àEğer program domain mantığında çalışıyor ise burada domain user ismi
àEğer program domain değil anonymous mantığı ile çalışıyor ise dummy user olarak kayıt çıkacaktır
Format: RPL,Excel,PDF vs hangi formatta veri istenmişşe o gözükür.Zaten view report butonuna basıldığında direkt olarak format alanı RPL olacak şekilde sisteme bi kayıt düşer
Parameters:Rapora gönderilen parametreler aşağıdaki gibi & işareti ile ayrılarak tutulur
begin=12.06.2011&end=13.06.2011&BU=6163296b-f798-df11-8fa0-001a64c78ef4
ReportID:Hangi rapordan istek yapıldığının ID si tutar.Buradaki reportID catalog tablosunda itemID ile join edilerek Catalog tablosundan raporun report servera deploy edilmiş hali bulunur
Select ItemID,Name from Catalog
TimeStart:İsteğin başladığı tarihi gösterir
RowCount:Kaç kaydın o anda alındığını gösterir
Yalnız rowcount excel,pdf aktara basıldığında rowcount atmaz.Sadece bir tane log kaydı oluşur.RowCount view report basıldığında sorgu sonucu dönen kaydı tutar
Dolayısıyla her reportview ,ve excel,pdf aktarma işlemi için report serverda bi log oluşur
Eğer sisteminiz domain mantığı ile çalışıyorsa ExecutionLogStoragedaki UserName kullanarak kendi user tablonuzdaki domain name ile eşleştirebilirsiniz
Yok eğer sisteminiz domain mantığında değilse ve hangi kullanıcının işlem yaptığını öğrenmek istiyorsanız bunun için Her raporunuza sabit olacak şekilde Sisteminizdeki report viewara UserId diye bir parametre göndermek ve daha sonra UserId parse ederek buradaki değer ile kendi user tablonuzdaki değeri eşleyerek işlem yapabilirsiniz
Uyarı:Eğer report serverınız ile programınızın kullandığı veritabanı ayrı sqllerde ise ve siz link server ile report servera sorgu atacak iseniz aşağıdaki gibi hata alacaksınız.Çünkü ExecutionLogStorage içinde xml bir alan olduğu için size izin vermeyecektir
Bunu aşmak için linked serverdan sorgu çekeceğiniz yerde OPENQUERY komutunu kullanmanız gerekir.Aşağıdaki gibi örnek bir sorgu ile hem linked serverdan parametrik olarak veri çekip sonra bunu bir temp table yardımı ile kendi veritabanımız ile birleştirerek kullanabiliyoruz
DECLARE @sqlQuery VARCHAR(8000)
DECLARE @finalQuery VARCHAR(8000)
SET @sqlQuery = ‘Select UserName AS UserID,Name AS RaporAd,ReportID,Format,[RowCount] AS RowAdet,TimeStart,TimeEnd from [ReportServer].[dbo].[ExecutionLogStorage] inner join [ReportServer].[dbo].[Catalog] on [Catalog].ItemID=ExecutionLogStorage.ReportID WHERE TimeStart >= ‘ + ”” + ”” + convert(varchar,@TimeStart) + ”” + ”” + ‘and TimeStart<”’ + ””+convert(varchar,@TimeEnd) + ”” + ””
SET @finalQuery = ‘SELECT * FROM OPENQUERY([CRM4APP],’ + ”” + @sqlQuery + ”” + ‘)’
CREATE TABLE #List1
(
UserID varchar(500), RaporAd varchar(500) ,ReportID uniqueidentifier,Format varchar(100),RowAdet int,TimeStart datetime,TimeEnd DateTime
)
INSERT INTO #List1
(
UserID,RaporAd,ReportID,Format,RowAdet,TimeStart,TimeEnd)
exec(@finalQuery )
select SystemUser.SystemUserId AS UserID,SystemUser.FullName AS KullanıcıAd,SystemUser.DomainName,RaporAd,ReportID,Format,RowAdet,convert(varchar,TimeStart,103) AS TimeStart,convert(varchar,TimeEnd,103) AS TimeEnd,BusinessUnit.Name AS BayiAd from #List1
inner join SystemUser on SystemUser.DomainName=#List1.UserID COLLATE Turkish_CI_AI
inner join BusinessUnit on SystemUser.BusinessUnitId=BusinessUnit.BusinessUnitId
drop Table #List1