13. februar 2003 - 00:40Der er
27 kommentarer og 1 løsning
først ledige plads !
koden: rs.MoveFirst i = 0 Do Until rs.EOF If val(rs("nr")) > i Then i = val(rs("nr")) End If rs.MoveNext MsgBox i Loop Denne kode finder det største tal i databasen. det er oxe fint nok så skal man bare tal+1 for ikke at ramme nogle andre tal. MEN hvad nu hvis den springer med 1 cifre hvordan definere man at den så skal springe ud. listen 1 2 3
6
8 så skal den gerne komme og sige at "4" ikke findes og man kan bruge "4" til den nyoprettet titel. og ikke det største tal+1
lige et par småting - det du sikkert skal bruge, er et unikt id. I de fleste databaser kan du bruge en autonummer funktion. Iøvrigt, er det nødvendigt at lukke huller i nummereringen ?
I din forespørgsel, hvor du finder rs kan du tilføjer "order by nr". Derved får du dem ud i rækkefølge.
Dernæst:
rs.movefirst i=1 'Hvis det mindste tal i rækken er 1 Do Until rs.EOF If Val(rs("nr") = i i = i + 1 rs.Movenext Else Exit Do End If Loop Msgbox i
Dette burde virke... (hvis du kan sortere din forespørgsel stigende)
Det er ikke det jeg skal bruge. den skal bare fortælle at tallet 4 ikke bilver brugt. og hvis tallet 4 havde været der skulle den sige tallet 5 ikke bliver brugt og hvis 5 havde været der så skal den sige 7 er fridt. listen 1 2 3
rs.MoveFirst i = val(rs("nr")) rs.MoveNext Do Until rs.EOF If val(rs("nr")) > i+1 Then msgbox "Tallet " & i+1 & " bliger ikke brugt!" Exit do End If i = val(rs("nr")) rs.MoveNext Loop
Ovenstående udskriver 4 som det ledige tal i en masbox, hvis recordsættet indeholder de tal du har vist ovenfor
hvordan smelter jeg så de her 2 sammen så den tjekker samtidige først siger den hvis tallet eksisterer og så kommer den med et forslag om hvilken der er ledig. rs.MoveFirst i = Val(rs("nr")) rs.MoveNext Do Until rs.EOF If Val(rs("nr")) > i + 1 Then MsgBox "Tallet " & i + 1 & " bliger ikke brugt!" Exit Do End If i = Val(rs("nr")) rs.MoveNext Loop
rs.MoveFirst Do Until rs.EOF If rs("nr") = Text2.Text Then MsgBox rs("nr") & " eksisterer intast nyt!", , "Tilføj" Exit Sub End If rs.MoveNext Loop
Nu fremgår det jo ikke, hvad du skal bruge ovenstående til, men jeg forudser nogle seriøse performanceproblemer på et tidspunkt.
Hvis der kun er 10-100 rækker i din tabel, er det ok, men hvis der er flere, har du problemer, når du åbner dine connections + der bliver ventetid for brugeren.
Jeg gætter, at årsagen til at hullerne opstår er én af følgende: 1) Der bliver slettet rækker i tabellen 2) Der bliver indsat vilkårlige ID's
ad 1) Hvad med at oprette en tabel over ledige ID's, indexeret efter ID's numeriske størrelse. Når der skal forslås et ny ID, kan det vælges fra denne tabel (første række, even) og når der slettes en række, kan ID'et sættes tilbage i tabellen. Det eneste, der skal tænkes lidt over, er et fylde tabellen med ledige ID's ud. og sørge for passende håndtering af samtidige indsættelser.
ad 2) Den er lidt sværere. Du kan genbruge ideen fra 1), men der skal laves lidt flere check på om værdien er brugt i din tabel. (og værdien under osv.) Derefter kan du udvidde "ledigID"-tabellen til at omfatte alle tal mellem det tidligere maximum og det nye. Første gang et kæmpe tal indtastes bliver der lidt ventetid, men ellers er det også hurtigt nok.
Set conn = CreateObject("ADODB.Connection") conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & App.Path & "\dvd.mdb" SQL = "Select * FROM dvdfilm" Set rs = conn.Execute(SQL)
rs.MoveFirst i = 1 'Hvis det mindste tal i rækken er 1 Do Until rs.EOF If Val(rs("nr")) = i Then i = i + 1 rs.MoveNext Else Exit Do End If Loop MsgBox i
If Text1.Text = "" Then MsgBox "Intast titel!", , "Tilføj" Text1.SetFocus SendKeys "{Home}+{End}" ElseIf Text2.Text = "" Then MsgBox "Intast Nr!", , "Tilføj" Text2.SetFocus SendKeys "{Home}+{End}" Else
End Sub Jeg kan ikke sotere efter ID. Der er tilfældige Nr. da det er brugerne der selv vælger dem. og når den kommer med det første ledige nr. opretter man safølig det nr. men når man så køre koden igen forslår den det nr. der lige har været ledigt. det er jo heller ikke mange der har mere end 100 film.
jeg ved godt at den skal hoppe ud når den har fundet et ledigt nr. men den skal da også søge alle nr. igennem for at se om det nr brugerne har valgt findes hvis det findes først der skal den søge efter det første ledige nr. ps. har prøvet og leje med begge jeres koder. :( -->HULK
det med at loope kan jeg godt men det med at finde det første ledige virker ikke som det skal. det den kommer og siger 2 er fridt selv om jeg har tastet noget ind på plads 2.
hent bruger indtastning Hvis findes i forvejen ? Ja gør hvad skal gøres else find første ledige - select nr+1 from dvdfilm a where not exists (select * from dvdfilm b where b.nr = a.nr + 1 order by nr ) indsæt på første ledige end hvis
rs.MoveFirst i = 1 rs.MoveNext Do Until rs.EOF If i > Val(rs("nr")) Then MsgBox "Tallet " & i & " bliver ikke brugt!" Exit Sub End If i = i + 1 Loop den gør ikke som den skal. den ser ikke om der er nogle i tabellen som der er den samme som i.
Der er intet i vejen med princippet med min løsning, men hvis du har Dim'met f.ekx. vatiablen "i" som fx. en String eller en Date, ja så virker det naturligvis ikke. Derfor gentager jeg:
Tjek nu, at tingene indholder det som du forventer (noget debug.print og et par messageboxex vil afklare det...)
jeg har ikke dimmet noget lol behøvet ikke den aksepterede i uden. den inde holder det som jeg forventer men gør bare ikke som jeg gerne vil have prøv du om du kan få skittet til at virke for jeg gir snart op.
ps. hvad VB program er det bedste jeg bruger VB 6.0 og syntes jeg har mange problemer med det især hvis jeg henter lidt kilde kode her inde og prøver at sætte dem ind eks. dim conn as new con..... --> virker ikke siger at conn er forkert havde hentet en kode til systray --> fik jeg heller ikke til at virke *grr* så nu dimmer jeg ikke noget det virker *lol* HJÆLP MIG
Hvis du ikke dimmer det bliver det automatisk opfattet som en variant... Det er ikke altid hensigtsmæssigt - især ikke når du sammenligner forskellige variabler. En god programmeringsskik er ALTID (!!!) at erklære alle variable (du kan indstille VB til at kræve dette - det er en god ide)
Hvad mener du med "hvad vb-program er det bedste jeg bruger VB6.0" - hvad i alverden ville du ellers bruge - VB.5.0?
"eks. dim conn as new con..... --> virker ikke siger at conn er forkert" Hvad mener du "at conn er forkert"?
Jeg tror du måske skulle sætte dig bedre ind i VB inden du går i gang med at lave et større program, der endda skal håndtere databaser. Nu har du efterhånden brugt laaaang tid på dette spørgsmål (som ER besvaret), og du ville selv kunne svare på det på ganske få minutter hvis du forstod VB bedre, og du vidste hvad du lavede (et absolut velment råd :o)
Søg på Tutorial her på eksperten, og du får alle links du kan ønske dig. Endnu bedre - køb en bog. Den tid du bruger på at lære VB ordentligt er givet 100 gange igen, ved at du ikkehænger fast i små detaljer som f.eks. i dette spørgsmål.
det er meget fint at komme med den fine hentydning at jeg ikke kan VB. FINT jeg er ikke god til VB og hvad så.
JA du har ret en bog har jeg et par stykker af men mit dilemma har altid været at jeg lære af kode/felj og ikke af at begrave sig i bøger (vi skal alle ikke være ens)
JA og lære VB bedre som sagt kan jeg ikke med bøger så derfor prøver jeg her er det ikke ok :)
jeg giver op det her er ikke en hjælp til mig og gidder ikke tovtrækkeri. nu ved ikke med point i har jo hjulpet mig men ved ikke hvem der skal have pointene. så jeg vil dele dem er det ok ????
Helt fint - som jeg skrev, så var ovenstående ment som et velment råd - man kan bruge laaaang tid på at rette småting, der ikke virker, som ville virke, hvis man havde lært det ved f.eks. at læse en bog e.l.
Jeg er selv i samme situation i ASP.NET, hvor jeg famler mig frem - HAR dog købt en bog, og er i fuld gang med at læse:o)
ok for at sætte en stopper for denne her ? så har jeg fået det til at virke ved bare at tænke mig lidt om den kode du gav mig virkede og virker nu men er løbet ind i 2 cifrede problem virker fint fra nr 1-9 men kommer jeg op i 10 og op efter siger den 2 er fridt er der andre mulighedder har prøvet val(i) men det skal være en variant eller et opjekt tænkte på at give nr 0001 /0002 /0003 osv men kærver en rep af database:(
ps har fået "Dim conn As New Connection" til at virke ved at LÆSE I MIN BOG den skulle hedde "Dim conn As New ADODB.Connection" tak for hjælpen og et dunk i nakken for at sætte tænkeren igang :)
Hvis du nu havde kigget på de svar du har fået, så ville du have fundet en løsning som var både mere effektiv, pænere og fremtidssikret. ak,ja Hvor er det synd at folk har så travlt at de ikke når at få den bedste løsning.
Man kan så selvfølgelig spørge sig selv, om Amanda var hastværk !!!
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.