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?