Zmiana roku a organizacja bazy

Użytkowanie programu bazodanowego
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Zmiana roku a organizacja bazy

Post autor: czp »

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.
Windows 7 i openoffice 3.2
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana roku a organizacja bazy

Post autor: Jan_J »

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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Post autor: czp »

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
Windows 7 i openoffice 3.2
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Zmiana roku a organizacja bazy

Post autor: mg2 »

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.
Może zacząć zabawę od kolumny z domyślną wartością "data aktualna"?

Kod: Zaznacz cały

create table "t" ("id" bigint identity, "data" date default current_date)
OOo3.1.1 na Ubuntu 9.04
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Post autor: czp »

Niestety mq2

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>
chyba coś ze składnią - ale nie wiem jak to sprawdzić - wygląda jakby mysql czegoś tu nie obsługiwał;

pozdrawiam
Windows 7 i openoffice 3.2
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Zmiana roku a organizacja bazy

Post autor: mg2 »

kod w mysql-u wywala mi poniższy błąd:
To co podałem wpisuje się w "Poleceniu SQL" w Base (przy domyślnym silniku - HDBSQL). Żeby zobaczyć utworzoną tabelę, trzeba przeładować plik.
OOo3.1.1 na Ubuntu 9.04
Awatar użytkownika
czp
Posty: 47
Rejestracja: czw mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Post autor: czp »

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

Kod: Zaznacz cały

DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
oraz bez opcji aktualizacji

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
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Zmiana roku a organizacja bazy

Post autor: mg2 »

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.
Mając "id" oraz "datę wpisu" rekordów można obliczyć numery porządkowe danym roku:

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))
Jeżeli usunięto jakiś rekord to oczywiście z listy wypadnie dany numer.
Załączniki
pierwszy_numer_w_roku.odb
(3.68 KiB) Pobrany 216 razy
OOo3.1.1 na Ubuntu 9.04
ODPOWIEDZ