Konu: Bir cursor'un oluşturulma tarih ve saatini öğrenmek
Yeniden merhaba,
Oluşturduğum bir cursor'un yaratılma tarihini ve saatini nasıl öğrenebilirim?
ADIR() ile yapamadım.
Teşekkürler
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
fox4um » Veritabanı, Tablo, View, Index ve SQL Syntax » Bir cursor'un oluşturulma tarih ve saatini öğrenmek
Yeniden merhaba,
Oluşturduğum bir cursor'un yaratılma tarihini ve saatini nasıl öğrenebilirim?
ADIR() ile yapamadım.
Teşekkürler
asagidaki gibi bir komutla last modification date i alabilirsin
WAIT WINDOW FDATE(FULLPATH("d:\soykan\mysoftware\depomatik\data03\stok.dbf",1))
bu komulada saatini
WAIT WINDOW FTIME(FULLPATH("d:\soykan\mysoftware\depomatik\data03\stok.dbf",1))
asagidaki kodla da lastupdate tarihini
USE FULLPATH("d:\soykan\mysoftware\depomatik\data03\stok.dbf")
WAIT WINDOW LUPDATE()
Soykan,
Keske o kadar basit olsa:) Yine de zor degil ve N tane yolu var:
API:
Clear
oFileTimes = _GetFileTime(_samples+'data\customer.dbf')
If !oFileTimes.Error
? 'Create:', oFileTimes.createTime, oFileTimes.createMilli
? 'LastAccess:',oFileTimes.lastAccessTime,oFileTimes.lastAccessMilli
? 'Modified:', oFileTimes.modifiedTime, oFileTimes.modifiedMilli
Else
? 'Error'
Endif
Function _GetFileTime
Lparameters tcFile
***************************************
* Declarations
***************************************
Declare SHORT GetFileTime In Win32API;
INTEGER hFile, String @lpftCreation,;
STRING @lpftLastAccess, String @lpftLastWrite
Declare SHORT FileTimeToSystemTime In Win32API;
STRING @lpft, String @lpst
Declare SHORT FileTimeToLocalFileTime In Win32API;
STRING @lpFileTime, String @lpLocalFileTime
Declare Integer CreateFile In Win32API;
STRING @lpFileName, Integer dwDesiredAccess,;
INTEGER dwShareMode, String @lpSecurityAttributes,;
INTEGER dwCreationDistribution, Integer dwFlagsAndAttributes,;
INTEGER hTemplateFile
Declare SHORT CloseHandle In Win32API;
INTEGER hObject
#Define GENERIC_READ 0x80000000
#Define GENERIC_WRITE 0x40000000
#Define FILE_SHARE_READ 0x00000001
#Define FILE_SHARE_WRITE 0x00000002
#Define OPEN_EXISTING 0x00000003
***************************************
* Declarations
***************************************
Local lcCreateTime, lcLastAccessTime, lcModifiedTime, lnMillis
Local oFileTimes
oFileTimes = CreateFileTimesReturnObject()
lnhandle = CreateFile(@tcFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0) && Create handle
If m.lnhandle > 0
Store Replicate(Chr(0), 16) To m.lcCreateTime, m.lcLastAccessTime, m.lcModifiedTime
oFileTimes.Error = (GetFileTime(m.lnhandle, ;
@lcCreateTime, @lcLastAccessTime, @lcModifiedTime) = 0)
=CloseHandle(m.lnhandle) && Close the handle
If !oFileTimes.Error
oFileTimes.createTime = _DecodeFileTime(m.lcCreateTime,@lnMillis)
oFileTimes.createMilli = m.lnMillis
oFileTimes.lastAccessTime = _DecodeFileTime(m.lcLastAccessTime,@lnMillis)
oFileTimes.lastAccessMilli = m.lnMillis
oFileTimes.modifiedTime = _DecodeFileTime(m.lcModifiedTime,@lnMillis)
oFileTimes.modifiedMilli = m.lnMillis
Endif
Else
oFileTimes.Error = .T.
Endif
Return oFileTimes
Endfunc
Function _DecodeFileTime
Lparameters tcFileTime, tnMillis
Local lcLocalTime, lcSysTime, lnresult, ltTime
ltTime = {/:}
Store Replicate(Chr(0), 16) To m.lcLocalTime, m.lcSysTime
If FileTimeToLocalFileTime(@tcFileTime, @lcLocalTime) # 0 And ;
FileTimeToSystemTime(@lcLocalTime, @lcSysTime) # 0
ltTime = Datetime(Str2Val(Substr(m.lcSysTime,1,2)), ;
Str2Val(Substr(m.lcSysTime, 3,2)),;
Str2Val(Substr(m.lcSysTime, 7,2)),;
Str2Val(Substr(m.lcSysTime, 9,2)),;
Str2Val(Substr(m.lcSysTime,11,2)),;
Str2Val(Substr(m.lcSysTime,13,2)) )
tnMillis = Str2Val(Substr(m.lcSysTime,15,2))
Endif
Return m.ltTime
Endfunc
Function Str2Val
Lparameters tcStr
Local lnVal
lnVal = 0
For ix=1 To Len(m.tcStr)
lnVal = m.lnVal + Asc(Substr(m.tcStr,m.ix,1))*256^(m.ix-1)
Endfor
Return m.lnVal
Endfunc
Function CreateFileTimesReturnObject
Local oReturn, lnSelect
If Type('VERSION(5)') = 'N' And Version(5) >= 900
oReturn = Createobject('empty')
AddProperty(oReturn, 'error', .F.)
AddProperty(oReturn, 'createTime')
AddProperty(oReturn, 'createMilli')
AddProperty(oReturn, 'lastAccessTime')
AddProperty(oReturn, 'lastAccessMilli')
AddProperty(oReturn, 'modifiedTime')
AddProperty(oReturn, 'modifiedMilli')
Else
lnSelect = Select()
Create Cursor tmp (Error L,;
createTime L, createMilli L, ;
lastAccessTime L, lastAccessMilli L, ;
modifiedTime L, modifiedMilli L )
Scatter Name oReturn Blank
Use In 'tmp'
Select (m.lnSelect)
Endif
Return oReturn
Endfunc
Bu daha basit ve dosya kullanimda olsa da calisiyor. VFP'yle gelen filer.dll'i kullaniyor (do form home()+'tools\filer\filer.scx' de bunu kullaniyor):
? GetTree(_Samples+'data','*.dbf')
Select ;
cast(filepath As Varchar(250)) As filepath, ;
cast(filename As Varchar(250)) As filename, ;
filesize, fattr, createtime, lastacc, lastwrite ;
From filelist ;
ORDER By 1,2
Function GetTree
Lparameters tcStartDir, tcSkeleton
tcSkeleton = EVL(m.tcSkeleton, "*.*")
Create Cursor filelist ;
(filepath m, filename m, filesize i, ;
fattr c(8), createtime T, lastacc T, lastwrite T)
Create Cursor folderlist (filepath m)
oFiler = Createobject('filer.fileutil')
With oFiler
.SearchPath = m.tcStartDir
.Subfolder = 1
.FileExpression = m.tcSkeleton
.Find(0)
For ix=1 To .Files.Count
With .Files(ix)
Insert Into filelist ;
(filepath, filename, filesize, fattr, createtime, lastacc, lastwrite) ;
values ;
(.Path, .Name, .Size, Attr2Char(.Attr), ;
Num2Time2(.Datetime), Num2Time2(.LastAccessTime), Num2Time2(.LastWriteTime) )
Endwith
Endfor
Return .Files.Count
Endwith
Endfunc
Function Num2Time2
Lparameters tnFloat
Return Dtot(Date(1899,12,30) + m.tnFloat)
Endfunc
Function Attr2Char
Lparameters tnAttr
Return ;
IIF(Bittest(tnAttr,0),'RO','RW')+;
IIF(Bittest(tnAttr,1),'H','_')+;
IIF(Bittest(tnAttr,2),'S','_')+;
IIF(Bittest(tnAttr,4),'D','_')+;
IIF(Bittest(tnAttr,5),'A','_')+;
IIF(Bittest(tnAttr,6),'E','_')+;
IIF(Bittest(tnAttr,7),'N','_')
Endfunc
Benim orneklerim en basiti idi
Seninki basit ama yaratilma zamanini gostermiyor di mi? Ben mi goremedim?
evet gostermiyor Last Modification Date ve Time alinabiliyor yani arkadasin tam aradigina yanit olmadi benim ornek .
Yanıtlar için çok teşekkürler, yine çok şey öğrendim.
Ek bir soru: Yukarıdaki çözümler cursor dosyaları için de geçerli olabilir mi?
Cursor derken? Bildigimiz VFP deki cursor mi? Onu olusturdugun zamani zaten biliyorsun. Hem cursor'un bir dosyasi olacaginin hic garantisi yok.
Doğru bildiğimiz cursor. Aslında haklısınız, cursorun yaratılma tarih ve saatini sormak saçma bir soru oldu. Zaten onu ben oluşturmuşum.:( (İzmir bugün çok sıcaktı da ondan sanırım!)
Bu da saçma bir soru mu bilmem ama sormam gerek. Network ortamında iki ayrı kullanıcı aynı adı olan cursorlar oluşturabilir mi? ya da bunların çakışma olasılığı var mıdır?
Kandilzade;
Oluşturduğun cursor 'un network ile alakası yok. O tamamen senin local bilgisayarındaki bilgisayarın memory sinde oluşuyor. Dolayısı ile o cursorde yaptığın tüm işlemler sadece o işi yapan aktiF programa özel. Yani programını aynı bilgisayarda n kez açabiliyorsan; her bir programın cursor ü diğerlerinden bağımsız.
Not: Eğer büyük boyutlu cursor ler kullanıyorsan, cursor için INDEX/LER oluşturabilir ve sorgu sürelerinde önemli ölçüde kısaltabilirsin.
Ugur'un dedigi gibi cursor networkten bagimsiz. Ister cok kullanici olsun, ister ayni makinede calisan cok sayida VFP olsun cursorler biribirinden bagimsiz. Onlari hafiza degiskenleri gibi dusunebilirsin. Cogu kez ortada yaratilan bir dosya bile yok, oldugunda da dosyalarin gercek adlari senin kullandiklarin degil. Onlarin gercek adlari VFP tarafindan belirlenip kullaniliyor. Ayni zamanda cursorler daima "exclusive" kullanimdadir. Kullanici A ve B ayni anda "Musteriler" diye bir cursor yaratabilir ama ikisi de birbirinden tamamen bagimsiz. Degisken yaratmak gibi dusun, ama en onemli fark, Datasession'larin birinden digerine cursorler gecemez, degiskenler gecer. Ayni VFP icinde, birden fazla session'da ayni cursor yaratilabilir ve hepsi gene bagimsiz.
Izmir hakikaten sicak:) Izmir'de neredesin? Ben Inciralti'ndayim (Turkuaz'in orada Deniz Bilimleri ve Tek. Enstitusu).
Teşekkürler.
İzmir'de ev Bornova'da, iş yeri Manisa'da (Celal Bayar Üniv. Tıp Fak.). Manisa İzmir'e göre 1-2 derece daha sıcak oluyor, kışın da daha soğuk.
Ama haftasonları Ildırı'da (yazlık: deniz, balık ) oluyorum.
Sevgili Çetin,
Ben İzmirde doğup büyüdüm. Sonra hayat rügarları beni oyle bir savurdu ki onlarca yıldır İzmiri görmek nasib olmadı.
Eskiden İnciraltı demek güzel bir plaj demekti. Ama İnciraltından son geçtiğimde çevre öylesine değişmiştiki plajın yerini bile belirleyemedim.
Belki budalaca bir soru olacak ama "İnciraltında hala plaj veya ona benzer birşeyler var mı"
Sen İnciraltı deyince doğrusu gençliğimi çok güzel saatlerini geçirdiğim o İnciraltı plajı aklıma geldi ve merakettim.
Sevgilerimle.
Erdal
Abi senin dedigin yeri ben ancak genclik (hatta cocukluk) yillarimda gorebildim. Simdi ne yazik ki o dogal halleri kalmadi. Yine de belediye buralari imara acmadi. Simdi bu alanda buyuk bir park alani var, bataklik olan bolum okaliptuslarla ve diger agaclarla agaclandirildi. Kafeler, yurume yollari filan yapildi. Hic olmazsa Izmir'linin fuara alternatif yakin mesafede gidebilecegi bir yer oldu. Plaj yok ama alisveris merkezi, park, yurume alanlari var:) Bu zamanda buna sukrediyorum. Simdi denize girilebilen en yakin yer Guzelbahce (Kilisman) dolaylari.
Not:(Eski plajin yeri simdi Inciralti son durak ve onun ilerisindeki yerler). Yolunuz duserse beni arayin:)
Sevgili Çetin,
Cevabın için çok teşekkürler. Bundan 15 sene kadar önce Çeşmeye giderken İnciraltindan geçmiş, o zamanlarda bile gördüğüm manzara karşısında şaşıp kalmıştım. Karşıyaka sahilinin apartmanlarla değil, yalılarla dolu olduğu yılardan sonra İzmiri özellikle Karşıyakayı görünce sanki eskiden güzeller güzeli bir kadının yüzüne asit dökülmüş halini görür gibi olmuştum ve inanılmaz şekilde üzülmüştüm.
Ama sen gene de şanslı sayılırsın çünki kıyısından da olsa o günleri yakalamışsın. Neyse fazla uzatmayayım; çünkü seni de İzmirden soğutabilirim.
Sevgilerimle.
Erdal
Ya siz koskoca İzmir'den bahsediyorsunuz. Ben çocukluğumun Karasu (Sakarya'ya bağlı) sahilini hatırlıyorum sadece çadır ve barakalar olan, içeri 1-2 km giren muhteşem kum sahil bitmiş, şehir olmuş. Resimlerini gördüm geçen gerçekten şoke oldum. 2 sene önce Marmaris Günlücek'e ve Marmaris şehir merkezine götürdüm ailemi yine aynı şok. Çocukluğumun harika günlücek sahili ve bir pansiyon kasabası olan Marmaris'i mahfolmuş. Öylesine bozulmuş ki Günlücek denize girilecek hali yoktu.
Şu an Çıralı (Olimpos), Patara gibi birkaç sahil kaldı. Sanırım 20 yıl sonra onlar da kalmayacak. Belki 10 yıl bile sürmez.
İstanbul'un 40-50 sene önceki resimlerini gördüm. Çok güzel bir şehirmiş. İstanbul aşığı arkadaşlar kusura bakmasın ama İstanbul bitmiş. İstanbul gibisi yok filan diyorlar. Ben topu topu 2 şehir gördüm yurtdışında; Taşkent ve Taipei. İkisi de İstanbul'dan kat kat güzeldi.
Sevgili Arkadaşlar,
Bütün bu yazılan, çizilenlerden sonra anlaşılıyorki "MEDENİYET DEDİĞİN TEK DİŞİ KALMIŞ CANAVAR" gerk maddi, gerekse manevi tüm güzellikleri hızla yiyip bitiriyor.
Ben üniversiteyi, hatta liseyi bitirdiğim zaman geleceğe ümit ve güvenle bakıyordum.
Kızım üniversiteyi bitirdiği zaman onun geleceğine şüphe ve güvensizlikle bakabildim.
Torunumun geleceğini ise kapkara olarak görüyorum.
Allah bizden sonraki kuşaklara acısın.
Sevgilerimle.
Erdal
Ugur'un dedigi gibi cursor networkten bagimsiz. Ister cok kullanici olsun, ister ayni makinede calisan cok sayida VFP olsun cursorler biribirinden bagimsiz. Onlari hafiza degiskenleri gibi dusunebilirsin. Cogu kez ortada yaratilan bir dosya bile yok...
iyi ama o zaman bu kod parçası neden çalışıyor her zaman?
Create Cursor test ( test c(10))
xx=Dbf()
Select 0
Use (xx) Again
Metin , sorunu tam anlayamadım? Verdiğin kod parçasının çalışmaması mı gerekiyor?
Verdiğin örnekte bir çok benzer table oluşturulabilir?
Tam olarak ne demek istedin?
CLOSE TABLES
LOCAL lni, lcCursorName, lcxx
SET
FOR lni = 1 TO 15
m.lcCursorName= "Test"+Padl(Alltrim(Str(m.lni)),2,"0")
? m.lcCursorName
Create Cursor &lcCursorName (test c(10))
m.lcxx=Dbf()
Select 0
Use (m.lcxx) Again
ENDFOR
Çetin'in Cogu kez ortada yaratilan bir dosya bile yok. cümlesine itiraz ettim.
Sorun degil, ilk itiraz eden sen degilsin:) Ne zaman bunu soylesem itiraz eden birisi cikiyor zaten. Ben de her nedense her seferinde ispat etmekle ugrasiyorum. Simdilik sana o kod seni aldatiyor desem inanmazsin:
CLOSE DATABASES ALL
Clear
LOCAL lcFile
SELECT * FROM (_samples+'data\customer') ;
WHERE country = 'USA' ;
INTO CURSOR x1 ;
nofilter
lcFile = DBF('x1')
? m.lcFile, FILE(m.lcFile)
WAIT WINDOW 'Any key to continue'
Handle = FCREATE(m.lcFile)
? m.handle, FERROR()
Handle = FOpen(m.lcFile)
? m.handle, FERROR()
WAIT WINDOW 'Any key to continue'
? STRTOFILE("hello", m.lcFile)
? m.lcFile, FILE(m.lcFile)
WAIT WINDOW 'Any key to continue'
Handle = FOpen(m.lcFile)
? m.handle, FERROR()
? FILETOSTR(m.lcFile)
WAIT WINDOW 'Any key to continue'
SELECT * FROM (m.lcFile)
? DBF('x1'),DBF()
WAIT WINDOW 'Any key to continue'
? FILETOSTR( DBF('x1') ) && ;)
WAIT WINDOW 'Thank you'
Kodu yuruttugum yer foxite:
http://www.foxite.com/archives/0000211644.htm
en başta dbf() fonksiyonunun cursorlerle çalışmasını engelleselermiş böyle tutarsızlıklar olmazmış. kodu inceledim. bazı komutlar aldatmaya devam ediyor, bazıları etmiyor.
Neden cursorler ile calismayacakmis:) O gerekli bir ayrinti. O zaman ortaya NOFILTER tartismasi cikiyor. Foxite.com'a bak son zamanlarda da o tartisma vardi. Okumak istemezsen isin ozeti, Select-SQL'de NOFILTER kullanin.
Bu arada aldatma filan yok, VFP oyle calisiyor.
nofilter'in niye gerektiğini biliyorum. bir select komutu sadece set filter ile yapılabiliyorsa gerçekten select komutu çalıştırmıyor. sadece set filter ile sanal bir select oluşturuyor ve eğer set filter'i etkileyen birşeyler olursa cursor değişebiliyor. böyle bir sakıncası vardı.
ben zaten artık bütün programlarımı sql server'a taşıyorum. yani böyle bir meselem yok diyebilirim. bir de biz de senin gibi paket program geliştirdiğimiz için biz farketmesek bile müşterilerden birkaçı farkediyor hataları.
fox4um » Veritabanı, Tablo, View, Index ve SQL Syntax » Bir cursor'un oluşturulma tarih ve saatini öğrenmek