Tabledan nasıl yedekleme yapabilirim?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Yine benim hatam

Kod: Tümünü seç

CopyFile(kaynak,hedef,true);
Yazınca, aynı isme sahip bir dosya varsa üzerine yazmıyor. Üzerine yazması için

Kod: Tümünü seç

CopyFile(kaynak,hedef,False);
olarak değiştir.
Kusura bakma, denemeden yazıyorum kodları, hata çıkıyor.
sevturk
Üye
Mesajlar: 117
Kayıt: 23 Nis 2006 01:04

Mesaj gönderen sevturk »

ulu coder'e:

copyfile(kaynak,hedef,false) kodunun anlamı button5'in içindeki kodların sonundaki truelarımı false yapayım tam anlayamadım.. eğer şu şekilde diyosan:

procedure TForm2.Button5Click(Sender: TObject);
var
yeni_klasor:string;
begin
yeni_klasor:='C:\sürücükursu\yedekler\'+DateToStr(Date);
CreateDir(yeni_klasor);
CopyFile(PChar('C:\sürücükursu\kayıt\bilgigirisi.dbf'),PChar(yeni_klasor+'\bilgigirisi.dbf'),false);
CopyFile(PChar('C:\sürücükursu\kayıt\bilgigirisi.mdx'),PChar(yeni_klasor+'\bilgigirisi.mdx'),false);
end;

procedure TForm2.Button6Click(Sender: TObject);
begin
table1.Close;
Table1.DataBaseName:='C:\sürücükursu\yedekler\'+DateToStr(DateTimePicker2.Date);
table1.open;
end;

böyle yazdıktan sonrada yedek alıp herhangi bi tane kaydı sildikten sonra yedek çıkar butonuna bastımmı sildiğim kaydı geri getirmiyo..
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Haklısın.
Neden böyle yaptığını anlamadım.
Kopyalama fonksiyonunda bozukluk olabileceğini düşündüm, başka bi fonksiyon yazıp kopyaladım yine aynı.
Üzerine yazmada sorun vardır dedim, kopyayı sildim hala eski kayıtlar gözüküyor.
Başka tarihlerle kopyaladım hala eski kayıtlar gözüküyor.
Neden böyle olduğunu bilen var mı?Kodlar şöyle;

Kod: Tümünü seç

procedure TForm1.Button5Click(Sender: TObject);
var
  yeni_k:string;
begin
  yeni_k:='C:\Deneme\Yedekler\'+DateToStr(DateTimePicker2.Date);
  CreateDir(yeni_k);
  DosyaKopyala('C:\Deneme\VeriTabani\Bilgiler.db',yeni_k+'\bilgiler.db');
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  Table1.Close;
 Table1.DatabaseName:='C:\Deneme\Yedekler\'+DateToStr(DateTimePicker1.Date);
  Table1.Open;
end;
  
procedure TForm1.DosyaKopyala(kaynak, hedef: string);
var
  dosya1,dosya2:file;
  okunan,yazilan:Integer;
  Buffer:array[1..10240] of char;
begin
  AssignFile(dosya1,kaynak);
  reset(dosya1,1);
  AssignFile(dosya2,hedef);
  ReWrite(dosya2,1);
  repeat
    BlockRead(dosya1,Buffer,SizeOf(buffer),okunan);
    BlockWrite(dosya2,Buffer,okunan,yazilan);
  until (okunan=0) or (yazilan<>okunan);
  CloseFile(dosya1);
  CloseFile(dosya2);
end;
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Şöyle bir çözüm geldi aklıma fakat kayıt sayısı artarsa uzun sürecektir;

Kod: Tümünü seç

procedure TForm1.Button5Click(Sender: TObject);
var
yeni_k:string;
i:integer;
begin
yeni_k:='C:\Deneme\Yedekler\'+DateToStr(DateTimePicker2.Date);
CreateDir(yeni_k);
DosyaKopyala('C:\Deneme\VeriTabani\Bilgiler.db',yeni_k+'\bilgiler.db');
Table2.DatabaseName:=yeni_k;
Table2.TableName:='bilgiler.db';
Table2.Open;
Table2.First;
while Table2.Eof=False Do Table2.Delete;
Table1.First;
while Table1.Eof=False Do
begin
  Table2.Insert;
  For i:=0 to 2 Do //Alan sayısının bir eksiği
    Table2.Fields.Fields[i].AsString:=Table1.Fields.Fields[i].AsString;
  Table2.Post;
  Table1.Next;
end;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
Table1.Close;
Table1.DatabaseName:='C:\Deneme\Yedekler\'+DateToStr(DateTimePicker1.Date);
Table1.Open;
end;

procedure TForm1.DosyaKopyala(kaynak, hedef: string);
var
dosya1,dosya2:file;
okunan,yazilan:Integer;
Buffer:array[1..10240] of char;
begin
AssignFile(dosya1,kaynak);
reset(dosya1,1);
AssignFile(dosya2,hedef);
ReWrite(dosya2,1);
repeat
  BlockRead(dosya1,Buffer,SizeOf(buffer),okunan);
  BlockWrite(dosya2,Buffer,okunan,yazilan);
until (okunan=0) or (yazilan<>okunan);
CloseFile(dosya1);
CloseFile(dosya2);


end;
Test ettim çalışıyor:)
sevturk
Üye
Mesajlar: 117
Kayıt: 23 Nis 2006 01:04

Mesaj gönderen sevturk »

ulu coder'e:

yazdığın bu son kodu denemedim çünkü table2 eklemişsin yani mantığını pek anlayamadım table2'yi nereye bağlıyoruz yine table1 gibi ikisinide aynı veritabanınamı, yani bende olduğu gibi databasename'ine C:\sürücükursu\kayıt\bilgigirisi.db 'mi yazıyoruz.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Mantığını anlatayım;
Table2'yi forma yerleştirip bırakıyoruz, hiç bi yere bağlamıyoruz.
Dosyayı kopyalıyoruz.
Table2'yi kopyaladığımız dosyaya bağlıyoruz.
Sonra Table2'deki kayıtları temizliyoruz.
Table1'deki kayıtları Table2'ye aktarıyoruz.
Yani dosya kopyalama işlemini sadece o klasörde bir tablo oluşsun diye yapıyoruz, veri kopyalamak için değil.
yazdığın bu son kodu denemedim çünkü table2 eklemişsin yani mantığını pek anlayamadım
Bunu söylemene ne kadar sevindim anlatamam. :alkis:

Yarın sabah bi işim var artık yatmalıyım kusura bakma :elsalla:
sevturk
Üye
Mesajlar: 117
Kayıt: 23 Nis 2006 01:04

Mesaj gönderen sevturk »

ulu coder'e:

yardımların ve hoşgörün için Allah senden razı olsun.. yalnız bi sorunla karşılaştım ve bunun kesinlikle benden kaynaklandığını biliyorum.. delphide tecrübeli olmadığım için kusuruma bakmıyosundur inşallah..
aynen kodları geçtim yolları kendime göre uyarladım ama programı çalıştırınca imleç buttton5'in içindeki DosyaKopyala yazısının soluna konumlanıyo ve alt kısımda Error:Undeclared İdentifier:'DosyaKopyala' yazılı hata veriyo inşallah bu yazımada cevap verip bu konu hakkında beni bilgilendirmiş olacaksın ve bende senden aldığım bilgilerle hem proramlarımda senin kodlarınla yedek alma yapıp diğer bu konuda yardım bekleyen arkadaşlara senin tecrübelerini önericem.. saygılarımla ulu coder Allah yaratıcılığı arttırsın..
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Allah yaratıcılığını arttırsın
Amin, cümlemizin.

Dosya kopyala diye bi prosedür oluşturduk.
Nasıl ki değişkenleri tanımlıyorsak, prosedür da tanımlamamız gerekiyor.
Bunun için;
Kod satırının en üstüne git.
Aşağıya doğru in.
Sırasıyla koyu harflerle yazılmış şunları görmelisin;
unit
interface
uses
type
...

bu type'dan sonrakiler 2 boşluk içeride yazılmıştır.
O satırları takip edersen, önce eklediğin bileşenleri, sonra da
procedure Button1Click(Sender: TObject); vb prosedür tanımları göreceksin.
Bunların arasına bizimkini de ekle;

Kod: Tümünü seç

Procedure DosyaKopyala(kaynak, hedef: string);
Aklında bulunsun: bir fonksiyon-prosedür oluşturacağın zaman, önce şimdiki gibi tanımla. Sonra imleç üzerindeyken Ctrl+Shift+C tuşlarına bas.
Butona çift tıkladığımızda kodları yazacağımız yer oluşuyor ya hani, aynısı olacak.
sevturk
Üye
Mesajlar: 117
Kayıt: 23 Nis 2006 01:04

Mesaj gönderen sevturk »

ulu coder'e:
evet kodlar çalışıyo ama yanlış bende olabilir.. yedek aldıktan sonra yedek çıkar butonuna basıyorum bana sadece iki alanın verilerini gösteriyo..
aynı kodları başka programımda denedim bu seferde bana 4 alanda veri göstermedi diğerlerinde gösterdi.. dbeditlerim table1'e bağlı olan datasource1'e bağlı bunun etkisi olabilirmi, olduysa çözüm nasıl giderilir?
birde programımı açar açmaz son yedek bilgileri gelmesi için yedek çıkar butonunun içindekileri formcreate kısmınamı yazmam gerekir..
cevabını merakla bekliyorum.. yardım ve emeklerin için Allah razı olsun.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Kod: Tümünü seç

For i=0 to 2 //Alan sayısının bir eksiği
yazmışım ya,
ordaki 2, alan sayısının bir eksiği.
Yani eğer 10 alanın varsa, ordaki 2'yi 9 yapacaksın.
2. soruna gelince, aynı kodları ikisine de yazmana gerek yok.
FormCreate'e şunu yaz;

Kod: Tümünü seç

Button6Click(Form1);
sevturk
Üye
Mesajlar: 117
Kayıt: 23 Nis 2006 01:04

Mesaj gönderen sevturk »

ulu coder'e:

yedeklemeyi bugün deneyebildim o yüzden teşekkürüm biraz geç sayılabilir, bu yüzden kusura bakma.. yardımın için çok teşekkür ederim ulu coder, ilgin ve sabrın için Allah senden razı olsun.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

sevturk yazdı:ulu coder'e:
yedeklemeyi bugün deneyebildim o yüzden teşekkürüm biraz geç sayılabilir, bu yüzden kusura bakma..
Bana geç teşekkür edilmesinden nefret ederim. Cezan; :alsana:
Şaka bir yana, Allah hepimizden razı olsun.
Birilerine faydalı olabilmek güzel bi şey :roll:

NOT:Gönderdiğim kodlardan DosyaKopyala fonksiyonunu silip, yerine CopyFile fonksiyonunu kullanabilirsin.
En son ulu coder tarafından 26 Nis 2006 12:20 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Ottoman

Mesaj gönderen Ottoman »

Selam..Aşağıdaki kodları tablona aynen kopyala!(Buttonlara Yazdığınız Kod function'lardan aşağıda olacak.)..,,

Uses: ShellApi; ekle

Datalar Klasörünü Tüm dosyalarıyla beraber Kopyalar;

Kod: Tümünü seç

function copydir(von,zieldir: String): boolean; 
var fos: TSHFileOpStruct; 
begin 
ZeroMemory(@fos, SizeOf(fos)); 
with fos do begin 
wFunc := FO_COPY; 
fFlags := FOF_FILESONLY; 
pFrom := PChar(von+#0); 
pTo := PChar(zieldir) 
end; 
Result:=(0=ShFileOperation(fos)); 
end; 

function movedir(von,zieldir: String): boolean; 
var fos: TSHFileOpStruct; 
begin 
ZeroMemory(@fos, SizeOf(fos)); 
with fos do begin 
wFunc := FO_MOVE; 
fFlags := FOF_FILESONLY; 
pFrom := PChar(von+#0); 
pTo := PChar(zieldir) 
end; 
Result:=(0=ShFileOperation(fos)); 
end; 

function deldir(dir: String): boolean; 
var fos: TSHFileOpStruct;
begin 
ZeroMemory(@fos, SizeOf(fos)); 
with fos do begin 
  wFunc := FO_DELETE; 
  fFlags := FOF_SILENT or FOF_NOCONFIRMATION; 
  pFrom := PChar(dir+#0); 
end;
Result:=(0=ShFileOperation(fos)); 
end;
sonra..Tablona 2 Button Koy

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
//Yedek Al ....Klasörü Komple kopyalar.
begin
 {'c:\download' -> 'c:\'}
 if copydir('c:\datalar','c:\yedek\') then//c:\ =e:\ ...vs..olabilir.
   begin
    Form1.Caption:=('Datalar Kopyalandi    ');
   end;
end;
Geri Yükleme ise....

Kod: Tümünü seç

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 {'c:\download' -> 'c:\'}
 if copydir('c:\yedek\datalar','c:\') then
   begin
    Form1.Caption:=('Datalar Geri Yüklendi    ');
   end;
end;
Cevapla