Zmiana roku a organizacja bazy
Zmiana roku a organizacja bazy
Witam.
Używam dla celów zawodowych stworzonej przez siebie relacyjnej bazy mysql a sbase pakietu OpenOffice wykorzystuje jako swojego rodzaju fronteg do korzystania z bazy i wprowadzania danych, czyli raporty, formularze , kwerendy itp. Baza chodzi w wewnętrznej sieci i ma łącznie kilkanaście tabel i w miarę możliwości ciągle ją rozwijam.
W bazie - ogólnie rzecz biorąc rejestruję usługi i ich dane w tym osobowe etc.
Najważniejszy w tej bazie jest tzw. numer usługi, który jest nadawany jako kolejny i łamany przez dany rok np. 112/10 a następna usługa będzie miała numer 113/10 i tak dalej, numery te są nadawane od nr 1 od 1 stycznia danego roku do końca grudnia tego samego roku, a w następnym roku muszą być nadawane znowu od nr 1 i łamane przez następny rok czyli np. 1/11, 2/11 itd.
Na razie rozwiązałem to w ten sposób, że w głównej tabeli bazy np. o nazwie "dane_2010" jest oczywiście utworzony klucz główny na polu INTEGER o wartości autoincrement, tak, że pole automatycznie się numeruje przy dopisywaniu kolejnej usługi i wartość tego pola jest w mojej bazie właśnie numerem kolejnej usługi. Nr kolejnej usługi musi generować się automatycznie ponieważ nieraz jednocześnie kilka osób w sieci rejestruje kolejne usługi i automatycznie nadawanie tego numeru zapobiega pomyłkom. Natomiast wartość drugą tego numeru usługi czyli rok aktualnie mam rozwiązany w ten sposób, że jest to drugie pole testowe o wartości domyślnej, w tym roku jest to "/10", chociaż to pole równie dobrze może być polem aktualnej daty, z które odczytuje się tylko rok.
Mój problem polega na właściwej organizacji bazy, przy zmianie roku a właściwie jej podziałem na poszczególne lata.
Aktualnie rozwiązane mam to w ten sposób, że przy zmianie roku tworzę nową wyczyszczoną tabelę główną bazy czyli np "dane_2011" oraz nowe niektóre inne tabele powiązane kluczami obcymi z polem klucza głównego tej tabeli "dane_2011". Rozwiązanie to oczywiście działa ale wymaga tworzenia nowych tabel a w sbase wymaga tworzenia nowych niektórych formularzy na nowy rok.
Do bazy wpisuje się rocznie tylko kilka tysięcy rekordów a więc nie jest to dużo, dlatego też chciałbym znaleźć takie rozwiązanie aby przy zmianie roku nie tworzyć nowych tabel bazy a zostawić ich w tej postaci w której są, i aby w jakiś sposób w każdym kolejnym roku wymusić nadawanie w bazie numerów kolejnych usług od nr 1 łamanego przez kolejny roku czyli jak napisałem powyżej 1/11, 2/11, 3/11 itd... Oczywiście nr kolejnych usług muszą nadawać się automatycznie.
Może ma ktoś jakiś ciekawy pomysł jak to rozwiązać - to proszę o poradę czy też sugestię. Ciekawi mnie też jak działają wielkie profesjonalne bazy tego typu przy zmianie roku.
pozdrawiam.
Używam dla celów zawodowych stworzonej przez siebie relacyjnej bazy mysql a sbase pakietu OpenOffice wykorzystuje jako swojego rodzaju fronteg do korzystania z bazy i wprowadzania danych, czyli raporty, formularze , kwerendy itp. Baza chodzi w wewnętrznej sieci i ma łącznie kilkanaście tabel i w miarę możliwości ciągle ją rozwijam.
W bazie - ogólnie rzecz biorąc rejestruję usługi i ich dane w tym osobowe etc.
Najważniejszy w tej bazie jest tzw. numer usługi, który jest nadawany jako kolejny i łamany przez dany rok np. 112/10 a następna usługa będzie miała numer 113/10 i tak dalej, numery te są nadawane od nr 1 od 1 stycznia danego roku do końca grudnia tego samego roku, a w następnym roku muszą być nadawane znowu od nr 1 i łamane przez następny rok czyli np. 1/11, 2/11 itd.
Na razie rozwiązałem to w ten sposób, że w głównej tabeli bazy np. o nazwie "dane_2010" jest oczywiście utworzony klucz główny na polu INTEGER o wartości autoincrement, tak, że pole automatycznie się numeruje przy dopisywaniu kolejnej usługi i wartość tego pola jest w mojej bazie właśnie numerem kolejnej usługi. Nr kolejnej usługi musi generować się automatycznie ponieważ nieraz jednocześnie kilka osób w sieci rejestruje kolejne usługi i automatycznie nadawanie tego numeru zapobiega pomyłkom. Natomiast wartość drugą tego numeru usługi czyli rok aktualnie mam rozwiązany w ten sposób, że jest to drugie pole testowe o wartości domyślnej, w tym roku jest to "/10", chociaż to pole równie dobrze może być polem aktualnej daty, z które odczytuje się tylko rok.
Mój problem polega na właściwej organizacji bazy, przy zmianie roku a właściwie jej podziałem na poszczególne lata.
Aktualnie rozwiązane mam to w ten sposób, że przy zmianie roku tworzę nową wyczyszczoną tabelę główną bazy czyli np "dane_2011" oraz nowe niektóre inne tabele powiązane kluczami obcymi z polem klucza głównego tej tabeli "dane_2011". Rozwiązanie to oczywiście działa ale wymaga tworzenia nowych tabel a w sbase wymaga tworzenia nowych niektórych formularzy na nowy rok.
Do bazy wpisuje się rocznie tylko kilka tysięcy rekordów a więc nie jest to dużo, dlatego też chciałbym znaleźć takie rozwiązanie aby przy zmianie roku nie tworzyć nowych tabel bazy a zostawić ich w tej postaci w której są, i aby w jakiś sposób w każdym kolejnym roku wymusić nadawanie w bazie numerów kolejnych usług od nr 1 łamanego przez kolejny roku czyli jak napisałem powyżej 1/11, 2/11, 3/11 itd... Oczywiście nr kolejnych usług muszą nadawać się automatycznie.
Może ma ktoś jakiś ciekawy pomysł jak to rozwiązać - to proszę o poradę czy też sugestię. Ciekawi mnie też jak działają wielkie profesjonalne bazy tego typu przy zmianie roku.
pozdrawiam.
Windows 7 i openoffice 3.2
Re: Zmiana roku a organizacja bazy
Czyli że Twój numer usługi jest kluczem zewnętrznym. Dla bazy jest lepiej, jeżeli klucze zewnętrzne nie będą kluczami tabel, by w razie reorganizacji tych pierwszych uniknąć trudności.
Ja bym pozostawił autoinkrementację klucza głównego -- niech sobie rośnie -- i dodał pole numeru usługi, którego wartość byłaby nadawana automatycznie wg funkcji. Funkcję trzeba sobie napisać, mysql ma odpowiednie środki po temu.
Ja bym pozostawił autoinkrementację klucza głównego -- niech sobie rośnie -- i dodał pole numeru usługi, którego wartość byłaby nadawana automatycznie wg funkcji. Funkcję trzeba sobie napisać, mysql ma odpowiednie środki po temu.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Zmiana roku a organizacja bazy
Dzięki za podpowiedź "Jan_J"
Właśnie tak mogłoby być - potrzebne mi jest pole numer usługi, którego wartość będzie się automatycznie nadawała od 1,2, 3 itd. począwszy od 1 stycznia a skończywszy na ostatnim grudnia danego roku, a z dniem 1 stycznia następnego roku znowu zacznie liczyć się od 1, 2, 3 i itd.
Niestety na pisaniu funkcji dla mysql kompletnie się nie znam - to proszę jeżeli to możliwe o podanie mi przykładu takiej funkcji.
pozdrawiam
Właśnie tak mogłoby być - potrzebne mi jest pole numer usługi, którego wartość będzie się automatycznie nadawała od 1,2, 3 itd. począwszy od 1 stycznia a skończywszy na ostatnim grudnia danego roku, a z dniem 1 stycznia następnego roku znowu zacznie liczyć się od 1, 2, 3 i itd.
Niestety na pisaniu funkcji dla mysql kompletnie się nie znam - to proszę jeżeli to możliwe o podanie mi przykładu takiej funkcji.
pozdrawiam
Windows 7 i openoffice 3.2
Re: Zmiana roku a organizacja bazy
Może zacząć zabawę od kolumny z domyślną wartością "data aktualna"?Natomiast wartość drugą tego numeru usługi czyli rok aktualnie mam rozwiązany w ten sposób, że jest to drugie pole testowe o wartości domyślnej, w tym roku jest to "/10", chociaż to pole równie dobrze może być polem aktualnej daty, z które odczytuje się tylko rok.
Kod: Zaznacz cały
create table "t" ("id" bigint identity, "data" date default current_date)
OOo3.1.1 na Ubuntu 9.04
Re: Zmiana roku a organizacja bazy
Niestety mq2
kod w mysql-u wywala mi poniższy błąd:
chyba coś ze składnią - ale nie wiem jak to sprawdzić - wygląda jakby mysql czegoś tu nie obsługiwał;
pozdrawiam
kod w mysql-u wywala mi poniższy błąd:
Kod: Zaznacz cały
mysql> create table "t" ("id" bigint identity, "data" date default current_date);
ERROR 1064 (42000): Something is wrong in your syntax obok '"t" ("id" bigint ide
ntity, "data" date default current_date)' w linii 1
mysql>
pozdrawiam
Windows 7 i openoffice 3.2
Re: Zmiana roku a organizacja bazy
To co podałem wpisuje się w "Poleceniu SQL" w Base (przy domyślnym silniku - HDBSQL). Żeby zobaczyć utworzoną tabelę, trzeba przeładować plik.kod w mysql-u wywala mi poniższy błąd:
OOo3.1.1 na Ubuntu 9.04
Re: Zmiana roku a organizacja bazy
Faktycznie w base na silniku HDBSQL działa.
pomyślimy jak to mogę wykorzystać w swojej bazie i przełożyć na mysql-a
w paru tabelach mysqla przy relacjach używam domyślnej daty w postaci pól timestamp
z opcją aktualizacji
oraz bez opcji aktualizacji
jednak ciągle pozostaje mi problem jak stworzyć w mysql poza kluczem głównym pole które co roku będzie mi się od nowa automatycznie liczyło od 1,2,3 itd.
tak jak napisałem w pierwszym poście.
pozdrawiam
pomyślimy jak to mogę wykorzystać w swojej bazie i przełożyć na mysql-a
w paru tabelach mysqla przy relacjach używam domyślnej daty w postaci pól timestamp
z opcją aktualizacji
Kod: Zaznacz cały
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Kod: Zaznacz cały
NOT NULL DEFAULT CURRENT_TIMESTAMP
jednak ciągle pozostaje mi problem jak stworzyć w mysql poza kluczem głównym pole które co roku będzie mi się od nowa automatycznie liczyło od 1,2,3 itd.
tak jak napisałem w pierwszym poście.
pozdrawiam
Windows 7 i openoffice 3.2
Re: Zmiana roku a organizacja bazy
Mając "id" oraz "datę wpisu" rekordów można obliczyć numery porządkowe danym roku:jak stworzyć w mysql poza kluczem głównym pole które co roku będzie mi się od nowa automatycznie liczyło od 1,2,3 itd.
dla tabeli "t": "id", "data"
Kod: Zaznacz cały
a) wybierz rekordy z danego roku (można podać liczbę lub dla obecnego roku year(current_date))
b) z rekordów "a)" wybierz rekord z minimalnym "id" (pierwszy w danym roku)
c) wyświetl rekordy "a)" z wartością ["id" - "b)" + 1]
Kod: Zaznacz cały
select "t"."id"-"min"+1 from
(select (min("t"."id")) as "min" from "t" where (year("t"."data")=year(current_date))) as "kw_min",
"t"
where (year("t"."data")=year(current_date))
- Załączniki
-
- pierwszy_numer_w_roku.odb
- (3.68 KiB) Pobrany 216 razy
OOo3.1.1 na Ubuntu 9.04