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
Etiketler:
dosya var mı,
filesystem,
script,
vbscript
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
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
Kaydol:
Kayıtlar (Atom)