Postgres – przenoszenie danych między tabelami

0

Witam, mam problem i proszę o pomoc w jgo rozwiązaniu.
Posiadam 4 bazy danych o jednakowej strukturze (bazy i tabele postgresql), potrzebuję przenieść dane z jednej tabeli z kazdej bazy z 3 baz do czwartej. Korzystam z komponentu ZEOS (Zconnection, ztable) niestety po wczytaniu i przeniesieniu dwóch rekordów wyskakuje błąd jak w załączniku. Poniżej kod przenoszenia danych:

procedure TForm1.dodaniedojednejwsplnejbazy1Click(Sender: TObject);
begin
Ztable2.first;
while Ztable2.RecNo<=15 do
begin
 dana1:=Ztable2.FieldByName('nazwisko').asString;
 dana2:=Ztable2.FieldByName('imie').AsString;
 dana3:=Ztable2.FieldByName('miasto').AsString;
 dana4:=Ztable2.FieldByName('ulica').AsString;
 dana5:=Ztable2.FieldByName('kod_pocztowy').AsString;
 dana6:=Ztable2.FieldByName('pesel').AsString;
 dana7:=Ztable2.FieldByName('nr_dokumentu').AsString;
 dana8:=Ztable2.FieldByName('data_wprowadzenia').AsDateTime;
 dana9:=Ztable2.FieldByName('data_zmiany').AsDateTime;
 dana10:=Ztable2.FieldByName('zrodlo_danych').AsString;
 dana11:=Ztable2.FieldByName('id_operatora').AsInteger;
 dana12:=Ztable2.FieldByName('sprzeciw').Asboolean;
 dana13:=Ztable2.FieldByName('tel_stacjonarny').AsString;
 dana14:=Ztable2.FieldByName('tel_komorkowy').AsString;
 dana15:=Ztable2.FieldByName('nip').AsString;
 dana16:=Ztable2.FieldByName('skasowany').AsBoolean;
 dana17:=Ztable2.FieldByName('id_pasazera').AsInteger;
 dana18:=Ztable2.FieldByName('id_zakladu').AsInteger;
 dana19:=Ztable2.FieldByName('id_wydzialu').AsInteger;
 dana20:=Ztable2.FieldByName('uwagi').AsString;
 dana21:=Ztable2.FieldByName('data_ulgi').AsDateTime;
 dana22:=Ztable2.FieldByName('moj_pracownik').AsBoolean;
 dana23:=Ztable2.FieldByName('data_urodzenia').AsDateTime;
 dana24:=Ztable2.FieldByName('email').AsString;
 dana25:=Ztable2.FieldByName('wersja_danych').AsInteger;
 dana26:=Ztable2.FieldByName('zamazany').AsBoolean;

 Ztable1.First;
if not Ztable1.Locate('nazwisko,imie,miasto,ulica,kod_pocztowy', VarArrayOf([dana1, dana2, dana2, dana4, dana5]), []) then
begin
  Ztable1.append;
  Ztable1.FieldByName('nazwisko').AsString:=dana1;
  Ztable1.FieldByName('imie').AsString:=dana2;
  Ztable1.FieldByName('miasto').AsString:=dana3;
  Ztable1.FieldByName('ulica').AsString:=dana4;
  Ztable1.FieldByName('kod_pocztowy').AsString:=dana5;
  Ztable1.Post;
end;
Ztable2.Next;

end;
end;
2

Nikt za Ciebie nie znajdzie w Twoim kodzie miejsca gdzie masz najprawdopodobniej niezainicjowany wskaźnik. Masz niedziałający program, uruchom go pod debuggerem i prześledź na jakiej linii się wywala. Wtedy będziesz miał błąd. Taka sytuacja jaką masz jest bardzo komfortowa, ponieważ wiesz dokładnie kiedy i gdzie pojawia się błąd, co nie zawsze jest takie oczywiste i w 100% powtarzalne.

Co do kodu to polecam poczytać, ponieważ jest to zrobione po prostu źle. Co by było żeby tabela miała 100 pól? Też byś przepisywał wszystko po kolei? Ja u siebie w analogicznym przypadku (zakładając, że struktura tabel oraz nazewnictwo pól zgadza się w 100%) zrobiłem to za pomocą pętli. Poczytaj jak uzyskać listę pól w danej tabeli i z tego skorzystaj.

Poza tym umieszczaj kod w znacznikach formatujących. Ciężko się czyta kod pisany czcionką różnej szerokości znaku.

0
Mr.YaHooo napisał(a):

Co do kodu to polecam poczytać, ponieważ jest to zrobione po prostu źle. Co by było żeby tabela miała 100 pól? Też byś przepisywał wszystko po kolei? Ja u siebie w analogicznym przypadku (zakładając, że struktura tabel oraz nazewnictwo pól zgadza się w 100%) zrobiłem to za pomocą pętli. Poczytaj jak uzyskać listę pól w danej tabeli i z tego skorzystaj.

jeśli w danych wejściowych trafi się null, nie wiem jak się zachowa, czy skonwertuje na wartość pustą w danych typie (pusty string, 0, itd) czy poleci wyjatek ...

0

Co to za rzeźnia? Użyj sql a dokładnie SELECT INTO https://www.postgresql.org/docs/9.1/sql-selectinto.html

0
AnyKtokolwiek napisał(a):

jeśli w danych wejściowych trafi się null, nie wiem jak się zachowa, czy skonwertuje na wartość pustą w danych typie (pusty string, 0, itd) czy poleci wyjatek ...

Albo wyłapujesz wyjątek i postępujesz odpowiednie, albo używasz inteligentnego typu danych jak Variant za pomocą metody AsVariant i wszystko powinno przejść bez problemów.

0
Mr.YaHooo napisał(a):
AnyKtokolwiek napisał(a):

jeśli w danych wejściowych trafi się null, nie wiem jak się zachowa, czy skonwertuje na wartość pustą w danych typie (pusty string, 0, itd) czy poleci wyjatek ...

Albo wyłapujesz wyjątek i postępujesz odpowiednie, albo używasz inteligentnego typu danych jak Variant za pomocą metody AsVariant i wszystko powinno przejść bez problemów.

A mogę prosic o jakiś wzrór, przykład

2

jeśli tabele mają identyczne struktury to w taki sposób przepiszesz wszystkie pola

  Ztable2.first;
  FCount:= Ztable2.fields.Count-1;
  while not Ztable2.eof do
  begin
    Ztable1.append;
    for I := 0 to FCount do
      Ztable1.fields[I].value := Ztable2.fields[I].value;
    Ztable1.post;
    Ztable2.next;
  end;
0
grzegorz_so napisał(a):

jeśli tabele mają identyczne struktury to w taki sposób przepiszesz wszystkie pola

  Ztable2.first;
  FCount:= Ztable2.fields.Count-1;
  while not Ztable2.eof do
  begin
    Ztable1.append;
    for I := 0 to FCount do
      Ztable1.fields[I].value := Ztable2.fields[I].value;
    Ztable1.post;
    Ztable2.next;
  end;

Ale wszystkie odpowiedzi, za które dziękuję, i tak nie rozwiązują problemy że po dwóch rekordach wywala błąd jak na wstępie podałem.

0

kilka postów wcześniej @Mr.YaHooo: napisał, użyj debuggera, wtedy zobaczysz w której linii kodu masz wyjątek
Twój zrzut ekranu z błędem wskazuje na próbę odwołania do niezainicjowanego (nieistniejącego) obiektu

2

dziwnie wygląda warunek pętli while

while Ztable2.RecNo<=15 do  

zamiast bardziej logicznego

while not Ztable2.eof do

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