Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Autonumeracja (licznik)
Forum PHP.pl > Forum > Przedszkole
SamoChwała
Witam,

Jak mozna rozwiązć problem autonumeracji (licznika) pola np. ID zaleznego od roku, zachowując ciągłoś numerowania danego rocznika. Baza jest aktualizowana praktycznie na bieżąco, jedna zdarza się wstawiać rekord lub kilka z lat poprzednich. Do tej pory dane były zapisywane w osobnych tabelach, ale zaczyna to być uciążliwe.

Czy zechce mi ktoś pomóc!
mhs
a czy nie lepiej jest przechowywac w osobnym polu date danego zdarzenia? nie wiem jak chcesz wplynac na system zarzadzania baza danych aby ten uzaleznial numerowanie rekordow (w tym przypadku mowimy o polu AUTO_INCREMENT, ktore jest kluczem (sztucznym) glownym tabeli) od roku....... mozesz podac wiecej szczegolow dotyczacych tego w jaki sposob sa do tej pory zorganizowany jest projekt bazy oraz jaki mialby byc po przeprowadzonych zmianach?
SamoChwała
Obecnie wygląda to tak (wykaz tabel):
1. tab_2001 (id, data, opis, komentarz)
2. tab_2002 (id, data, opis, komentarz)
3. tab_2003 (id, data, opis, komentarz)
4. tab_2004 (id, data, opis, komentarz)

gdzie:

id - (AUTO_INCREMENT)
data - (date)
opis - (text)
komentarz - (text)

Chcę to trzymać w jednej tabeli. Probowałem sam coś napisać, ale bez rezultatu. Oczywiście pole id (AUTO_INCREMENT) zmieniłem na INT.

Obecnie jesli chcę dodać rekord z rocznika 2003 to muszę otwierać tabelę tab_2003 itd. Jest to dość uciążliwe przy dużej ilości danych (o pomyłkę w rocznikach nietrudno) gdyż ciągle muszę pamiętać o wybraniu prawidłowej tabeli.

Chcialbym by wyglądało to tak:
1. wpisuję date np. 12-05-2003
2. pojawia się komunikat (czy wprowadzona data jest prawidłowa)
3. potwierdzam (lub nie)
4. jesli potwierdziłem nadawany jest kolejny nr (id) dla danego rocznika zgodnego z datą
dla przykładu: (2001 ma id = 123; 2002 ma id = 76; 2003 ma id = 201) jeśli data będzie zawierała rok 2003 to po dodaniu id powinno otrzymać 202)
5. uzupełniam pozostałe dane
6. jeśli nie potwierdzę, pole daty jest czyszczone i ponownie dostępne do wprowadzenia poprawnej daty
mhs
sluchaj... jak dla mnie to fakt z jakiego przedzialu jest wartosc klucza glownego tabeli nie ma zadnego znaczenia... i nie ma sensu bawic sie w jakies przedzialy..

w modelu relacyjnym nie ma znaczenia w jakiej kolejnosci sa poukladane wiersze w tabeli... wg. bledem bylo tworzenie 4 (i pewnie juz nie dlugo wiecej) tabel dla opisu tej samych obiektow czy zdarzen...

ja na Twoim miejscu (aczkolwiek nie znam dokladnie projektu) po prostu wzialbym i utworzyl jedna tabele do ktorej skopiowalbym wszystkie rekordy z tych tabel...

a jezeli chodzi o samo dodawanie rekordow to wystarczy stworzyc formularz gdzie utworzysz pola ktore bedzie trzeba wypelnic.. po wypelnieniu uzytkownik wysyla dane... ktore sa sprawdzane a nastepnie w przypadku ich poprawnosci dodawane do bazy danych...
SamoChwała
Cytat(mhs @ 2004-07-28 11:51:43)
w modelu relacyjnym nie ma znaczenia w jakiej kolejnosci sa poukladane wiersze w tabeli... wg. bledem bylo tworzenie 4 (i pewnie juz nie dlugo wiecej) tabel dla opisu tej samych obiektow czy zdarzen...

Co do spójności danych jak najbardziej masz rację i to nie podlega żadnej dyskusji. W tym odrębnym jednak przypadku ma to znaczenie zasadnicze. Id jest nr kolejnym protokołu pomiarowego i zasady przyjete w zakładzie w którym pracuję są takie jakie są. Każdy protokól ma odrębny nr. Jeśli w 2003 ostatnim nr był 205, to w 2004 pierwszy musi mieć nr 1 a nie 206. W Accessie miałem to rozwiązane tak jak poniżej. Musiałem jednak przenieść całość do INTRANETU (z Accessem w sieci były i są spore kłopoty) php znam zbyt słabo i nie potrafię tej funkcji przetłumaczyć na kod zrozumiały dla php.

Kod
Private Sub tempDataWyst_LostFocus()
Dim sprData As Variant
If IsDate(Me![tempDataWyst]) And [NrPkt] = 0 Then
    sprData = DMax("[DataWyst]", "Protokoly", "Year([DataWyst])=Year(Forms![ProtokolyDodaj]![tempDataWyst])")
    If (Me![tempDataWyst] - sprData > 3) Or (Me![tempDataWyst] - sprData < 0) Or IsNull(sprData) Then
        odp = MsgBox("Czy data jest prawidłowa?", vbOKCancel, "Uwaga")
        If odp <> 1 Then
            Me![tempDataWyst].SetFocus
            Exit Sub
        End If
    End If
mhs
mimo wszystko osobiscie zrobilbym sobie jedna tabele i oprocz klucza (AUTO_INCREMENT) dodalbym jeszcze pole np. NrPomiaru INT gdzie zapisywalbym numer wpisu... ale mniejsza oto

powiedz mi... co dokladnie chcesz napisac? formularz i obsluge tego fromularza, wg wzoru ktory zaprezentowales?

ps. jezeli chodzi o ta procedure ktora tutaj przedstawiles to mimo iz mialem kontakt swego czasu z VB to nie jest ona w 100 % dla mnie jasna... musialbym szukac po dokumentacji...
SamoChwała
Jeśli byłbyś tak uprzejmy to tak. Formularz może być szczątkowy, lub wyjasnienie jak odwołać się do tej funkcji.

Zadałem jeszcze jedno pytanie na formu:
php.pl może znasz odp.

Dzieki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.