30. juli 2005 - 16:58Der er
19 kommentarer og 1 løsning
finde hul i talrække
jeg har en stump kode der finder højeste tal fra en talrække fra en tabel i min db og plusser det med 1, og det virker sådanset fint nok. men hvis nu der et hul i talrækken i db'en f.eks: 1,2,3,4,_,6,7 så vil min nuværende kode blive =8, men jeg kunne godt tænke mig at finde det første hul i talrækken istedet (i dette eksempel 5) Hvordan kan man gøre dette??
den kode jeg bruger nu ser sådan ud: set rs=MyConn.Execute("select MAX(locID) as sidsteID from location where LocTypeID="&locType) locID=int(rs("sidsteID"))+1 rs.close set rs=nothing
nu ved jeg godt at det ikke er det du spørger om så jeg vil gerne undskylde min indblanden på forhånd... men som udgangspunkt er det en rigtig dårlig idé at genbruge id-numre. Id-numre har det bedst med at være fortløbe, uden gentagelser og uden genbrug af forældende tal - og til det er det klart lettest at lave et autonummeringsfelt i databasen.
set rs = myconn.exeute("select * from location order by sidsteID") if rs.bof or rs.eof then response.write "Der er ingen poster i databasen!" else do while not rs.eof if rs("sidsteID") = "" then locID = rs("id") exit do end if rs.movenext loop end if
if locID <> "" then ' ny id er fundet, læg 1 til: locID = CInt(locID) + 1 else ' der blev ikke fundet et nyt id response.write "Der blev ikke fundet noget id" end if
Det kan være, at der er en "SQL"-version.. men det her burde også virke..
set rs = myconn.exeute("select * from location order by sidsteID") if rs.bof or rs.eof then response.write "Der er ingen poster i databasen!" else do while not rs.eof
if rs("sidsteID") <> "" then locID = rs("sidsteID") else exit do end if
rs.movenext loop end if
if locID <> "" then ' ny id er fundet, læg 1 til: locID = CInt(locID) + 1 else ' der blev ikke fundet et nyt id response.write "Der blev ikke fundet noget id" end if
nu har jeg ikke læst hele spm igennem - men i sådan et tilfælde ville jeg mene at man skulle redigere oplysninger i stedet for at slette og så oprette en ny eller (og helst) at det bare var de 20 laveste id'er der var testere.
thesurfer>> hvis jeg bruger dit eksempel bliver tallet stadig lagt til det højeste tal i tabellen, og når jeg når til 10 får alt hvad man tilføjer efter også 10
sådan ser det ud: locID= Replace(Trim(server.HTMLEncode(Request.Form("locID"))), "'", "''") varfejl=false if locID<>"" then set rs=MyConn.Execute("Select locID, id from location where locTypeID="&locType) while not rs.eof if (rs("locID")=locID and int(rs("id"))<>int(id)) then varfejl=true rs.MoveNext wend if varfejl=true then fejlID=locID rs.close set rs=Nothing end if
if varfejl=true or LocID="" then set rs = myconn.execute("select * from location where LocTypeID="&locType&" order by locID") if rs.bof or rs.eof then response.write "Der er ingen poster i databasen!" else do while not rs.eof
if rs("locID") <> "" then locID = rs("locID") else exit do end if
rs.movenext loop end if
if locID <> "" then ' ny id er fundet, læg 1 til: locID = CInt(locID) + 1 else ' der blev ikke fundet et nyt id response.write "Der blev ikke fundet noget id" end if
tanken er at hvis variablen locID er tom skal den finde det lavest mulige nr i tabellen LocID og ligge i variablen LocID, som så vil blive tilføjet med en sql senere.
hvis der er et tal i variablen locID skal den tjekke om tallet findes i forvejen i tabellen locID, hvis det findes returneres fejl, hvis det ikke findes går den igennem og bliver tilføjet med en sql senere
nielle>> jeg kan ikke få det til at virke. Hvis brugeren ikke indtaster noget, så vil variablen locID være tom, også skal den selv finde det mindst mulige tal i kolonnen locID uden at der kommer dubletter, og give dette tal til variablen LocID.
så vidt jeg kan se er det ikke det din kode gør?? håber det er til at forstå
Trin 1) I mit kode-eksempel startes der med tallet 1 - det er m.a.o. start-kandidaten til et hul.
Trin 2) Derefter trækkes alle locid'erne ud af tabellen i stigende rækkefølge
Trin 3) For hvert af dem der er i tabellen "location" tjekkes det om, det er lig med kandidat-hullet.
Trin 4a) Hvis det er, ja så var "hullet" allerede i tabellen, og så var det altså alligevel ikke noget hul. I disse tilfælde tælles kandidat-hullet 1 op.
Trin 4b) Hvis et derimod ikke er, ja så var kandidat-hullet altås det hul vi ledte efter. I dette tilfælde springer bi ud af løkken.
locId = 1 ' Trin 1)
Set rs = MyConn.Execute("SELECT locID FROM location WHERE LocTypeID=" & locType & " ORDER BY locID ASC" ' Trin 2)
Do While Not rs.EOF If rs("locId") = locId Then ' Trin 3) locId = locId + 1 ' Trin 4a) Else Exit Do ' Trin 4b) End If rs.MoveNext Loop
Response.Write "Det første frie locId er : " & locId
Ja, den slags fejl kan jo drille længe før at man opdager den :^|
... og et svar :^)
Synes godt om
Ny brugerNybegynder
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.