SQL Server Rapor Sorguları

Posted

WinTr Scada ver 4.1.0 ile birlikte Sql server’a kayıt girişleri farklı metodlar ile yapılabiliyor.

  • Not Historical: Database’e kaydı yapılmayan Tag.
  • Periodically: Tag değeri sürekli olarak database’e kaydedilir. Kayıt periyotu kontrol panelinde mili saniye olarak seçilebilir.
  • Every Minute: Tag değeri her dakikada bir defa kaydedilir.
  • Every Hour: Tag değeri her saatde bir defa kaydedilir.
  • Every Day: Tag değeri her gün de bir defa kaydedilir.
  • Only value changed: Tag değeri her değiştiğinde bir defa kaydedilir.
  • Triggered: Başka bir tagın değeri her değiştiğinde tipi triggered olarak seçilen tagın değeri kaydedilir.

Bu seçenekler ile database gereksiz yere büyümeden kayıt işlemlerini gerçekleştirir. Ayrıca eski versiyonlarda olay bazlı kayıtlar için script yazmak gerekliydi, Triggered seçeneğiyle birlikte olay bazlı kayıt işlemleri yapılabilir. Periodically seçeneği haricindeki kayıt yöntemlerinden birini kullandığınız taktirde database satırlarında boşluklar oluşacaktır. Bunun neticesinde rapor modülü ile oluşturacağınız raporlarda da aynı boşluklar oluşacaktır. Raporlarınızda bu boşlukları görmek istemiyorsnız veya başka ihtiyaçlardan dolayı farklı raporlar oluşturmak istiyorsanız aşağıda ki örnek rapor sorgularını kullanabilirsiniz.

1. Sorguların sonuna Tag_1 is not null seçeneği ekleyerek boşluk olmayan değerlerin getirilmesiniz sağlayabilirsiniz. Bir den fazla Tag değeri getiren sorgularda ‘and’ komutu ile diğer tag lar için de is not null seçeveniğini ekleyebilirsiniz.

SELECT [DateTime],[Tag_1] FROM Table1 Where Tag_1 is not null and Tag_2 is not null

2. Satırdaki değer boş olduğunda daha önceki dolu değeri yerine koyan sorgu:

select T.DateTime, V1.Tag_1, V2.Tag_2 from Table1 T CROSS APPLY (select top (1) Tag_1 from Table1 T1 where T1.Datetime <=T.Datetime and T1.Tag_1 IS NOT NULL order by T1.DateTime DESC) V1 CROSS APPLY (select top (1) Tag_2 from Table1 T2 where T2.Datetime <=T.Datetime and T2.Tag_2 IS NOT NULL order by T2.DateTime DESC) V2

3. İkinci sorgu ile aynı şekilde çalışabilecek bir diğer sorgu. Bu sorguya başlangıç ve bitiş kısıtlaması eklenmiştir.

Select DateTime, Coalesce(Tag_1, MaxPrevVal1) FROM Table1 M1    Cross Apply (select top(1 )Tag_1 as MaxPrevVal1 From Table1 M2 where M2.DateTime < m1.DateTime and Tag_1 is not null order by DateTime DESC) as CS1     where DateTime between ‘4/28/2012 2:04:13 PM’ and ‘5/28/2012 2:04:15 PM’

4. Alternatif bir sorgu daha.

Select DateTime,Tag_1,Tag_2,Tag_3 from Table1 where DateTime between ‘05.12.2012 11:38:07’ and ‘06.12.2012 11:39:59’ and Tag_1 is not null and Tag_2 is not null and Tag_3 is not null UNION all Select Top 1 DateTime, Coalesce(Tag_1, PrevVal1),Coalesce(Tag_2, PrevVal2),Coalesce(Tag_3, PrevVal3) FROM Table1 M1   Cross Apply (select top(1) Tag_1 as PrevVal1 From Table1 M2 where M2.DateTime < m1.DateTime and Tag_1 is not null order by DateTime DESC) as CS1    Cross Apply (select top(1) Tag_2 as PrevVal2 From Table1 M2 where M2.DateTime < m1.DateTime and Tag_2 is not null order by DateTime DESC) as CS2   Cross Apply (select top(1) Tag_3 as PrevVal3 From Table1 M2 where M2.DateTime < m1.DateTime and Tag_3 is not null order by DateTime DESC) as CS3     where DateTime between ‘05.12.2012 11:38:07’ and ‘06.12.2012 11:39:59’ UNION all Select DateTime,Tag_1,Tag_2,Tag_3 from Table1 where DateTime between ‘05.12.2012 11:38:07’ and ‘06.12.2012 11:39:59’

5. Büyük database’ler den rapor oluşturduğunuzda çok fazla data getirilecektir. Bu raporun oluşturulması uzun süreceğinden rapor kısaltmak için değerlerin belli kurallar ile ortalamasını almayı düşünmelisiniz. Aşağıdaki sorgu her 5 değerin ortalamasını 1 değer olarak getirir.

WITH OrderedRows AS ( SELECT (Row_Number() OVER (ORDER BY LastValue ASC) – 1) / 5 As LastValue2 ,DateTime,Tag_1,Tag_2,Tag_3  FROM Table1 where DateTime between ‘05.12.2012 11:38:07’ and ‘06.22.2012 11:39:59’) SELECT min(DateTime) as DateTime, Avg(Tag_1) as Tag_1,Avg(Tag_2) as Tag_2,Avg(Tag_3) as Tag_3 FROM    OrderedRows GROUP BY LastValue2 order by LastValue2 ASC

Not: WinTr scada rapor oluşturduğunda sayfada bulunan data gridde çok fazla değer olabilir. Bu değerler silinmediği taktirde rapor sayfasının kapanması ve açılması yavaşlayabilir. Bu sorunu ortadan kaldırmak için rapor için kullandığınız datagridlerde row tag’ı kullanabilirsiniz. Örneğin: Tag_1 değişkenini row tag’ı olarak datagrid de işaretleyin. Rapor butonunda ilk önce Tag_1’e ‘1’ değerini yazın ikinci işlem ise rapor oluşturmak olsun. Sayfadan çıkışı sağlayan(Başka bir sayfayı açan) tüm butonlarda Tag_1’e “0” değerini altarın ve sonraki fonksiyon için açmak istediğiniz sayfayı seçin. Böylece sayfa kapatılmadan önce datagrid temizlenecek ve sayfa tekrar açıldığında hızlı olarak açılacaktır.

Not: Çok büyük raporlar oluşturulurken scada diğer görevlerini aksatabilir. Çözüm olarak aynı bilgisayarda iki farklı scada programı çalıştırabilirsiniz. Bir tanesi asıl scada programımız diğer ise sadece rapor almak için kullanacağımız diğer scada programı olabilir. Çift çekirdekli bir bilgisayarda rapor için çalışan scada programının cpu kullanımı asıl scada programımızı etkilemeyecektir.

Not: İleri seviye kullanıcı değilseniz veya scada projeniz büyük bir proje değilse database’e kaydedilmesini istediğimiz tag’ları periodically olarak seçelim. Böylece yukarıda yazdığımız komplike sorgular yerine daha basit sorgular ile rapor oluşturabiliriz. Projemiz büyük olmayacağından dolayı her hangi bir yavaşlık olmayacaktır. Periodically seçtiğimizde kontrol panelinden kayıt periyotunu mümkün olan en uzun aralığı da seçmeyi unutmayın. WinTr scada milisaniye bazında kayıt işlemi yapabilir. Bu işlemler tamamen bilgisayar performansınız ile alakalıdır.

Leave a Reply

Translate »