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