12. februar 2003 - 01:44Der er
12 kommentarer og 2 løsninger
Finde brugte nr.
Hej eksperter.
Jeg har lavet en dvdliste men er nu løbet ind i problemer. Når man vil oprette en film vil jeg gerne have en lykke som løber databasen igennem og ser om "nr." er ledig, hvis det ikke er ledigt skal den komme med en msgbox og forslå det laveste ledige tal i databasen.
man kan vælge. nr. "1" nr. "2" nr. "3" -----> msgbox "forslå (nr. "4") nr. "6" nr. "7"
Er det ikke bare at loope gennem alle poster i din DB, og sammenligne med det nummer den foreslår? Er det allerede brugt, så loop igen fra første nummer, og stop første gang nummeret springer med mere end een.
En anden ting - hvis det nummer nu var en unik nøgle i din database, ville det jo være smart :o)
I et gammelt VB3-projekt har jeg lavet sådan en. Se idéen og se bort fra mine variabel-navne.
Her anvendes en kombination af liste og array, men det kan ligeså gost ske ved direkte læsning i en db.
'procedure for genanvendelse af ledigblevne numre - afstillet 30-01-2001 '----------------------------------------------------------------------------- For X = 1 To varer.ListCount - 1 If Val(Left$(samtlige(X), 3)) > X + 1 Then Exit For Next If X < varer.ListCount - 2 Then varer.ListIndex = X Else varer.ListIndex = X - 1 '-----------------------------------------------------------------------------
'procedure for næste ledige én over det højeste. '--------------------------------------------------------------- ln1 = 0 For X = 1 To varer.ListCount - 1 If Val(Left$(samtlige(X), 3)) > ln1 Then ln1 = Val(Left$(samtlige(X), 3)) Next '-----------------------------------------------------------------------------
--> martin jo det har jeg prøvet men ??? listen. 1 2 3 123 så siger den 3 er det højeste. men da jeg gik i skole var det "123" der var det højeste men det kan jo godt være lavet om *lol**GG* koden: rs.MoveFirst i = 0 Do Until rs.EOF If rs("nr") > i Then i = rs("nr") End If rs.MoveNext MsgBox i Loop
Ok, i mit eksempel indeholder et array nogle strenge, der altid (i filen de læses fra) står i nummerorden. Nummeret står først og det er altid på 3 tegn, altså højst 999. Numre under 100 angives '077' og under 10 angives '004'.
Når jeg så læser fra 0 til Ubound array'et - i eksemplet sidste post i en liste, men de er ens - så vokser tælleren i For / Next løkken jo med 1 ad gangen. Dette tal sammenlignes med Val() af venstre del af strengen i array'et. Hvis tallet i array'et er større (end X - tælleren) har der altså været et ledigt nummer og derfor 'Exit For'.
Men der kan let laves andre løsninger, og det vil være påkrævet hvis din database ikke er i nummerorden.
Jeg har fået det til at virke men jeg vil gerne give jer begge point. da i begge har været en utrolig stor hjælp for mig "det er det man kalder eksperter :)". håber i begge bliver tilfres. koden : --> til andre der mangler den er. rs.MoveFirst i = 0 Do Until rs.EOF If Val(rs("nr")) > i Then i = Val(rs("nr")) End If rs.MoveNext Loop MsgBox i
PS: der er plads til et par optimeringer af din kode:
Du gemmer jo kun den SIDSTE værdi af "i" (inde i din if-sætning), og kører du loopet igennem fra den anden ende, vil det blive den FØRSTE værdi af i du skal gemme. Altså hvis du bruger movelast i stedet for movefirst og movePrevious i stedet for movenext. Herefter kan du exit dit loop inde i if-løkken lige efter du har givet "i" en værdi, og spare en MASSE gennemløb af dit recordset og dermed gøre programmet mere effektivt (hvis der nu f.eks. er 1000-vis af pladser i din record)
Kør loopen igennem fra sidste record mod første i stedet for som nu, hvor du kører fra første record mod sidste. Drop ud af loopet når du tildeler "i" en værdi første gang...
Tak for point, fint du fik en god løsning. m.v.h. Jørn
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.