8 Şubat 2017 Çarşamba

DevExpress GridView Sık Kullanılan Olay, Özellik veya Yaşanılan Sorunlar -3 (EditForm- birbirine bağlı 2 lookupedit örneği)

  Devexpress'te GridView'in güzel özellliklerinden olan Express EditForm özelliği açıldığında bazı olaylar normal inplace edit işlemine göre farklı olabilmektedir.

Bu örneğimizde bir adres bilgisi yazıyoruz ve gridin bir hücresinde ülkeler lookupedit'i var diğer hücrede ise şehirler için bir lookupedit var. Eğer inplace edit işlemi kullanıyor isek  ülkeler lookupedit'in  EditValueChanged  özelliğinde  şehirler lookupedit'inin  datasource'unu  null olarak atarız.  Kullanıcı  şehirler sütununa focus olduğu sırada   gridview'ın  ShownEditor   methodu devreye girer ve bu method içinde seçilmiş ülke bilgisine göre  şehir bilgisini datasource olarak buradaki lookupedit'imize atarız. Ancak  EditMode  özelliğimiz   EditForm  olarak atanmış ise  ShownEditor veya grid sütununa atanmış columnedit'in  EditValueChanged methodları  tetiklenmez.. Bu durumu çözebilmek için  EditFormPrepared  olayında  bir  lookupedit'lere  kendimiz method ekleyeceğiz.  Burada methodlar daha önceden eklenmişse diye önce methodu  -=  ile kaldırıp sonra  +=  ile ekliyoruz.

Aslında işlem normal inplaceden çok faklı değil. Sadece ilgili editorlerin olaylarını EditForm hazırlanırken ekliyoruz.
  Burada normal lookupedit objelerimizden farklı olarak 2 adet lookupedit tanımluyoruz.
 EditFormPrepared methodunda  ülke sütununa ait olan edit objesini  _countryLookUp objemize  atıyoruz,
 şehirler sütununa ait olan lookupedit objesini ise _cityLookUp  objesine atıyoruz.  Eğer atama başarılı ve objeler null değil ise ,  contry lookup'a Leave olayını,  city lookup'ına  Enter olayını ekliyoruz.  Önce çıkarıp sonra ekleme yapmamızın sebebi bir sonraki seferde Editform açıldığında olay zaten ekli ise hata vermesin diye yapılmaktadır.

contry lookup  Leave olayında yani country  lookup'ından değer seçilip fokus başka kontrole kaydığı zaman, , contry looku'ı terkedildiğinde,  şehirler lookup'ını boşaltıryoruz.  (datasource=null)

citylookup'ı aktifleştirildiği, kullanıcı  city editörüne tıkladığında ise seçilmiş  ülkeyi ilgili sütundaki bilgiyi okuyarak öğreniyoruz ve şehirler lookup'ını buna göre filtreleyen methodu çağırıp bunu lookup'a datasource olarak atıyoruz.

  

DevExpress GridView Sık Kullanılan Olay, Özellik veya Yaşanılan Sorunlar -2 (EditForm- Açma,Validasyon,Güncelleme)

  Devexpress'te GridView'in güzel özellliklerinden olan Express EditForm özelliği açıldığında bazı olaylar normal inplace edit işlemine göre farklı olabilmektedir.  Burada editform ilk açılınca yapacaklarımız, editform kaydedilmeden önce ve kayıt işlemi için hangi olayları kullandığımızdan bahsedeceğiz.
1. resimde hangi olayın ne iş için kullanıldığına dair açıklama metodun hemen üstünde yazılmıştır, örnekleri kendinize göre düzenleyebilirsiniz.

   
        Resim 1 :  EditForm ilk açılış ayarları.

   Resim 2 -  EditForm Validasyon ve kayıt işlemi

DevExpress GridView Sık Kullanılan Olay, Özellik veya Yaşanılan Sorunlar -1 (EditForm- ButtonEdit-Click Çalışmıyor)

  Eğer GridView'in özelliklerinden OptionBehavior >>  EditingMode >> (EditFormInPlace, EditForm veya EditFormInplaceHideCurrentRow seçeneklerinden biri seçerek,
düzenleme işlemini EditForm üzerinde yaptırıyorsak. Grid  sütunlarına eklediğimiz ButtonEdit vb click olayı çalışmaz. Grid satırlarına double click yapılınca EditForm açıldığı için bu buttonedit'lerin (örneğin silme veya seçme için kullanılan) click olayları çalışmayacaktır.

Bu durumu çözmek için;

 1- Buttonlara tıklanınca yapılmasını istedğimiz işlemi bir methodun içene taşırız. örneğin  OnClickSilButton() diyelim
 2- GridView'ın MouseUp eventından  hangi buttona tıklandığını yakalayarak ilgili method'u çağırırız.

   

 

27 Ocak 2017 Cuma

Tam teşekküllü yedekleme script'i (lokal, rar, full, usb, bulut)

Merhaba,

.bat dosya'yı Zamanlanmış görevler ile çalıştırarak yedekleme işimizi günde birkaç kere olmak üzere otomatikleştirebiliriz. Böylece emek verdiğimiz işleri kaybetme riskimizi azaltmış oluruz.

Daha önce yayınlamış olduğum yedekleme scriptinin düzenlenmiş ve geliştirilmiş halidir.

Düzeltme ve Eklemeler :

1- SQL YEDEKLEME: Daha önce sql yedeğini alan script devamlı aynı dosyaya aldığı için dosya zamanla büyüyor ve yedek boyutu da artıyordu. Burada
sql yedekleme dosyasını rar'layıp, kopyaladıktan sonra siliyoruz.

2- RAR YEDEKLEME:
Rarlama şifremizi parametre olarak veriyoruz.

3- BULUT YEDEKLEME:
Lokal diskimize rar'ladıktan sonra bu rar dosyayı onedrive klasörümüze kopyalıyoruz. (Ya da diğer bir bulut disk klasörümüze)
Buradaki klasör bizim bulut diskimizin lokal kopyası buraya attığımız dosya ayarlar farklı değilse otomatik buluta senkronize olacaktır.
Dosya yolunu kendi bulut disk klasörünüz olarak değiştirebilirsiniz genelde user profilinde oluyor...
Hata olmasın diye burada yazılan klasör yolu kontrol ediliyor. Varsa kopyalanıyor...

4- USB YEDEKLEME:
Bilgisayarımıza taktığımızda hangi sürücü harfini aldığını bildiğimiz bir USB diskimiz var ise, diyelimki L: harfi olsun
scriptin yanlışlıkla aynı harfte olabilecek başka bir diske kopyalama yapmaması için disk üzerinde L:\ProjeYedek\check.txt isminde bir
klasör ve dosya oluşturalım. Script bu dosya varlığını kontrol edecek ve ona göre buraya oluşmuş olan rar dosyasını kopyalayacaktır. Yoksa hata
vermeden devam edecektir.

5- ROBOCOPY YEDEK: belirlemiş olduğumuz yedeklenecek klasörümüzün, hedef yerel diskimize (yerel disk harfine map edilmiş bulutta olabilir) Full
yedek olarak tek tek kopyalanması işlemi. Burada kullanılan robocopy parametreleri ile hedef diskteki dosyalar ile kaynaktakiler senkron edilir.
değişenler kopyalanır. kaynakta silinmiş olanlar hedefte de silinir!... Bu parametreler sizin ihtiyacınıza göre değiştirilebilir.Hatta hedefte
tarihe göre bir klasör oluşturup o günün yedeği olur. Her güne ait bir yedek disk boyutunuza bağlı olarak daha güzel olacaktır.

Senaryo:

Çalışma alanım : c:\projelerim
Yedekleme Alanlarım:
SQL geçici yedekleme klasörü : c:\projelerim\_db_yedek\
Rar lokal yedekleme klasörü z:\yedeklerim\RAR_YEDEK
Rar bulut kopyası : C:\Users\%username%\OneDrive\OneDriveProjeFolder
Varsayılan USB klasörü L:\ProjeYedek\ kontrol mekanizması olarak, bunun içinde bir adet check.txt isminde dosya olmalı...
Robocopy Full yedekleme klasörü z:\yedeklerim\FULL_YEDEK



ve scriptimiz :



@ECHO OFF

set tarih=%date: =%
set tarih=%tarih:.=_%
echo %tarih%
ECHO backingup db...

sqlcmd -E -S .\sqlexpress -q "exit(BACKUP DATABASE [PROJEDB] TO DISK = N'c:\projelerim\_db_yedek\ProjeDB_%tarih%.bak' WITH DESCRIPTION = N'ProjeDB Full Backup', RETAINDAYS = 31, NOFORMAT, NOINIT, MEDIANAME = N'RSTBCKFULL', NAME = N'ProjeDB-Full Database Backup', NOSKIP, NOREWIND, NOUNLOAD, STATS = 10)"

ECHO archiving files...
set password=K@mplexP@ssw0rd4Cloud

C:\PROGRA~1\WinRAR\rar a -r -x*.bat -x*.exe -x*.mdf -x*.ldf -hp%password% -m5 Z:\yedeklerim\RAR_YEDEK\yedeklerim_%tarih%.rar C:\projelerim\*.*

if EXIST C:\Users\%username%\OneDrive\OneDriveProjeFolder (
ECHO coppying to onedrive
robocopy.exe Z:\yedeklerim\RAR_YEDEK C:\Users\%username%\OneDrive\OneDriveProjeFolder yedeklerim_%tarih%.rar /DCOPY:T /NP /R:0 /COPY:DAT /LOG:c:\OneDrive_yedekleme_Log_%tarih%.txt
)


IF EXIST L:\ProjeYedek\check.txt (
echo USB Exists coppying to I:\P\....

robocopy.exe Z:\yedeklerim\RAR_YEDEK L:\ProjeYedek yedeklerim_%tarih%.rar /DCOPY:T /NP /R:0 /COPY:DAT /LOG:c:\USB_Yedekleme_Log_%tarih%.txt

) ELSE (
echo usb is not detected.. skip usb backup
)


ECHO Copying files to backup location...
robocopy.exe "c:\projelerim" "Z:\yedeklerim\FULL_YEDEK" /CREATE /E /DCOPY:T /NP /R:0 /COPY:DAT /LOG+:c:\robocopy_yedek_log_%tarih%.txt /XF "*.exe" "*.mdf" "*.ldf"
robocopy.exe "c:\projelerim" "Z:\yedeklerim\FULL_YEDEK" /MIR /DCOPY:T /NP /R:0 /COPY:DAT /LOG+:c:\robocopy_yedek_log_%tarih%.txt /XF "*.exe" "*.mdf" "*.ldf"

if exist c:\projelerim\_db_yedek\ProjeDB_%tarih%.bak (
echo deleting db backup from source...
del c:\projelerim\_db_yedek\ProjeDB_%tarih%.bak
)

ECHO Finished..

SQL ile C# 'a kod oluşturma -2 (Tembellik SQL'i )


Merhaba,

Diyelim ki;
Veritabanımdaki tüm tablolarımda aşağıdaki anlamda alanlarım var.


* durum ( 0 ise pasif, 1 ise aktif, 2 aktif ama görülmez,listelenmez, 3 ise silindi olacak.. )
* oluşturma zamanı
* oluşturan kullanıcı
* güncelleme zamanı
* güncelleyen kullanıcı
* silme zamanı
* silen kullanıcı


Projemde LINQ kullanıyorum ve bu alanları eklemek kodda ilerledikten sonradan aklıma geldi.
Tüm LINQ CRUD methodlarını bulup bu alanları eklemek zahmetli olacağından, LINQ Datacontext classına
aşağıdaki gibi insert, update, delete override methodlarını yazarak bu işi halledeceğiz...

Ancak burada da tembellik damarı bastırdı, tüm tablolar için bunları tekrar kopyala ismini değiştir kim uğraşacak en iyisi
SQL veya Excel kullanarak tablo isimlerine göre bu kodu çoklamak.
Burada ben T-SQL cursor kullanarak yukardaki alanların geçtiği tüm tablo isimlerine göre bu kod bloğunu çoklattım.


SQL Management studio'da sonucu grid olarak gösterirsek satır sonu ifadeleri çalışmıyor tüm kod tek satır halinde oluşuyor.
Text kısmında göster dersek sonuç olarak ortaya çıkan metin uzun olduğundan burada anlamsız bir şekikde eksik gözüküyor.
O yüzden sql'i run etmeden önce File (Dosyada görüntüle) yi seçeceğiz..

Çoklamak istediğimiz kod bloğu (sadece bir tablo için ) şu şekilde :


partial class DatabaseContext
{

#region "TABLO_ABC"

partial void UpdateTABLO_ABC(TABLO_ABC instance)
{

instance.DATE_UPDATED = System.DateTime.Now;
instance.USER_UPDATED = Global.Instance.UserId;
this.ExecuteDynamicUpdate(instance);
}

partial void InsertTABLO_ABC(TABLO_ABC instance)
{
instance.DATE_CREATED = System.DateTime.Now;
instance.USER_CREATED = Global.Instance.UserId;
instance.STATUS = 1; // yeni eklenen kayıtlarda durumu 1 yapıyoruz...
this.ExecuteDynamicInsert(instance);
}

partial void DeleteTABLO_ABC(TABLO_ABC instance)
{
instance.DATE_DELETED = System.DateTime.Now;
instance.USER_DELETED = Global.Instance.UserId;
instance.STATUS = 3; //silme işlemi gerçekleştirilmek istenince durum=3 yapıp biz update yönlendiriyoruz.
//ekranda sadece durum=1 ler geldiğinden kullanıcı bu satırı görmüyor..
this.ExecuteDynamicUpdate(instance);
}

#endregion

}



Bu override methodlarımızı, LINQ'te veritabanı şemasını oluşturduğumuzda ekrana ayrı tabda açılan .cs uzantılı boş override DatabaseContext class'ına yazacağız. Daha sonraki veritabanı şema düzenlemeleri bu dosyadaki eklenti-override metodlarımızı silmiyor..

Bizim tüm tablolar için çoklamak istediğimiz kısım #region #endregion kısmı

Burda dinamik olarak bu metni tüm tablolar için güncellemek için sadece yapmamız gereken tablo isimlerini depiştirmek. Çünkü diğer kodların
hepsi tüm tablolar için aynı olacak. Bu yüzden T-SQL de, bu kod bloğunu tablo isimlerinin yerine yazarak nvarchar(MAX) tipinde
@SQL değişkenine atıyoruz.

Sonra içinde yukarıdaki sütunlardan birisi geçen tüm tablolarımızın isimlerini declare cursor ile select ediyoruz.
Her cursor döngüsünde bu @SQL değişkenindeki ifadesini cursor'ün sıradaki satırındaki tablo ismi ifadesi ile değiştirip sonucu
nvarchar(MAX) tipindeki @tmp değişkenine atıyoruz.
Sonrada bu değeri print ile dosyaya yazdırıyoruz...

Oluşan dosyayı .txt uzantısı ile kaydederseniz içeriğini kopyalayıp .cs dosyasına yapıştırabilirsiniz.

Yardımcı T-SQL bloğumuz..... :



/* çalıştırmadan önce sonucun dosyada gösterilmesi için yukarıdan Result to File (CTRL + SHIFT + F) seçiniz.. */

-- bazı tabloları istisna ederek içinde USER_DELETED sütunu geçen tüm tabloları cursor'e select ediyoruz..
declare c Cursor for select name
from sys.tables t where type='U'
and exists(select column_id from sys.columns where object_id=OBJECT_ID(t.name,'U')
and name='USER_DELETED')
and t.name not in ('_tmp','sysdiagrams','ISTISNA_TABLO','PARAM_TABLO')

open c

-- değişken tanımları
declare @newLine AS CHAR(2) = CHAR(13) + CHAR(10)
declare @table nvarchar(30)
declare @SQL nvarchar(MAX)
declare @tmp nvarchar(MAX)

-- başına ve sonuna ' koyarak tablo ismi olarak değiştirilmiş kod bloğumuzu @SQL değişkenine atıyoruz..
set @SQL='
#region ""

partial void Update( instance)
{

instance.DATE_UPDATED = System.DateTime.Now;
instance.USER_UPDATED = Global.Instance.UserId;
this.ExecuteDynamicUpdate(instance);
}

partial void Insert( instance)
{
instance.DATE_CREATED = System.DateTime.Now;
instance.USER_CREATED = Global.Instance.UserId;
instance.STATUS = 1; // yeni eklenen kayıtlarda durumu 1 yapıyoruz...
this.ExecuteDynamicInsert(instance);
}

partial void Delete( instance)
{
instance.DATE_DELETED = System.DateTime.Now;
instance.USER_DELETED = Global.Instance.UserId;
instance.STATUS = 3; //silme işlemi gerçekleştirilmek istenince durum=3 yapıp biz update yönlendiriyoruz.
//ekranda sadece durum=1 ler geldiğinden kullanıcı bu satırı görmüyor..
this.ExecuteDynamicUpdate(instance);
}

#endregion

}

'
-- ile tablo ismini al..
fetch from c into @table
while @@FETCH_STATUS!=-1
begin
-- ifadelerini cursorün sıradaki tablo ismi ile değiştir..
set @tmp=REPLACE(@SQL,'',@table)

-- sonucu dosyaya yazdır
print @tmp

--gerekmeyebilir.. bir satırsonu eklemek içi
print @newLine

-- cursor'ü ilerlet... >>>
fetch from c into @table
end


-- kapat yoket...
close c
deallocate c

/*
sql'i çalıştırınca ekrana gelen kaydet kısmında dosya tipi tüm dosyalar dosya ismi sonuc.txt yapabilirsiniz..
dosya içeriğini alıp .cs dosyanıza yapıştırın..
*/




13 Ocak 2017 Cuma

Kolay SQL Server ve dosya yedekleme mekanizması


Merhaba,

Uzun süredir üzerinde çalıştığınız projeniz bilgisayarınızdaki sorun yüzünden erişilemez mi oldu,
ah keşke yedeklemeye önem verseydim mi diyorsunuz.
İşte size  herhangi bir program kurmadan kolayca oluşturabileceğiniz bir yedekleme mekanizması.

diyelim ki
proje dosyalarımız  c:\projelerim  klasöründe
ve  veri tabanı olarakta  MS SQL kullanıyoruz ve ProjeDB adında bir veritabanımız var.

yedeklerimizi   Z:\yedeklerim  isimli bir klasöre alacağız.

Z: diski  bulut bir depolamadan veya varsa bir sunucu alanından bir yer olursa çok daha güzel olur. böylece bilgisayar
tamamen erişilemez olursa yedeklerimiz uzakta olmuş olur.

* şimdi biz önce veritabanı yedeğini  c:\projelerim\_db_yedek  isimli bir klasöre aldıracağız (bu yoksa oluşturun)
* sonra c:\projelerim  klasörünün  tüm içeriğini rar.exe ile şifleri olarak  z:\yedeklerim klasörüne yazacağız.

eğer rar.exe (winrar kurulu ise sistemde winrar klasöründe bulunur.) kullanmak istemiyorsak,
diğer bir yöntem ise  windows'un  robocopy.exe programını kullanarak  tüm c:\projelerimin içeriğini  z:\yedeklerim'e
mirrorlayacağız. yedeklerimizin logunu c:\ klasörüne yazacağız.


1. yöntem : rar.exe kullanarak:
aşağıdaki metni   bir  text dosyaya kopyalayıp yedekle.bat olarak kaydedelim.
-hp parametresi  h=hidden=dosyaların isimlerini gizle
                 p=password=şifre hemen yanında yazan 12345 ise rar dosyasına verdiğimiz şifre
Siz bunu istediğiniz şifreyle değiştirin.
-m5 parametresi en yüksek sıkıştırma seviyesinde sıkıştırması için
-x ler yanlarına konulan dosyaları wilcardları klasörleri  rar dosyasına atmaz (exclude eder)

-----------------------------------------------------------------------------

@ECHO OFF

set tarih=%date: =%
set tarih=%tarih:.=_%
echo %tarih%
ECHO  db yedekleniyor....

sqlcmd -E -S .\sqlexpress -q "exit(BACKUP DATABASE ProjeDB TO Disk='c:\projelerim\_db_yedek\ProjeDB.bak')"

ECHO dosyalar yedekleme lokasyonunda arşiv dosyasına (yedeklerim***.rar) yazılıyor...

C:\PROGRA~1\WinRAR\rar  a -r -x*.bat -x*.exe -x*.mdf -x*.ldf  -hp12345 -m5 Z:\yedeklerim\yedeklerim_%tarih%.rar  C:\projelerim\*.*

ECHO Bitti. 

-----------------------------------------------------------------------

2. yöntem : robocopy.exe kullanarak:
aşağıdaki metni  bir  text dosyaya kopyalayıp yedekle.bat olarak kaydedelim.
burada 2 kere robocopy çalıştırılma sebebi ilkinde klasör yapısı olduğu gibi karşıya boş dosyalar olarak
oluşturuluyor (parçalanma=defragmantasyonu engellemek için)
2nci robocopy ise kopyalama işlemini yapıyor.

--------------------------------------------------------

@ECHO OFF

set tarih=%date: =%
set tarih=%tarih:.=_%
echo %tarih%
ECHO db yedekleniyor....


sqlcmd -E -S .\sqlexpress -q "exit(BACKUP DATABASE ProjeDB TO Disk='c:\projelerim\_db_yedek\ProjeDB.bak')"

ECHO dosyalar yedek lokasyonuna kopyalanıyor...

robocopy.exe "c:\projelerim" "Z:\yedeklerim" /CREATE /E /DCOPY:T /NP /R:0 /COPY:DAT /LOG+:c:\yedekleme_log_%tarih%.txt /XF "*.exe" "*.mdf" "*.ldf"
robocopy.exe "c:\projelerim" "z:\yedeklerim" /MIR /DCOPY:T /NP /R:0 /COPY:DAT /LOG+:C:\yedekleme_log_%tarih%.txt /XF "*.exe" "*.mdf" "*.ldf"

ECHO Bitti.



-----------------------


komutlardaki sqlcm  komutu komut satırında sql'e bağlanıp query çalıştırmak için kullanılmaktadır.
burada  bağlı olan kullanıcı yetkisi ile trusted olarak eriştiği için -E komutu ile girdik.
yoksa -U ve -P parametreleri ile kullanıcı şifre belirtmek gerekiyordu.
ayrıca yedekleme query bloğunu  exit()  içine alarak işlemden sonra sqlcm'den çıkıp sıradaki robocopy komutuna gelebilsin
diye...



daha sonra  windows  Görev Zamanlayıcısına (Task Scheduler) bu yedekle.bat dosyasını belirli sürelerde çalıştırması için bir Görev ekleyebiliriz.


Kolay gelsin....

Bu blog kaydının yeni/güncellenmiş  versiyonu için tıklayınız...


7 Ocak 2017 Cumartesi

5 Ocak 2017 Perşembe

Sql kullanarak yazılım işimizi hızlandırmak

Merhaba,

Kod yazarken bize angarya olarak gelen şeyleri sql kullanarak
nasıl oluşturabileceğimizden bahsedeceğim. Buradaki örneklerden yola çıkarak benzer işlerimizi kolaylaştırabiliriz.
Aynı işlemi excel ile de yapabiliriz, önemli olan elindeki aracı işini kolaylaştırmak için nasıl kullanacağını bilmektir.

Veritabanında tblFirmalar diye bir tablomuz var. Ve biz bu tabloya ait bir Class yazıyoruz.
Tüm sütunları birer property olarak tek tek yaz tip değişkenini ayarla gibi uzun zahmetli işlerle uğraşma yerine
hazırda beklettiğiniz aşağıdaki sqlin sadece tablo adı kısmını değiştirip tüm tablolalarınız için bu işlemi uygulayabilirsiniz.
ben sadece int, string, bool ve datetime için c# karşılığını yazdım
başka bir sütun tipiniz varsa bunu when x then tip kısmında ayarlamanız gerekiyor.
buradaki veritabanı tiplerinin sayısal değerlerini
select * from sys.columns where object_id= OBJECT_ID('tblFirmalar','U')
yazdığımızda system_type_id sütununda görebiliriz.

şimdi
public int ID {get;set;}
gibi tüm sütunlar için bunu oluşturan sorguyu yazalım.

select
'public ' +
case system_type_id
when 56 then 'int'
when 231 then 'string'
when 61 then 'DateTime'
when 104 then 'bool'
else 'string'
end
+ ' ' + REPLACE(name,' ','_') + ' { get; set; } '
from sys.columns where object_id= OBJECT_ID('tblFirmalar','U')


sonra kodumuzda bir yerde bu objeden f isimli bir instace oluşturup bunun propertylerini
o sıra oluşmuş olan datarow (dr) dan doldurmduğumuz durumunda tüm sütunlar için tek tek
bunun gibi yazmamız gerekiyor.
f.ID=Convert.ToInt32(dr["ID"]);

Bu işlemi bizim için yapan sorgumuz da şöyle olacak:


select
' f.' + REPLACE(name,' ','_') + ' = ' +
case system_type_id
when 56 then ' Convert.ToInt32'
when 231 then 'Convert.ToString'
when 61 then 'Convert.ToDateTime'
when 104 then 'Convert.ToBoolean'
else 'Convert.ToString'
end
+ '(dr[' + char(34) + REPLACE(name,' ','_') + char(34) + ']);'
from sys.columns where object_id= OBJECT_ID('tblFirmalar','U')


7 Aralık 2016 Çarşamba

22 Kasım 2016 Salı

9 Eylül 2015 Çarşamba

Ağ Cihazları Konfigürasyon Kontrol Listesi Excel Uygulaması

   Merhaba.

   Bir çok ağ cihazınız var ve bunların konfigürasyonlarının belirli bir temel konfigürasyonda olup olmadığını kontrol etmek istiyorsunuz. Bunun için export edilmiş konfigürasyon dosyaları üzerinden sizin belirlediğiniz temel komutların olup olmadığını kontrol edip raporlayan bir excel uygulaması paylaşılmıştır.

Buradaki örnekte kullanılan konfigürasyon dosyaları hp ağ cihazları içindir. Ancak kullanılan konfigürasyon kontrol listesi mantığı cihazdan bağımsızdır. Hatta modifiye ederek veya etmeyerek farklı alanlar içinde kullanılabilir.

- Farklı tarihlerde  export edilmiş konfigürasyonlardan sadece tarihi en son olanı  dikakte alır.

- checks.txt dosyasında, her bir satırda bir komut olacak şekilde, konfigürasyonlarda olması istenen komut ifadelerinin bir kısmı yazılır ve uygulama  export edilmiş konfigürasyon dosyalarından en son tarihli olanında bu ifadelerin varlığına bakarak bunları  excel arayüzünde renkli olarak gösterir.

 -checks.txt dosyasındaki komutları üst sütuna sıra ile yazar, konfigürasyonu olan cihazların hostname bilgilerini, ip adreslerini ilk sütunlarda  her bir satıra bir cihaz gelecek şekilde yerleştirir.
eğer chesks.txt dosyasındaki komut cihazın konfigürasyonunda yoksa  cihaz-komut kesişim hücresine kırmızı arkaplan ve ! işareti koyar. komut varsa yeşil arka plan ve "OK" yazar.
Tüm komutlar tüm cihaz konfigürasyonlarında aranıp işlem bitince tüm eksik olan komutların kolay görüntülenmesi için ayrı bir sayfada bunları listeler.

Excel Uygulama ve Örnek Konfig Exportlar

16 Haziran 2015 Salı

Vbscript ile dizinler içinde dosya varlık kontolü- örnek arşivleme klasörlerinde eksik olan günü bulma


  Bir arşivleme programı  veritabanından hergün o güne ait verileri   yilaygün.arsiv.zip  isimlendirme formatında    \yıl\ay\   formatında klasör yapısında diske yazmaktadır.

Ancak yıllar içinde bazı günler  çalışmamış ise eksik arşivler bulunabilir.

Bu kadar klasör içinde hangi günün arşivi eksik bulmak için bir vbscript paylaşılacaktır.


dosyalar  D:\Arsivleme\  klasöründe   her yıla ait bir klasör ve her yıl klasöründe her aya ait bir klasör ve her ay klasöründe   hergüne ait   yilaygün.Arsiv.zip  formatında o günün arşivi depolanmaktadır.

Örnek olarak;

    16 haziran 2015 gününün arşivi

    D:\Arsivleme\2015\6\20150616.Arsiv.zip    

şeklinde  saklanmaktadır.

Mevcut durumda   21.12.2012 gününe ait arşiv de başlanarak bugünün tarihine kadar kontrol yapılacaktır.  başlama ve bitiş script içinden ayarlanabilir.




dim yil
dim ay
dim gun
dim s_ay
dim s_gun
dim Afile



Set oShell = CreateObject("WScript.Shell")
Set ofso = CreateObject("Scripting.FileSystemObject")
fld = oFSO.GetParentFolderName(Wscript.ScriptFullName)


Set objFile = oFSO.CreateTextFile(fld & "\log.txt")

set objFile = nothing
set objFolder = nothing
' OpenTextFile Method needs a Const value
' ForAppending = 8 ForReading = 1, ForWriting = 2
Const ForAppending = 8
Const  ForWriting=2

Set objTextFile = oFSO.OpenTextFile (fld & "\log.txt", ForWriting,True)


' aramanın başlayacağı tarih: klasör
yil=2012
ay=12
gun=21


do while 1=1

'20121221.Events


if ay<10 then
   s_ay="0" & ay
 else
   s_ay=ay
end if

if gun<10 then
  s_gun="0" & gun
 else
   s_gun=gun
end if



''    20150601.Arsiv.zip  
Afile= yil & s_ay & s_gun & ".Arsiv.zip"




pth="D:\Arsivleme\" & yil  & "\" & ay & "\" & Afile

If Not oFSO.FileExists(pth) Then


   objTextFile.WriteLine(AFile)

End if

gun=gun+1
dt=ay  & "/" & gun & "/" & yil

if not isdate(dt) then

  gun=1
  ay=ay+1
  if ay>12 then
    ay=1
    yil=yil+1
  end if

end if



 dt=ay  & "/" & gun & "/" & yil


  ' debug için
 ' if yil=2015 and ay=4 then

 '     msgbox day(dt) & " " & month(dt)  & " " & year(dt)
 ' end if
 

   ' aramanın biteceği gün : bugün istenirse burada farklı bir gün ay yıl verilebilir..
  if (day(dt)=day(now) and month(dt)=month(now) and year(dt)=year(now)) then
    msgbox "Kontrol bitti. Log.txt dosyasina bakiniz."
    exit do
   end if



loop


objTextFile.Close

set objFile = nothing
set objFolder = nothing
set oFSO=nothing

T-SQL string dizisi olarak gönderilen değerleri prosedür ile işleme örneği

Merhaba,

T-SQL'de yeni 2012 öncesi versiyonlarda dizi değişkeni olmadığı için pratik olarak dizi değişkenlerini işleyip verileri tablolara işleme işlemi mümkün değildi. (2012,2014'de var mı bilmiyorum)

Bu konuda 2009 yıllarında yazdığım ve ancak buraya not etmek fırsatı bulduğum bir T-sql  ile dizi işleme örneği göstereceğim.  Örnek uygulamamız anket tablosu olacak. Ancak uygulamanın sadece T-SQL tarafı  gelen string diziyi anket tablosuna yazan kısmını buraya yazacağım, .net vb uygulama tarafında bu diziler nasıl oluşturulur kısmına burada değinmeyeceğim.


uygulama tabloları : tblANKET  her bir anket değerlendiricisi için bir kayıt tutan ve anketin idsini içeren tablo.

tblANKET_DETAY : her bir anket kullanıcısının sorulara verdiği 5li seçenekleri tutan tablo.

Soruların olduğu tablo konumuz dışında olduğu için burada önemli değil.


aşağıda vereceğim  spAnketKaydet  prosedürüne   3 adet parametre gönderilecek.

1.parametre anketin  o sıradaki kullanıcıya aid olan idsi.
2. parametre soruların idlerinin virgülle ayrılmış string dizisi.
3. parametre sorulara verilen cevap seçeneklerinin (1-5 arası) virgülle ayrılmış string dizisi.

bu değerler uygulama tarafından  oluşturulup bu sp ye gönderilirse, bu prosedür tüm seçenekleri ilgili sorulara kaydedecektir.

Prosedür:


CREATE proc [dbo].[spAnketKaydet](@pid int,@soruidler varchar(200),@secenekler varchar(200))
as
begin
/*

örnek kullanım :
exec spAnketKaydet 17747, '2,3,4,5','3,3,4,5'


tlbANKET tablosundaki  17747 idli anket için;
  2idli soruya 3üncü seçenek
  3idli soruya 3üncü seçenek
  4idli soruya 4üncü seçenek
  5idli soruya 5inci seçenek

*/

declare @s varchar(5)

select @s=AnketUserID from tblAnket where ID=@pid


declare @soruid int
declare @secenek int


declare @Vk int
declare @Pk int
declare @Vs int
declare @Ps int
set @Pk=1
set @Ps=1

declare @cik int
set @cik=0



SET XACT_ABORT OFF --ya hep ya hiç


BEGIN TRY

  BEGIN TRAN

while(@cik=0)
begin

-- soruidler dizisinde virgül pozisyonu
set @Vk= charindex(',',@soruidler,@Pk)
if @Vk=0  --dizinin son elemanına gelinince...
 begin
  --select @Pk-1,len(@soruidler) as fff
  set  @soruid=Convert(int,substring(@soruidler,@Pk,(len(@soruidler)-@Pk+1)))
  set @cik=1
 end
  else                  
  begin  --  pk'dan virgül pozisyonuna kadar olan kısmı (dizi elemanı) al sorna pkyi bunun boyu kadar artır..
    set  @soruid=Convert(int,substring(@soruidler,@Pk,@Vk-@Pk))
  end
set @Pk=@Vk+1


--yukardakin aynı mantıkla secenekler dizisinini de tek tek okuyoruz..

set @Vs= charindex(',',@secenekler,@Ps)
if @Vs=0
 begin
  set  @secenek=Convert(int,substring(@secenekler,@Ps,(len(@secenekler)-@Ps+1)))
 end
  else
  begin
    set  @secenek=Convert(int,substring(@secenekler,@Ps,@Vs-@Ps))
  end
set @Ps=@Vs+1

--select @soruid,@secenek


if  @secenek>0
 begin
if exists(select * from tblANKET_DETAY where SORUID=@soruid and ANKETID=@pid)  --anketin ilgili sorusuna ait seçenek zaten kayıtlı ise güncelle..
 begin
    update tblANKET_DETAY
     set SECENEK=@secenek
     where ANKETID=@pid and SORUID=@soruid
 end
 else
 begin   --değilse yeni ekle..
    insert into tblANKET_DETAY
    (ANKETID,SORUID,SECENEK)
    values(@pid,@soruid,@secenek)
 end


  UPDATE tblANKET set KAYITTARIHI=getdate() where ID=@pid

end
   
end --while



 COMMIT

 select 'tamam' as durum
END TRY
BEGIN CATCH
  ROLLBACK
  select 'hata' as durum
declare @msj varchar(MAX)
   set @msj='HATA OLUŞTU : ' + ERROR_MESSAGE()
   select @msj as 'hatamesajı'
END CATCH



END



5 Kasım 2013 Salı

MS SQL Serverdaki bir tabloda bir çok satırı aynı olan tabloda tekilleştirme

MS SQL Serverdaki bir tabloda bir çok satırı aynı olan tabloda tekilleştirme yapmak.
 
Değerleri aynı olan alanlara göre gruplandırıp bunlardan farklı olan ID sütünu (yoksa IDENTITY autoincrement bir sütun oluşturmak lazım)
minimum veya maksimum olanı seçecek şekilde bir iç sorgu yazıyoruz..
 
Select min(ID) as ID, aynisutun1,aynisutun2, aynisutun3,aynisutun4
from tblTABLO group by aynisutun1,aynisutun2, aynisutun3,aynisutun4

 bu sorgu ile aynı olan satırlardan sadece birisi gelir. (IDsi en küçük olan )

sonra bu tabloyu tüm tablo ile join edip birleşmeyenleri (çift kayıtlardan ID'si en küçük olmayanlar) sileriz.
 

DELETE tblTABLO
--- select *      --- test etmekte fayda var.
from tblTABLO
left outer join
(select min(ID) as ID, aynisutun1,aynisutun2, aynisutun3,aynisutun4
 from tblTABLO group by aynisutun1,aynisutun2, aynisutun3,aynisutun4 )
 as KorunacakKayitlar
 on tblTABLO.ID=KorunacakKayitlar.ID
 where KorunacakKayitlar.ID is null

6 Mayıs 2013 Pazartesi

Oracleda blob olarak kayıtlı resimleri topluca jpeg olarak diske yazma


//   Oracle DAC for NET kurulur
  //  Oracle.DataAccess referans olara  eklenir  ve  using Oracle.DataAccess.Client;  eklenir..

  private void button4_Click(object sender, EventArgs e)
        {
            /*
               http://www.codeproject.com/Articles/13365/Insert-retrieve-an-image-into-from-a-blob-field-in
             */

            string oraHost = "ORACLESUNUCU";
            string oraPort = "1521";
            string oraSid = "SERVISADI";
            string oraUsr = "KULLANICIADI";
            string oraPass = "ŞİFRE";
         

            label1.Text = "Bekleyiniz...";
            string OrclConStr="Data Source=TNSTEKISERVISADI;User iD=" + oraUsr + ";Password=" + oraPass;


            string pth = @"D:\RESIM_YOLU";


            string log = pth + "\\log.txt";
            File.WriteAllText(log, DateTime.Now.ToString() + " Oracledan Resim Güncelleme : " + Environment.NewLine);

            int say=0;

             try
            {

            OracleConnection con = new OracleConnection();
         
               
            con.ConnectionString = OrclConStr;
     
            DataSet ds = new DataSet();

               string sql = "select PERSID,FOTOGRAF from tblRESIMLER ";  // where rownum<10 ";
             
                OracleDataAdapter da = new OracleDataAdapter(sql, con);
             
                da.Fill(ds);
         

                DataTable dataTable = ds.Tables[0];

                FileStream FS;
                foreach (DataRow dataRow in dataTable.Rows)
                {
                    string pid = dataRow[0].ToString();
                 
                 
                    string resimyol=pth + @"\" + pid + ".jpg";


                               
                    string txt =pid + " : Resim zaten var yazılmadı." +  Environment.NewLine;

                  if(!File.Exists(resimyol))
                  {
               
                        FS= new FileStream(resimyol, FileMode.Create);
                        byte[] blob = (byte[])dataRow[1];
                        FS.Write(blob, 0, blob.Length);
                     
                        FS.Close();
                        FS = null;

                        txt = pid + " : AKTARILDI." + Environment.NewLine;

                        say++;
                   }
                 
                   File.AppendAllText(log, txt);
             
                }
       
         
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


            label1.Text = "";
       
            MessageBox.Show(say.ToString() + " adet resim dosya olarak aktarıldı. Detay için Log.txt");

        }