Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tabela z zapamiętywaniem stanów poprzednich
sazian
post 21.11.2012, 21:58:28
Post #1





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


Witam,
zastanawiałem się ostatnio nad pewnym problemem, a mianowicie jak zapisywać dane w tabeli z zapamiętywaniem stanów poprzednich.
Prosty przykład
mam tabelę kontrahenci z kolumnami idKontrahenta, nazwa, adres
oraz drugą tabelę faktury z kolumnami idFaktury, idKontrahenta, data, ....

i teraz dodaję kontrahenta i wystawiam mu faktury.
Po jakimś czasie kontrahent zmienił adres, czyli robię update na tabelę kontrahenci.
Ale niestety powstaje problem, zostaną zmienione dane w już wystawionych fakturach co jest niewłaściwe.

Rozwiązanie jakie wymyśliłem:
do tabeli z kontrahentami dodaje dwie dodatkowe kolumny: dataOd oraz dataDo które zrazem z idKontrahenta są kluczem głównym.
Robiąc UPDATE de facto tworzę kolejny rekord zmieniając odpowiednio daty
Czyli np.
po dodaniu kontrahenta mam jeden rekord:
idKontrahenta,dataOd,dataDo, nazwa, adres
1 , 01.01.2012, 00.00.0000, 'nazwa 1', 'adres 1'

natomiast po UPDATE mam dwa rekordy
1 , 01.01.2012, 02.02.2012, 'nazwa 1', 'adres 1' <-- rekord historyczny
1 , 02.02.2012, 00.00.0000, 'nazwa 1', 'adres 2' <-- aktualny rekord

Robiąc SELECT z tabeli faktury(złączenie z kontrahentami) muszę dodatkowo uwzględnić przedział czasowy.
Do robienia INSERT'a i UPDATE oczywiście muszę napisać odpowiednie procedury.
takie rozwiązanie ma pewną poważna wadę,a mianowicie nie mogę użyć auto inkrementacji :/


Czy takie rozwiązanie jest dobre/sensowne ? są jakieś lepsze questionmark.gif co o tym myślicie questionmark.gif
Go to the top of the page
+Quote Post
mmmmmmm
post 21.11.2012, 23:31:30
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Wystawiona faktura jest "święta" - nie można nic w niej zmieniać. Zazwyczaj robi się to w ten sposób, że kopiuje się odpowiednie pola z tabeli kontrahenci do tabeli nagłówka faktury. I to dobry zwyczaj.
Sposób, który pokazałeś to może być dobry, ale do historii zmian danych. (Sam też taki używam). Niestety może być niewydajny.
Go to the top of the page
+Quote Post
markonix
post 22.11.2012, 00:35:20
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Zdubluj przy każdej fakturze wszystkie dane kontrahenta jak i sprzedawcy - każde pole.
Wszystko na fakturze można zmieniać (zwłaszcza przed wysłaniem do klienta) i musisz taką możliwość dać.

Oprócz tego chcesz jeszcze przetrzymywać stany poprzednie faktury (wszelkie edycje)?


--------------------
Go to the top of the page
+Quote Post
sazian
post 22.11.2012, 19:33:30
Post #4





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


ok, małe wyjaśnienie.
Przykład z kontrahentami i fakturami był dosłownie przykładem mającym na celu zobrazowanie tego typu problemu.
Innym przykładem mogą być zamówienia w sklepie. Ktoś kupuje produkt, a po jakimś czasie zmieniamy jego cenę ale w zamówieniu musi być cena historyczna. W tym przykładzie powstaje jeszcze jeden problem wszak oprócz historycznej ceny mogą być przydatne takie informację jak stawka vat, czy towar był w promocji, jak była nazwa ....
I co takiej sytuacji questionmark.gif

Z jednej strony mogę zrobić tak jak napisaliście, czyli zapisać te dane w tabeli z zamówionymi towarami ale w taki sposób powstają dane nadmiarowe przy każdym zamówieniu.

Drugie rozwiązanie to to o którym pisałem, czyli zapisanie przedziałów czasowych przy edycji ale tutaj również mogą powstawać dane nadmiarowe jeśli np. nie potrzebujemy historycznych opisów które mogą być bardzo długie i zajmować sporo miejsca.

Więc może jakieś inne rozwiązanie?? np osobna tabela na dane historyczne questionmark.gif

Co o tym myślicie ?


Cytat(mmmmmmm @ 21.11.2012, 23:31:30 ) *
Wystawiona faktura jest "święta" - nie można nic w niej zmieniać.

Z tego co wiadomo to może być dowolnie modyfikowana(w przeciwieństwie do paragonu fiskalnego) do czasu zaksięgowania w tych różnych dziwnych księgach przychodu i rozchodu - czy coś takiego biggrin.gif


Cytat(markonix @ 22.11.2012, 00:35:20 ) *
Oprócz tego chcesz jeszcze przetrzymywać stany poprzednie faktury (wszelkie edycje)?


no właśnie nie wiem biggrin.gif jest sens to robić questionmark.gif a może ktoś ma doświadczenie z programami księgowymi i podzieli się jak to wygląda w tego typu programach smile.gif
Go to the top of the page
+Quote Post
patrycjaBS
post 25.11.2012, 20:11:08
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 25.11.2012
Skąd: Pszczyna

Ostrzeżenie: (0%)
-----


Cytat(sazian @ 22.11.2012, 19:33:30 ) *
Innym przykładem mogą być zamówienia w sklepie. Ktoś kupuje produkt, a po jakimś czasie zmieniamy jego cenę ale w zamówieniu musi być cena historyczna. W tym przykładzie powstaje jeszcze jeden problem wszak oprócz historycznej ceny mogą być przydatne takie informację jak stawka vat, czy towar był w promocji, jak była nazwa ....
I co takiej sytuacji questionmark.gif


Miałam do czynienia z kilkoma tego typu systemami i w każdym rozwiązane było to dokładnie w ten sposób:

Cytat(sazian @ 22.11.2012, 19:33:30 ) *
Z jednej strony mogę zrobić tak jak napisaliście, czyli zapisać te dane w tabeli z zamówionymi towarami ale w taki sposób powstają dane nadmiarowe przy każdym zamówieniu.


Danych nadmiarowych nie unikniesz w tej sytuacji. Poza tym, po jakiejkolwiek zmianie nie są już one nadmiarowe. Jeżeli nie wykorzystujesz w żaden inny sposób tej historii zmian, nie ma sie co w to bawic. To samo tyczy sie np. zmian adresow klienta - w tabeli z zamowieniami/fakturami zapisujesz po prostu kopie adresu, aktualnej ceny itp. Prawdopodobnie nie uciekniesz od takiego rozwiazania.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 17:12