[FB] Procedury składowane nie insertują do końca rekordó

0

Cześć, na FireBirdzie mam problem, którego ostatnio nie było i wszystko działało dobrze. Nagle sie pojawił, chociaż ja nic nie zmieniałem.

Mam 3 procedury składowane.
COPY_TRANS - jej zadaniem jest "skopiowanie" transakcji o podanym ID.
(pisząc transakcja mam na myśli rekord z tabeli Transakcje - sprawy czysto sprzedażowe)

CREATE_KOR_TRANS - jej zadaniem jest wywołanie COPY_TRANS i odpowiedni update transakcji utworzonej przez COPY_TRANS. Następnie do tabeli pomocniczej(POS) ma włożyć "różnicę" rekordów będących w tej właśnie tabeli(z odpowiednim id_transakcji) i tymczasowej tabeli temp_kor

CREATE_FAK_KOR - jej zadaniem jest utworzenie w tabeli faktury rekordu odzwierciedlającego fakturę korygującą, a także odpowiednie połączenie nowego rekordu z transakcją utworzoną w COPY_TRANS, a także zmodyfikowanie rekordu reprezentującego fakturę korygowaną przez wypełnenie pola ID_KOREKTY.

Załączam kody tych procedur - pomijam bloki deklaracyjne

COPY_TRANS

begin
/* pobranie danych do kopiowania */
  SELECT NUMER, ID_SALONU, id_klienta,  ID_WALUTY, id_platnosci, DATA
  from transakcje
  where ID = :ID_TRANS /* id_trans to parametr wchodzący */
  INTO :numer, :id_salonu, :id_klienta, :id_waluty, :id_platnosci, :data;

/* tworzenie nowego rekordu */
  INSERT INTO TRANSAKCJE(NUMER, id_salonu,  ID_KLIENTA, id_waluty,  id_platnosci,
                         data, WART_N, WART_B, KWOTA_VAT, DOK_TYP)
         values(:numer, :id_salonu, :id_klienta, :id_waluty, :id_platnosci,
                :data, 0, 0, 0, 'K');

  select max(id) from transakcje into :new_id;  /* new_id to parametr wychodzący */
  suspend;
end

CREATE_KOR_TRANS

begin
/* kopiowanie transakcji */
   execute procedure COPY_TRANS(:ID_TRANS) returning_values :new_id;

/* pobieram netto i brutto */
  select wart_n, wart_b from transakcje where id = :id_trans /* parametr wchodzący */
  into :netto, :brutto;

/* obliczam netto, brutto i kwote vat do nowej transakcji */
  netto_new = netto - netto_ret;  /* netto_ret itd. to też parametry wchodzące */
  brutto_new = brutto - brutto_ret;
  kw_vat = brutto_new - netto_new;

/* update'uje nowa transakcje tymi kwotami*/
  update transakcje set
         wart_n = :netto_new,
         wart_b = :brutto_new,
         kwota_vat = :kw_vat
  where id = :new_id;


/* tworze nowe rekordy w tabeli pos */
/* najpierw towary */
  for
    select id_ut, ilosc from pos where id_trans = :id_trans and czy_usl = 0
    into :pos_id_ut, :pos_ilosc
  do
  begin
    select sztuk from temp_kor where id=:pos_id_ut and sztuk is not null
    into :tk_ilosc;

    /* dodawanie rekordu do tabeli pos */
    if (:tk_ilosc is not null) then
    begin
      roznica_sztuk = pos_ilosc - tk_ilosc;
    end else roznica_sztuk = pos_ilosc;
    if (roznica_sztuk>0) then  /* jesli zwrocono caly towar to go nie dodawaj */
    begin
       insert into pos(id_trans, czy_usl, id_ut, ilosc)
              values(:new_id, 0, :pos_id_ut, :roznica_sztuk);
    end
  end /* for */


/* teraz uslugi */
  for
    select id_ut, ilosc from pos where id_trans = :id_trans and czy_usl = 1
    into :pos_id_ut, :pos_ilosc
  do
  begin
    select count(*) from temp_kor where id=:pos_id_ut and sztuk is null
    into :tk_ilosc;

    /* dodawanie rekordu do tabeli pos */
    if (:tk_ilosc = 0) then
    begin
      insert into pos(id_trans, czy_usl, id_ut, ilosc)
             values(:new_id, 1, :pos_id_ut, null);
    end
  end /* for */


  suspend;
end

CREATE_FAK_KOR

begin
/* pobranie z faktury korygowanej id_transakcji - trzeba zmienic typ dokumentu */
  SELECT ID_TRANS FROM FAKTURY WHERE ID=:id_fak into :old_trans_id;
/*id_fak - parametr wchodzący - id faktury korygowanej */

/* tworzenie faktury korygujacej */
/* id_trans - parametr wchodzący */
  insert into faktury(numer,  typ, data_wyst, id_trans,  powod, id_fak)
              values(:numer, 'K', current_date, :id_trans, :powod, :id_fak);

/* pobieranie jej id */
  select max(ID) from faktury into :new_id;

/* zmiana w fakturze korygowanej */
  update faktury set id_korekty = :new_id where id=:id_fak;

/* zmiana typu dokumentu w starej transakcji */
  update transakcje set dok_typ = dok_typ || '/K' where id = :old_trans_id;
  suspend;
end

To wszystko w piątek działało. Dzisiaj nie chce.
Efekt jest taki, że wartości, które ma zwracać(IDki nowo zainsertowanych rekordów) zwraca sensownie. Natomiast tych insertowanych rekordów nie ma w tabelach!
Co się stało?

0

po pierwsze to jest źle (i jeszcze w paru miejscach jest tak samo)

select max(id) from transakcje into :new_id;  /* new_id to parametr wychodzący */

wystarczy, że ktoś w międzyczasie doda nowy rekord i już masz złe ID. Poprawnie najpierw powinieneś pobrać pierwszy wolny nr id a dopiero potem dodać rekord razem z id, czyli

new_id = gen_id(nazwa_generatora, 1);

INSERT INTO TRANSAKCJE(
    id, numer, id_salonu, id_klienta, id_waluty,  id_platnosci, data, wart_n, wart_b, kwota_vat, dok_typ)
  VALUES(
    :new_id, :numer, :id_salonu, :id_klienta, :id_waluty, :id_platnosci, :data, 0, 0, 0, 'K');

po drugie tu (dalej też jest podobny błąd)

if (:tk_ilosc is not null) then

powinno być if (tk_ilosc is not null) then

 tk_ilosc nie jest tu parametrem zapytania tylko zwykłą zmienną i tak ją należy traktować

a tak wogóle to jakieś zakręcone to jest :/

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