To nie jest takie proste.
Ogólnie w grę wchodzi 5 tabel:
Jeśli chodzi o sprzedaż:
POS(ID_TRANS, ID_TOW, ILOSC, NETTO, BRUTTO)
TRANSAKCJE(ID, DATA, DOK_TYP)
FAKTURY(ID_TRANS, NUMER)
Jeśli chodzi o zakup:
TOW_DOKMAG(ID_DOKMAG, ID_TOW, ILOSC, NETTO, BRUTTO)
DOKMAG(ID, ID_DOST, DATA, NUMER)
Przedstawiłem tylko kolumny, które odgrywają tu jakąś rolę.
I teraz tak POS przetrzymuje towary(i usługi - rozróżniam to polem smallint: CZY_USL), które zostały sprzedane w transakcji. Transakcja ma datę i typ dokumentu, jaki został wystawiony(faktura, czy paragon) FAKTURY mają numer faktury, a także numer paragonu
Jeśli chodzi o zakup to:
tow_dokmag przechowuje towary, które zostały zakupione i id dokumentu magazynowego, który jest jakby dowodem zakupu. Dokument magazynowy ma datę i program zakłada, że zawsze jest to faktura
Muszę pokazać następujące pola:
Nr paragonu(z FAKTURY lub pusta)
Nr Faktury(z FAKTURY lub DOKMAG)
Typ dokumenu(z TRANSAKCJE lub jeśli sprzedaż to zawsze 'faktura')
OPERACJA('sprzedaż' lub 'kupno')
Ilość(POS lub TOW_DOKMAG)
Data(TRANSAKCJE lub DOKMAG)
Netto, Brutto(POS lub TOW_DOKMAG)
Kontrahent(TRANSAKCJE lub DOKMAG)
Moje niedziałające zapytanie(składnia: UNION) wygląda tak:
select f.numer as nr_fak, f1.numer as nr_par, tr.dok_typ as dok_typ,
'sprz' as operacja, pos.ilosc as ilosc, tr.data as data,
(pos.netto_sprz*ilosc) as wart_n, (pos.brutto_sprz*ilosc) as wart_b,
(case when tr.id_klienta<0 then 'Anonimowy' else
(case when kl.imie = '' then kl.firma_nazwa else kl.imie || ' ' || kl.nazwisko end) end)
as kontrahent
from pos
left join transakcje tr on pos.id_trans = tr.id
left join faktury f on f.id_trans = tr.id and f.typ = 'F'
left join faktury f1 on f1.id_trans = tr.id and f.typ = 'P'
left join klienci kl on kl.id = tr.id_klienta
where pos.id_ut = 29
union
select d.numer as nr_fak, '' as nr_par, 'f' as dok_typ,
'kupno' as operacja, td.ilosc as ilosc, d.data as data,
(td.netto_z*ilosc) as wart_n, (td.brutto_z*ilosc) as wart_b,
dost.nazwa as kontrahent
from tow_dokmag td
left join dokmag d on d.stantyp=1 and td.id_dokmag = d.id
left join dostawcy dost on d.id_dost = dost.id
where td.id_tow = 29
To powinno pokazać tą "historię" dla towaru o id=29.
Z osobna te zapytania działają.
Pierwsze pokazuje historię sprzedaży, drugie zakupu. A chodzi o to, żeby zadziałały razem. Żebym dostał zbiór sprzedaży i zakupu
Moje drugie niedziałające(zawsze zwraca pusty zbiór) zapytanie oparte na case'ach wygląda tak:
select
(case when pos.ilosc is null then d.numer else f.numer end) as nr_fak,
(case when pos.ilosc is null then '' else f1.numer end) as nr_par,
(case when pos.ilosc is null then 'f' else tr.dok_typ end) as dok_typ,
(case when pos.ilosc is null then 'kupono' else 'sprz' end) as operacja,
(case when pos.ilosc is null then td.ilosc else pos.ilosc end) as ilosc,
(case when pos.ilosc is null then d.data else tr.data end) as data,
(case when pos.ilosc is null then (td.netto_ztd.ilosc) else (pos.netto_sprzpos.ilosc) end) as wart_n,
(case when pos.ilosc is null then (td.brutto_ztd.ilosc) else (pos.brutto_sprzpos.ilosc) end) as wart_b,
(case when pos.ilosc is null then dost.nazwa else
(case when tr.id_klienta<0 then 'Anonimowy' else
(case when kl.imie = '' then kl.firma_nazwa else kl.imie || ' ' || kl.nazwisko end) end) end) as kontrahent
from pos, tow_dokmag td
inner join transakcje tr on pos.id_trans = tr.id
inner join faktury f on f.id_trans = tr.id and f.typ = 'F'
inner join faktury f1 on f1.id_trans = tr.id and f.typ = 'P'
inner join klienci kl on kl.id = tr.id_klienta
inner join dokmag d on d.stantyp=1 and td.id_dokmag = d.id
inner join dostawcy dost on d.id_dost = dost.id
where td.id_tow = 29 and pos.id_ut=29 and pos.czy_usl=0