MainMenu arşivleme arşivden bilgi alma

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

MainMenu arşivleme arşivden bilgi alma

Mesaj gönderen haydarxxx »

Arşivleme işlemi için forum da aradım ama bir şey bulamadım.

Mainmenümde Arşivle>Dönem arşivi al diye bir bölüm var ve dönem arşivi alırken dataların bir kopyasını üretiyorum.

Kod: Tümünü seç

var
a:integer;
b:string;
OpStruc: TSHFileOpStruct; ///shellapi usese ekle
frombuf, tobuf: Array [0..128] of Char;

  begin


b :=form2.QRY_OKULSABIT.fieldbyname('EGITIM_YILI').asstring+'_'+form2.QRY_OKULSABIT.fieldbyname('DONEMI').asstring+' Arşivlemesi yapılacak devam etmek istiyormusunuz.';
a:=application.MessageBox (PChar(b),'Arşiv Uyarı',mb_yesno+mb_iconinformation);

if a=idyes then
begin


  fillChar( OpStruc, Sizeof(OpStruc), 0 );
  FillChar( frombuf, Sizeof(frombuf), 0 );
  FillChar( tobuf, Sizeof(tobuf), 0 );
  StrPCopy( frombuf, 'C:\KursKayıt\Data\*.fdb' );
  StrPCopy( tobuf, 'C:\KursKayıt\Arşiv\'+form2.QRY_OKULSABIT.fieldbyname('EGITIM_YILI').asstring+'_'+form2.QRY_OKULSABIT.fieldbyname('DONEMI').value);
  With OpStruc DO Begin
    Wnd:= Handle;
    wFunc:= FO_COPY;
    pFrom:= @frombuf;
    pTo:=@tobuf;
    fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
  end;
  ShFileOperation( OpStruc );//db dataları aktarılıyor


b:='C:\KursKayıt\Arşiv\..'+form2.QRY_OKULSABIT.fieldbyname('EGITIM_YILI').asstring+'_'+form2.QRY_OKULSABIT.fieldbyname('DONEMI').asstring+' altına arşivleme yapıldı..' ;
a:=application.MessageBox (PChar(b),'Arşivleme Tamam',+mb_iconinformation);


 end;
yöntemi ile. (C:\KursKayıt\Arşiv\2006-2007_1.Dönem ) adında dataların bir kopyasını üretiyoruz.
Şimdi bundan sonra şunu nasıl yapabiliriz oluşturulan bu yoldan C:\KursKayıt\Arşiv\2006-2007_1.Dönem ) mainmenüde açtığım Arşivle bölümünün altında 2006-2007_1.Dönem klasörünün adı gelecek tabi 2006-2007_2.Dönem,2007-2008_1.Dönem gibi kaçtane arşiv alınmış ise

kısacası C:\KursKayıt\Arşiv\ altındaki tüm klasörleri main menüde görmek istiyorum ve gördüğüm klasörü örneğin 2006-2007_1.Dönem (mainmenüde) tıkladığımda arşiv deki dataları IBDatabase yolu olarak alacakyani araşivi yükleyecek.Ben sadece kafamdan geçenleri yazdım yanlış bir yöntem de düşünüyo olabiliri. Amacım datalarımı istediğimde Arşivlemek yine istediğimde arşivden bilgi almak.Şimdiden yol yöntem kod akıl fikir basit bir proje örneği verebileceklere teşekkür ediyorum
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Kod olarak düşünmedim ama şöyle bir mantık nasıl olur.

Projene arşiv için ayrı bir datamodül ekle bu datamodüldeki (database transaction vs.) bileşenlerin değerlerini değişkenlerle belirle değişkenlere atayacağın değerleri (path vs. ) arşivleme yaparken (ini veya txt olabilir.) bir dosyaya işle aktif dönem dosyasını farklı bir isim ile kopyalaya bilirsin. arşiv klasörüne datamodül değerlerini sakladığın dosyayıda aynı pathte tutarsın. arşivlediğin dataları günlük kullanımdaki VT dosyasından sil ve yeni bir dönem olarak o VT dosyasını kullanmaya devam et. ihtiyaç duyulduğunda arşiv menüsünden istediğin döneme ait Arşiv VT dosyasına arşiv datamodülü ile bağlan zaten arşiv olduğu için muhtemelen sadece okuma (select) işlemi yapacaksın. Kod kısmı baya karışık ve neredeyse tamamen dinamik olacak arşivleme yaparken sadece tahmin yürütüyorum. kanımca arşivlenmiş VT dosyana bağlanırken sadece VT dosya adı (alias ta tabi) ve Path bilgisi değişecek firebird kısmındaki değişiklikler hakkında pek fikrim yok kanımca ustalar bilgi verecektir.

Benim nacizane görüşüm bu daha farklı yaklaşımlar mutlaka vardır.
kolay gelsin.
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Lazım olur diye webden daha önce bir dosya kopyalama fonksiyonu bulmuştum. Belki gerekir.

Kod: Tümünü seç

function FileCopy(source,dest: String): Boolean;
var
  fSrc,fDst,len: Integer;
  size: Longint;
  buffer: packed array [0..2047] of Byte;
begin
  Result := False; { Assume that it WONT work }
  if source <> dest then begin
    fSrc := FileOpen(source,fmOpenRead);
    if fSrc >= 0 then begin
      size := FileSeek(fSrc,0,2);
      FileSeek(fSrc,0,0);
      fDst := FileCreate(dest);
      if fDst >= 0 then begin
        while size > 0 do begin
          len := FileRead(fSrc,buffer,sizeof(buffer));
          FileWrite(fDst,buffer,len);
          size := size - len;
        end;
        FileSetDate(fDst,FileGetDate(fSrc));
        FileClose(fDst);
        FileSetAttr(dest,FileGetAttr(source));
        Result := True;
      end;
      FileClose(fSrc);
    end;
  end;
end;
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

armadillo teşekkürler
Biraz uğraştım bu işle IBDATABASE1.DatabaseName path vererek arşivden bilgiyi alabiliyorum aynı yöntemle de anadatalarıma dönebiliyorum yönteni çok zor değilmiş ama şöyle bir durum var ben kullanıcıya C:\KursKayıt\Arşiv\2006-2007_1.Dönem şeklinde dataların arşivini aladırabiliyorum bu işlem birkaç dönemde tekrarlandığında C:\KursKayıt\Arşiv\ altında

2006-2007_1.Dönem
2006-2007_2.Dönem
2007-2008_1.Dönem
2007-2008_2.Dönem
................................ şeklinde klosörler yaratacak yani arşiv dosyalarını oluşturacak bu işlemi ben yapabiliyorum.İsteğim bu işlem yapıldığında program C:\KursKayıt\Arşiv\ altındaki
2006-2007_1.Dönem
2006-2007_2.Dönem
2007-2008_1.Dönem
2007-2008_2.Dönem klörleri MainMenüde gösterebilmek veya başka bir şey içinde çünkü kullanıcı istediği arşiv klosörüne girsinki IBDATABASE1.DatabaseName path ini ona yönlendirebileyim.Yapılan klosörleri programda görmek istiyorum gerisini ben yapacağım zaten

Belki şunu aramak gerekir bilgisayarda istenilen klosör altındaki klosörlerin bir listesini listeleyecek bir yol
Kullanıcı avatarı
sTb
Üye
Mesajlar: 59
Kayıt: 06 Nis 2005 11:13
Konum: Eskişehir

Mesaj gönderen sTb »

Klasörler için;

Kod: Tümünü seç

var 
  ara: TSearchRec;
begin
 listbox1.clear;
 if FindFirst(edit1.text + '*', faDirectory, ara) = 0 then
  begin
    repeat
      if (ara.Attr = faDirectory) then
      begin
        listbox1.Items.Add(ara.Name);
      end;
    until FindNext(ara) <> 0;
    FindClose(ara);
menüye aktarmak için de;

Kod: Tümünü seç

var
        mnuLevel: array [0..9] of TMenuItem;
       mnuAddItem: TMenuItem;
       basla,sayi: integer;
     begin
 sayi:=listbox1.count;
 for basla:=0 to sayi-1 do
 begin
 mnuLevel[0] := mainmenu1.Items[0];    
 mnuAddItem := TMenuItem.Create(MainMenu1);  
 mnuAddItem.Caption := listbox1.Items.Strings[basla];
 mnuLevel[0].Add(mnuAddItem);
 end;
Lisbox kullanarak yapmıştım düzenlersiniz.
Not: Menun birinci bölümüne ilave eder.
(mnuLevel[0] := mainmenu1.Items[0]; yerine
mnuLevel[0] := mainmenu1.Items[1]; ... kullanarak değiştirebilirsiniz.)
Not2:delphitürkiye' den harmanlanarak ortaya çıkmıştır.. :wink:
" Her bildiğin doğru olsun. Ama her doğruyu her yerde söylemek doğru değildir. "
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

sTb çok teşekkürler.Kodlar işimi fazlası ile görecek gibi.Yanlız

Kod: Tümünü seç

var
  ara: TSearchRec;
begin
 listbox1.clear;
 if FindFirst('c:\KursKayıt\Arşiv\'+ '*', faDirectory, ara) = 0 then
  begin
    repeat
      if (ara.Attr = faDirectory) then
      begin
        listbox1.Items.Add(ara.Name);
      end;
    until FindNext(ara) <> 0;
    FindClose(ara);
end;
de Listbox a veri şu şekilde geliyor.

.
..
2006/2007_1.Dönem

buradaki .(nokta) ve ..(ikinokta) olan veri windows un herhalde gizli dosyasından dolayı ileri geliyor diye tahmin ediyorum çünkü c:\KursKayıt\Arşiv\ altında tek bir klasör var.noktalara bir anlam veremedim.Bunu nasıl yok edebiliriz.
Kullanıcı avatarı
sTb
Üye
Mesajlar: 59
Kayıt: 06 Nis 2005 11:13
Konum: Eskişehir

Mesaj gönderen sTb »

:oops: onu atlamışım

Kod: Tümünü seç

listbox1.Items.Add(ara.Name);
yerine

Kod: Tümünü seç

 if (ara.name<>'.') and (ara.name<>'..') then listbox1.Items.Add(ara.Name);
şeklinde yazarmısınız.

:arrow: " .. " => Bir üst dizini, "." mevcut dizini ifade eder diye biliyorum ms-dos dan
" Her bildiğin doğru olsun. Ama her doğruyu her yerde söylemek doğru değildir. "
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Sağolasın.Tekrar teşekür ederim sTb
Kullanıcı avatarı
sTb
Üye
Mesajlar: 59
Kayıt: 06 Nis 2005 11:13
Konum: Eskişehir

Mesaj gönderen sTb »

Rica ederim... Yardımcı olabildiysek ne mutlu :wink:
" Her bildiğin doğru olsun. Ama her doğruyu her yerde söylemek doğru değildir. "
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Bir yardım daha isteyeceğim ama :oops:

mainmenüye aldığımız birçok klasör adı var ki bu sürekli artacak ben bu mainmenüdeki klasör isimlerinden herhangi birine tıkladığımda şu işlemi yaptırmak istiyorum

Kod: Tümünü seç

IBDATABASE1.DatabaseName:='C:\KursKayıt\Arşiv\2006-2007_1.Dönem\OGRENCI.FDB';
2006-2007_1.Dönem olan yer değişken olacak dolayısı ile bu değişkeni mainmenüden alacak yani mainmenüde hangi klasör adına tıklanırsa onun adını 2006-2007_1.Dönem olan yere yazacak ve böylece her klasör altındaki dataya bağlanabileyim.Gerçi bunun listbox items üzerinden tıklanarak yaptırabilirim ama taktım birkere mainmenüye :)
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

menünün caption özelliği çek derim. zaten aynı isimli klasörde değilmi dosyan


Kod: Tümünü seç



IBDATABASE1.DatabaseName:='C:\KursKayıt\Arşiv\'+ ...mainmenu.caption+'\OGRENCI.FDB';
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
ng
Üye
Mesajlar: 192
Kayıt: 01 Mar 2004 11:49
Konum: Bursa
İletişim:

Mesaj gönderen ng »

buradaki topicdeki sorunla
viewtopic.php?t=18816
linkindeki sorun aynı şey değil mi?
Cevapla