Kopia bazy do pliku

0

Gdzie jest problem w procedurze. Poniższa kod działa prawidłowo na Windows Xp, kopiuje bazę do pliku (ponad 40 tys. rekordów). Natomiast gdy to robie na komputerze z Win 98 kopiuje tylko część bazy (zawsze tą samą). Może ktoś coś wie na ten temat?

procedure TfrmMain.Button7Click(Sender: TObject);
var
S : string;
i : integer;
begin
Memo.Lines.Clear;
tblPodstawa.First;
for i:=0 to tblPodstawa.RecordCount - 1 do
begin
S := tblPodstawa.FieldByName('Nazwa').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole1').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole2').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole3').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole4').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole5').AsString + ';';
Memo.Lines.Add(S);
tblPodstawa.Next;
end;
Memo.Lines.SaveToFile('Podstawa.csv');
MessageBox(Handle,'Kopia bazy zakończona.','INFORMACJA!', 0)
end;

0

Ja bym parę rzeczy zmienił:

  1. Na początku pętli dałbym
    S:='';
    by wyzerować zawartość zmiennej typu String.

  2. Zamiast pętli for dałbym pętlę while

While (not tblPodstawa.eof) do
begin
  ...
end;

Nie tracisz czasu na liczenie rekordów w bazie (przy dużych bazach trochę ta operacja trwa).

Spróbuj czy Ci zadziała z tymi zmianami

0

Poprawiłem procedurkę, niemniej nic się nie zmieniło. Nadal pod Win98 nie zrzuca całej bazy

procedure TfrmMain.Button7Click(Sender: TObject);
var
S : string;
i : integer;
begin
Memo.Lines.Clear;
tblPodstawa.First;
while not tblPodstawa.eof do
begin
S :='';
S := tblPodstawa.FieldByName('Nazwa').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole1').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole2').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole3').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole4').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole5').AsString + ';';
Memo.Lines.Add(S);
tblPodstawa.Next;
end;
Memo.Lines.SaveToFile('Podstawa.csv');
MessageBox(Handle,'Kopia bazy zakończona.','INFORMACJA!', 0)
end;

0

TMemo ma ograniczana pojemnosc, sprubuj tak:

var
Plik:TStringList;
S:String;
begin
Plik:TStringList.Create;

try
tblPodstawa.First;
while not tblPodstawa.eof do
begin
S :='';
S := tblPodstawa.FieldByName('Nazwa').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole1').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole2').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole3').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole4').AsString + ';';
S := S + tblPodstawa.FieldByName('Pole5').AsString + ';';
Plik.Add(S);
tblPodstawa.Next;
end;
Plik.SaveToFile('Podstawa.csv');
ShowMessage('Koniec');

finally
Plik.Free;
end;

end;

0

Nie używaj pola memo jako buforu tylko zapisuj bezpośrednio lub zmień komponent memo na richedit.
Jeśli dobrze pamietam w Win 98 pole memo ma ograniczony rozmiar w stosunku do odpowiednika pola memo w XP.

0

TRichEdit tez ma ograniczona wielkosc, choc niepamientam ile. Ewentualnie mozna tez go przekonfigurowac - na jakims faq czytalen o tym ale nie pamientam gdzie.

0

Ech... Tak się kończy, jak ktoś się nie nauka Pascala (<- nauka jest specjalnie, to nie jest błąd), tylko Delphi i próbuje prostą operację robić na około... Wykorzystaj zmienną TextFile, AssignFile, Rewrite, WriteLn i CloseFile i nie ma problemu...

1 użytkowników online, w tym zalogowanych: 0, gości: 1