Zmiana roku a organizacja bazy

Użytkowanie programu bazodanowego

Zmiana roku a organizacja bazy

Postprzez czp » So mar 13, 2010 1:13 pm

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
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Postprzez Jan_J » So mar 13, 2010 11:02 pm

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 Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3973
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zmiana roku a organizacja bazy

Postprzez czp » N mar 14, 2010 4:26 pm

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
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Postprzez mg2 » Pn mar 15, 2010 12:08 am

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   Rozszerz widokZwiń widok
create table "t" ("id" bigint identity, "data" date default current_date)
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm

Re: Zmiana roku a organizacja bazy

Postprzez czp » Pn mar 15, 2010 11:54 am

Niestety mq2

kod w mysql-u wywala mi poniższy błąd:

Kod: Zaznacz cały   Rozszerz widokZwiń widok
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
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Postprzez mg2 » Pn mar 15, 2010 3:44 pm

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
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm

Re: Zmiana roku a organizacja bazy

Postprzez czp » Pn mar 15, 2010 5:29 pm

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   Rozszerz widokZwiń widok
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP


oraz bez opcji aktualizacji

Kod: Zaznacz cały   Rozszerz widokZwiń widok
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
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Zmiana roku a organizacja bazy

Postprzez mg2 » Wt mar 16, 2010 8:05 pm

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   Rozszerz widokZwiń widok
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   Rozszerz widokZwiń widok
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) Pobrane 115 razy
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm


Powrót do Base

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość