SQLite - zależności pomiędzy kolumnami tabeli

0

Witajcie,
Korzystam z bazy SQLite

Chciałbym stworzyć taką tabelę w bazie która będzie przechowywała dane produktów z faktury VAT.
I tak.
Użytkownik wrzuci do bazy tylko takie dane jak: Lp., Nazwa produktu, Kod, PKWIU, Ilość, Jm. Cena netto [zł], VAT[%]

Pozostałe pola takie jak Kwota VAT [zł], Wartość netto [zł], Cena brutto [zł] będą się miały do siebie następująco:

Wartość netto [zł] = Cena netto[zł] * Ilość
Kwota VAT [zł] = Wartość netto [zł] * VAT[%]*0.01
Cena brutto [zł] = Wartość netto [zł]+kwota VAT[zł]

i dałem następujące polecenie SQL:

create table Faktura(lp int, nazwa varchar(30), kod varchar(30), pkwiu varchar(30), ilosc double, jm varchar(30), cena_netto double, wartosc_netto = (cena_netto*ilosc) double, stawka_vat_percent double, kwota_vat = (wartosc_netto*stawka_vat_percent*0.01) double, wartosc_brutto = (wartosc_netto+kwota_vat) double);

Moje pytanie jest takie jak właśnie ustawiać te relacje matematyczne pomiędzy poszczególnymi komórkami.

np.

jak byśmy mieli następującą tabelkę z trzema kolumnami
A - int
B - int
C - int

i jak za pomocą SQL np. stworzyć taką tabelkę która będzie miała te 3 kolumny ale np. kolumna C będzie się równała (A+B)*0.5

Z góry dziękuję za odpowiedź,
jestem początkujący w temacie, proszę o wyrozumiałość :)

1

Ja bym zastosował trigger. Tworzysz trigger który się włącza w trakcie dodwania danych do tabeli, czyli użytkownik uzupełnia Nazwa produktu, Kod, PKWIU, Ilość, Jm. Cena netto [zł], VAT[%]. Następnie z automatu zostają uzupełnione pozostałe pola:

Create trigger ustaw_wartosci 
Before insert on Faktura
for each row
begin
:new.wartosc_netto = :new.cena_netto * :new.ilosc;
:new.kwota_vat = :new.wartosc_netto*:new.stawka_vat_percent*0.01;
:new.wartosc_brutto = :new.wartosc_netto+ :new.kwota_vat;
end;

Spowoduje to ze przed wykonaniem każdego insertu zostaną pobrane wartości, zmodyfikowane i dopiero dodane do tabeli. Warto poczytać o triggerach - w sqllite występują triggery ale nie wiem czy w takiej składni jak podałem powyżej.
Pozdrawiam

PS. Na przyszłość używaj kolorowania składni

2

Przechowywanie redundantnych wartości nie jest najlepszym pomysłem, to marnowanie miejsca i prosta droga do utracenia spójności danych.
Trigger nie jest dobrym pomysłem, bo zaciemnia logikę działania aplikacji - część wartości w bazie bierze się nie wiadomo skąd i dopiero po przeczytaniu dokumentacji (kosztuje czas) lub uważnej analizie kodu (czas!) można dowiedzieć się, dlaczego tak się dzieje. Ponadto trzymanie logiki aplikacji w dwóch miejscach (baza danych i program o nią oparty) to fatalne rozwiązanie łamiące programistyczne feng-szui.
Jeśli już musisz robić coś takiego na poziomie bazy danych, to użyj view, tak od razu będzie widać skąd bierze się dodatkowa kolumna i dane w niej.

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