Postgres – przenoszenie danych między tabelami

Postgres – przenoszenie danych między tabelami
ZE
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 miesięcy
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:

Kopiuj
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;
edytowany 3x, ostatnio: flowCRANE
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:1083
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.

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
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 ...


Bo C to najlepszy język, każdy uczeń ci to powie
abrakadaber
abrakadaber
skonwertuje, co w efekcie da inne dane w bazie docelowej
robertz68
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 21 godzin
  • Lokalizacja:Zielona Góra
0

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

abrakadaber
abrakadaber
to są OSOBNE bazy tu się nie da tak prosto SQLem
robertz68
rzeczywiście w postgresie jest troszkę trudniej niż w mssql ale jest coś takiego jak dblink i można odwołać się do zewnętrznej bazy. Jednak może to wszystko być zbyt skomplikowane. Tak więc przyznaję tobie rację i wycofuję moją sugestię.
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:1083
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.

ZE
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 miesięcy
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

GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:minuta
2

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

Kopiuj
  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;
edytowany 1x, ostatnio: grzegorz_so
ZE
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 miesięcy
0
grzegorz_so napisał(a):

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

Kopiuj
  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.

GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:minuta
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

edytowany 1x, ostatnio: grzegorz_so
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:minuta
2

dziwnie wygląda warunek pętli while

Kopiuj
while Ztable2.RecNo<=15 do  

zamiast bardziej logicznego

Kopiuj
while not Ztable2.eof do

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.