Avatar billede mikkelk Nybegynder
01. december 2004 - 10:44 Der er 8 kommentarer og
1 løsning

Find ledigt nr.

Jeg har en database med en nummerisk primær nøgle der IKKE bare er fortløbende, det skyldes at de enkelte poster bl.a. grupperes på de to første cifre i nummeret. Når man så i en formular skal tilføje en post, så vælger man først hvilken gruppe, altså hvilke to start-cifre der skal bruges - dernæst skal systemet helst selv komme med et bud på hvad den endelige primære nøgle skal være, den skal altså finde et ledigt nummer inden for gruppen. Vælger man således f.eks. gruppe 17, så skulle den gerne foreslå 170005, hvis numrene 170001 - 170004 er indtil nu er registreret. Den skal også helst forslå numre som er "huller". Altså hvis vi bruger eksemplet fra før, så skal den stadigvæk foreslå nummer 170005 hvis 170006 er registreret...

Er det muligt? og kan man få nogle bud på hvordan man kunne gribe det an?
Avatar billede erikjacobsen Ekspert
01. december 2004 - 10:52 #1
Det er ikke særlig godt, det du har gang i ;)

Løsningen med at prøve sig frem er ikke god. Givet "17", så laver vi en select
med "170001", og så "170002" osv. indtil der er et hul. Tænk på hvor lang tid
det vil tage hvis der er 500 eller 5000 fortløbende numre.

Du kan nemmest droppe tanken om at fylde huller ud. Så kan du have en tabel ved siden
af hvor der står "17","500" hvis "500" er det maksimale nummer. Bruger du "501",
opdateres denne tabel til "17","501" - dette vil tage lige lang tid uanset hvor
store numrene er.

Er det reelt et krav om at huller skal fyldes ud, kan du lave en tabel ved siden
af, hvor de ledige numre står, og også een hvor maksimum står. Her vil du ved
passende indexering kunne finde hullerne tilstrækkeligt hurtigt.

I mine to forslag skal du opdatere de ekstra tabeller ved ændringer i din normale
tabel. Og husk at pakke det ind i transaktioner, hvis du har flere brugere på
databasen.
Avatar billede mikkelk Nybegynder
01. december 2004 - 11:09 #2
Jeg har netop ikke endeligt gang i noget endnu, netop fordi jeg ikke kunne se andet end problemerne i det :-)
Problemet er at vi har et meget stort behov for at kunne fylde hullerne ud, da der er numre fra f.eks. 170001 og op til 179899 ca. og alligevel dækker det kun over ca. 500 poster...så hvis vi bare starter fra max, så tømmer vi lynhurtigt gruppen for mulige numre...
Avatar billede erikjacobsen Ekspert
01. december 2004 - 11:12 #3
Hvis du ved der er ca. 500 ud af 10.000 så kan du tage chanchen ;)

Vælg et tilfældigt tal mellem 0 og 9999 og søg derfra med select sætninger. Så
rammer du sandsynligvis ikke en stor blok, og du vil heller ikke efterlade en
stor blok. Det går nok - afhængigt af andre krav, naturligvis ;)
Avatar billede mikkelk Nybegynder
01. december 2004 - 11:12 #4
Hmm...svarer lige selv også :-) hvad nu hvis man starter med at lave en søgning der laver en tabel med 500 frie numre i hver gruppe og så bare bruger løs af dem...det var jo en mulighed...så har man en tabel med frie numre, hvor man sletter et nummer når man har brugt det...så er vi ude i at den enkelte bruger kun skal lave én forespørgsel...
Avatar billede mikkelk Nybegynder
01. december 2004 - 11:13 #5
hmm...vil egentlig helst udfylde hullerne nedefra, bare for at være besværlig :-) Så den tager den første hul der kommer...
Avatar billede erikjacobsen Ekspert
01. december 2004 - 11:14 #6
Det er også en mulighed - man skal netop overveje om man har brug for andre
oplysninger (andre tabeller), end hvad man lige står med. De skal selvfølgelig
vedligeholdes.
Avatar billede mikkelk Nybegynder
01. december 2004 - 15:28 #7
Den løsning jeg selv kom med virker helt efter hensigten :-) Men takker for hjælp og ideer.
- smid et svar og vi deler pointene...
Avatar billede erikjacobsen Ekspert
01. december 2004 - 15:29 #8
Nej tak, jeg samler slet ikke på point.
Avatar billede mikkelk Nybegynder
01. december 2004 - 21:35 #9
Det er så ganske fair :-) Jeg takker endnu engang for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester