ADO nie zapisuje wszystkiego do Accessa

0

Problem pewnie z dziedziny newbe albo poległem. Zapisuję dane do Accesa z pętli a konkretnie dwóch pętlach. Nie wiem z jakiego powodu część danych się nie zapisuje, chociaż wszystkie dane są (sprawdzałem co konkretnie się zapisuje) a w Accesie nie mam żadnych primary kolumn czy innych ograniczeń które mogłyby mi blokowac zapis. Próbowałem zapisywać przez ADOTable i ADOCommand. W obydwu przypadach taki sam rezultat. Kod wygląda mniej więcej tak:

ADOTable.Close;
ADOTable.TableName := 'mojatablica';
ADOTable.Open;
ADOTable.DisableControls;
for i := 0 to 300 do
begin
  wyniki := dane[i];
  with ADOTable do
  for j := 0 to 80 do
    begin
      Append;   //próbowałem też z Insert       
      FieldByName('pole1').AsInteger := wyniki[j].pole1;
      FieldByName('pole2').AsFloat := wyniki[j].pole2;
      FieldByName('pole3').AsFloat :=  wyniki[j].pole3;
      Post;
    end;
end;

Efekt jest taki że nie dla każdego 'j' zapisuje mi wyniki. I to jest bardzo dziwne bo dla jednego wartości 'i' mam j od 0 do 80 a dla innej np. od 15 do 20, dla kolejnego od 0 do 13. Trochę losowo chociaż w większości 'i' są dla całego zbioru 'j'. Za to te które nie są dla wszystkich wartości 'j' to powtarzają się np. dla i=279 j jest zawsze zapisywane tylko od 3 do 8. Przy zapisie przez ADOCommand mam to samo. Próbowałem dawać Application.ProcessMessages że niby coś się nie zdąża zapisać ale to raczej nie to. Jak wspominałem wrzuciłem sobie messageboxa w pętle i podglądałem np. co się zapisuje do i=279. Wyskoczyło 80 okienek z poprawnymi wartościami a do bazy zapisało jedynie od 3 do 8. HELP!
Przeszukałem sieć i nic nie znalazłem. Ktoś spotkał się z czymś takim?

0

strzelam

 
ADOTable.Close;
ADOTable.TableName := 'mojatablica';
ADOTable.Open;
ADOTable.DisableControls;
for i := 0 to 300 do
begin
  wyniki := dane[i]; 
  for j := 0 to 80 do
    with ADOTable do
    begin
      Append;   //próbowałem też z Insert       
      FieldByName('pole1').AsInteger := wyniki[j].pole1;
      FieldByName('pole2').AsFloat := wyniki[j].pole2;
      FieldByName('pole3').AsFloat :=  wyniki[j].pole3;
      Post;
    end;
end;
0

Mogłem to też napisać

ADOTable.Close;
ADOTable.TableName := 'mojatablica';
ADOTable.Open;
ADOTable.DisableControls;
for i := 0 to 300 do
begin
  wyniki := dane[i]; 
  for j := 0 to 80 do
    begin
      ADOTable.Append;   //próbowałem też z Insert       
      ADOTable.FieldByName('pole1').AsInteger := wyniki[j].pole1;
      ADOTable.FieldByName('pole2').AsFloat := wyniki[j].pole2;
      ADOTable.FieldByName('pole3').AsFloat :=  wyniki[j].pole3;
      ADOTable.Post;
    end;
end;

Kolejność 'with ADOTable do ' w tym przypadku wydaje mi się bez znaczenia. Dla pewności sprawdziłem powyższy przykład i dalej d***.

0

Być może po stronie bazy coś nie tak. Jak wygląda tabela? Na pewno nie powtarzają się klucze główne?

0

wyniki[j].pole1 w pętli po 'j' jest taki sam. W tabeli nie mam żadnych kluczy głównych czy podstawowych. Brak indeksowania, wymagań odnośnie danych, sprawdzania poprawności. Dla części 'i' (w większości) mam zapis całości pętli po 'j', dla innych tylko część.
Dane do zapisu wyglądają mniej więcej tak:
pole1; pole2, pole3
1; 1; 4213
1; 2; 4323
1; 3; 5432
...
1; 79; 641
1; 80; 75435
(kolejne i)
2; 1; 342
2; 2; 3523
2; 2; 341
...
2; 79; 542
2; 80; 5345
(kolejne i)
[dane przykładowe] Dla każdego pola1 powtarzają się wartości w polach2, pole3 są różne.


Problem się rozwiązał....
Access poprzestawiał rekordy i nie widziałem wszystkich po kolei. Zmyliło mnie wyświetlanie pozycji w gridzie - tutaj mam błąd bo grid nie wszystko wyświetla ale to już kwestia zapytania do bazy.
Temat zamknięty :]

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