Błąd przy dodaniu nowego rekordu do bazy Postgres

0

oto fragment kodu mający za zadanie dopisać nowyy rekord do tabeli pasazer w bazie pastgesql

 with zquery20, SQL do
 begin

            Close;
            Clear;
Add('insert into  pasazer  (nazwisko,imie,miasto,ulica,kod_pocztowy,pesel,nr_dokumentu,data_wprowadzenia,data_zmiany,zrodlo_danych,id_operatora,sprzeciw,tel_stacjonarny,tel_komorkowy,nip,skasowany,id_zakladu,id_wydzialu,uwagi,moj_pracownik)');
add('insert into pasazer (data_urodzenia,email,wersja_danych,zamazany)');
add('values (:nazwisko,:imie, :miasto, :ulica,:kod_pocztowy,:pesel,:nr_dokumentu,:data_wprowadzenia,:data_zmiany,:zrodlo_danych,:id_operatora,:sprzeciw,:tel_stacjonarny,:tel_komorkowy,:nip,:skasowany,:id_zakladu,:id_wydzialu,:uwagi,:moj_pracownik);');
add('values (:data_urodzenia,:email,:wersja_danych,:zamazany);');
            ParamByName('nazwisko').AsString := dana1;
            ParamByName('imie').AsString := dana2;
            ParamByName('miasto').AsString := dana3;
            ParamByName('ulica').AsString := dana4;
            ParamByName('kod_pocztowy').AsString := dana5;
            {
            ParamByName('z_deklaracja').AsBoolean := false;
            ParamByName('kurs_godz').AsBoolean := true;
            ParamByName('bez_kursu').AsBoolean := false;
            ParamByName('data_od').AsDate := Form32.dzien1;
            ParamByName('data_do').AsDate := Form32.dzien2;
            ParamByName('data_sp').AsDateTime := Now;
            ParamByName('id_rodzb').AsInteger := zidrodzb;
            ParamByName('cena').AsFloat := strtofloat(Edit9.Text);
            ParamByName('do_zaplaty').AsFloat := ulgowy;
            ParamByName('id_operatora').AsInteger := zoperatora;
            ParamByName('typ_trasy').AsFloat := 2;
            ParamByName('dobry').AsFloat := 1;
            ParamByName('nazwa_raportu').AsString := Edit12.Text;
            ParamByName('nr_w_bil').AsInteger := StrToInt(Edit18.Text);
            ParamByName('liczba_miejsc').AsInteger := 1;
            ParamByName('wynajm').AsFloat := 0;
            ParamByName('id_rozkladu').AsInteger := idrozkladu;
            ParamByName('sposob_zaplaty').AsFloat := 1;
            ParamByName('cena_norm').AsFloat := StrToFloat(Edit8.Text);
            ParamByName('liczba_przejazdow').AsInteger := 0;
            ParamByName('nr_mifare').AsFloat := 0;
            ParamByName('mif_szyfr').AsString := '0000000000';
            ParamByName('mif_kod').AsInteger := 0;
            ParamByName('mif_lmp').AsInteger := 0;
            ParamByName('mif_s_ogr').AsInteger := 0;
            ParamByName('mif_typ_tr').AsFloat := 2;
            ParamByName('left_pas').AsBoolean := False;
            ParamByName('bkop_kod').AsInteger := 0;
            ParamByName('bkop_l_przejazd').AsInteger := 0;
            ParamByName('rodzaj_kasy').AsInteger := 3;
            ParamByName('logo').AsString := Edit14.Text;
            ParamByName('sprzedawca').AsInteger := 1717;
            ParamByName('okr_wz_bydgoszcz').AsBoolean := False;
            ParamByName('Nr_taryfy_m').AsInteger := 0;
            ParamByName('id_zbiorowki').AsInteger := zidzbiorowki;
            ParamByName('mif_st1').AsInteger := 0;
            ParamByName('mif_st2').AsInteger := 0;
            ParamByName('mif_st3').AsInteger := 0;
            ParamByName('sp_wyl_ceny_bm').Asinteger := 4;
            ParamByName('nrw_ceny_bm').AsInteger := 0;
            ParamByName('par_mnoznik').AsFloat := 16.50;
            ParamByName('par_proc_pm').AsInteger := -50;
            ParamByName('par_duobmprzes').AsInteger := -100;
            ParamByName('kod_przystanku').AsInteger := zkodprzystanku;
            ParamByName('Nr_rf').Asinteger := zraportf;
            ParamByName('mifspbmaut').Asinteger := 0;
            }
            ExecSQL;
 end;

co może być przyczyną, że w momencie próby dopisania nowego rekordu wyskakuje błąd?

screenshot-20200710234510.png

1

Jak na moje to brakuje średników na końcu w dwóch pierwszych zapytaniach SQL.

0

Co do twojego pytania to się nie wypowiem, bo napisałeś że pojawia się błąd, ale nie daje jego treści :p

Jednak widzę, że dałeś błąd jako załącznik, przepraszam - siedzę na komórce i nie zauważyłem ;)

Mogę natomiast dodać, że moim zdaniem masz skopana strukturę tabeli. Z tego co widać mogę zakładać, że masz jedną wielką tabele, gdzie masz wszystko - dane klientów, informacje o produktach, ceny, sprzeciwy RODO itp. tak się nie powinno robić, każda tabela powinna dotyczyć jednej kwestii/zagadnienia, a następnie powinny one być że sobą wzajemnie powiązane.

2

Błąd w zapytaniu, niepotrzebnie 2 razy powtarzasz insert into i values

Add('insert into  pasazer  (nazwisko,imie,miasto,ulica,kod_pocztowy,pesel,nr_dokumentu,data_wprowadzenia,data_zmiany,zrodlo_danych,id_operatora,sprzeciw,tel_stacjonarny,tel_komorkowy,nip,skasowany,id_zakladu,id_wydzialu,uwagi,moj_pracownik, ');
add(' data_urodzenia,email,wersja_danych,zamazany)');
add('values (:nazwisko,:imie, :miasto, :ulica,:kod_pocztowy,:pesel,:nr_dokumentu,:data_wprowadzenia,:data_zmiany,:zrodlo_danych,:id_operatora,:sprzeciw,:tel_stacjonarny,:tel_komorkowy,:nip,:skasowany,:id_zakladu,:id_wydzialu,:uwagi,:moj_pracownik, ');
add(' :data_urodzenia,:email,:wersja_danych,:zamazany);');
0

wszystko niby ok
ale jak zrobiłem coś takiego:

zquery20.First;
 if not zquery20.Locate('nazwisko,imie,miasto,ulica,kod_pocztowy', VarArrayOf([dana1, dana2, dana2, dana4, dana5]), []) then
begin
with zquery20, SQL do
begin
 Add('insert into  pasazer  (nazwisko, imie )');
  add('values (:nazwisko,:imie);');
 parambyname('nazwisko').AsString:=dana1;
 parambyname('imie').AsString:=dana2;
 execSQL;
showmessage(dana1+' '+Dana2+' '+dana3+' '+dana4+' '+dana5);
end;
end;

znów błąd jak w załączniku

Bez tytułu1.jpg

1

Jak już chcesz koniecznie wykorzystywać tego samego dataseta do pobierania i aktualizacji danych to przed wykonaniem zapytania zamknij go i wyczyść sqltext

zquery20.First;
if not zquery20.Locate('nazwisko,imie,miasto,ulica,kod_pocztowy', VarArrayOf([dana1, dana2, dana2, dana4, dana5]), []) then
begin
Zquery20.Close; //zamknij otwarty dataset
with zquery20, SQL do
begin
Clear; //wyczyść sql
Add('insert into pasazer (nazwisko, imie ) ');
add('values (:nazwisko,:imie);');
parambyname('nazwisko').AsString:=dana1;
parambyname('imie').AsString:=dana2;
execSQL;
showmessage(dana1+' '+Dana2+' '+dana3+' '+dana4+' '+dana5);
end;
end;
0

ok, ale wtedy wyskakuje błąd:

screenshot-20200710234627.png

1

Nie podałeś całego kodu, ale najlepiej będzie jak do wykonania insert skorzysyasz z innego datasetu

var
  tmpquery: TZQuery;
begin
  zquery20.First;
  if not zquery20.Locate('nazwisko,imie,miasto,ulica,kod_pocztowy', VarArrayOf([dana1, dana2, dana2, dana4, dana5]), []) then
  begin
    tmpquery:=TZQuery.Create(nil);
    tmpquery.connection:=zconnection1;
    with tmpquery, SQL do
    begin
      Add('insert into pasazer (nazwisko, imie ) ');
      Add('values (:nazwisko,:imie);');
      parambyname('nazwisko').AsString:=dana1
      parambyname('imie').AsString:=dana2;
      execSQL;
      showmessage(dana1+' '+Dana2+' '+dana3+' '+dana4+' '+dana5);
    End;
    Tmpquery.free;
  end;
end;

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