SamoChwała
28.07.2004, 11:57:35
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!
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
28.07.2004, 12:32:18
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
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
28.07.2004, 13:11:58
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
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
28.07.2004, 13:58:47
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.