Avatar billede force_master Praktikant
01. september 2003 - 23:01 Der er 19 kommentarer og
1 løsning

Sidste Post i en AccessDatabase

Hej
skal have dette programstump til at finde sidste post i databasen.
dette eks, virker kun ved lidt poster i basen , ved flere tager det jo extremt lang tid.

Private Sub Form_Load()

Set Myconn = CreateObject("ADODB.Connection")
Myconn.Open "driver={Microsoft Access Driver (*.mdb)}; DBQ= " & App.Path & "\kasse.mdb"
On Error Resume Next
For y = 1 To 25
SQL = "Select * FROM kassebeh WHERE id= " & y & " "
Set rs = Myconn.Execute(SQL)
Text1 = rs("primo")
Text2 = rs("oms")
Text3 = rs("ultimo")
Next
Myconn.Close
End Sub

Kan i kloge hoveder hjælpe mig.
MVH
Force-Master
Sten Jensby
Avatar billede ocp Nybegynder
01. september 2003 - 23:07 #1
Drop dit "id = " og benyt rs.movelast på recordsettet for at få sidste post.
Avatar billede martin_moth Mester
02. september 2003 - 09:08 #2
rs.movenext
rs.moveprevious
rs.movelast
rs.movefirst
Avatar billede force_master Praktikant
02. september 2003 - 15:55 #3
Til ocp.
Du må lige forklare lidt mere om hvordan,
jeg har længe prøvet med det der "rs.movelast" osv,
har aldrig fået det til at funke, på min måde virker det ,
kan du evt omskrive mit programstump så det vil virke. ?

På forhånd tak.
MVH
Sten Jensby
Avatar billede martin_moth Mester
02. september 2003 - 16:00 #4
Jeg kan da godt :o)

Set Myconn = CreateObject("ADODB.Connection")
Myconn.Open "driver={Microsoft Access Driver (*.mdb)}; DBQ= " & App.Path & "\kasse.mdb"
On Error Resume Next
SQL = "Select * FROM kassebeh"
Set rs = Myconn.Execute(SQL)
rs.movelast
Text1 = rs("primo")
Text2 = rs("oms")
Text3 = rs("ultimo")
Myconn.Close
End Sub

Har ikke lige VB her til at teste, men hvis du ryger FORBI den sidste record ved Movelast, kan du jo lige hoppe en tilbage:

rs.movelast
rs.moveprevious
Avatar billede force_master Praktikant
02. september 2003 - 16:12 #5
Hej
Ja den er da go.
så får jeg altså en error.

Run-time error '-2147217884(80040e24)':
Rækkesættet understøtter ikke baglæns hentning.

MVH
Sten Jensby
Avatar billede martin_moth Mester
02. september 2003 - 16:25 #6
Får du en fejlmeddelse på DANSK - hvilken version af VB kører du med?

Hvornår får du fejlen - ved movelast eller moveprevious? Hmmmm... Kan ikke lige lure fejlen umiddelbart
Avatar billede force_master Praktikant
02. september 2003 - 16:33 #7
Fejlen kommer ved linjen , rs.movelast
kører med Visual Basic 6.0 (sp5)
alt andet er på engelsk.
Avatar billede martin_moth Mester
02. september 2003 - 16:37 #8
Den fejlmeddelse lyder som om det på en eller anden måde kommer fra Access - det er vel en helt normal database du arbejder med?
Tjaa - jeg ved simpelthen ikke hvad fejlen er - måske skulle du forsøge med noget andet end ADODB...?
Avatar billede force_master Praktikant
02. september 2003 - 16:39 #9
det er en access 2000 database,
godt nok lavet i access 2002 UK versionen. den danske var for dyr dengang.
Avatar billede martin_moth Mester
02. september 2003 - 17:09 #10
Prøv med DAO og se om det ændrer sig (et skud i tågen)
Avatar billede force_master Praktikant
02. september 2003 - 17:44 #11
Øh hvordan mener du ?
har aldrig brugt det-
omskriv lige mit stump , tak :)
Avatar billede mikker Nybegynder
02. september 2003 - 18:12 #12
Prøv evt. at udskifte 'rst' med navnet på dit recordset i nedenstående

Private Sub form_load()
Set dindb = DBEngine.Workspaces(0).OpenDatabase(trim(App.Path & "\kasse.mdb"))
DoEvents
SQL = "Select * FROM kassebeh WHERE id= " & y & " "
Set rst = dindb.OpenRecordset(strSQL, dbOpenForwardOnly)
Do While Not rst.EOF
text1= rst!primo
text2= rst!oms
text3= rst!ultimo
End If
rst.MoveNext
DoEvents
Loop
End Sub

- Har ikke testet :o)
Avatar billede martin_moth Mester
02. september 2003 - 18:13 #13
mikker: du skal nok ikke have Where y = ... Det er (var) bare en tæller
Avatar billede force_master Praktikant
02. september 2003 - 18:20 #14
du ikke
Set dindb = DBEngine.Workspaces(0).OpenDatabase(Trim(App.Path & "\kasse.mdb"))
Får fejl i den linje.
run-time error 424
object required.

Private Sub Form_Load()
Set dindb = DBEngine.Workspaces(0).OpenDatabase(Trim(App.Path & "\kasse.mdb"))
DoEvents
SQL = "Select * FROM kassebeh"
Set rst = dindb.OpenRecordset(strSQL, dbOpenForwardOnly)
Do While Not rst.EOF
Text1 = rst!primo
Text2 = rst!oms
Text3 = rst!ultimo
rst.MoveNext
DoEvents
Loop
End Sub
Avatar billede force_master Praktikant
02. september 2003 - 18:21 #15
Har fået et tip fra en på email.
DEt virker heller ikke.

Private Sub Form_Load()
    Set Myconn = CreateObject("ADODB.Connection")
    Myconn.Open "driver={Microsoft Access Driver (*.mdb)}; DBQ= " & App.Path & "\kasse.mdb"
    On Error Resume Next
    SQL = "Select * FROM kassebeh ORDER BY ID DESC LIMIT 1
    Set rs = Myconn.Execute(SQL)
    Text1 = rs("primo")
    Text2 = rs("oms")
    Text3 = rs("ultimo")
    Myconn.Close
End Sub
Avatar billede force_master Praktikant
02. september 2003 - 18:30 #16
Endelig
fik den løst
MArtin havde ret , dog havde rs.movelast forkert.
udskiftede den med rs.movenext og flyttede den lidt ned.
kan godt det evt kan tage lidt tid , hvis der er mange records i basen.

Private Sub Form_Load()

Set Myconn = CreateObject("ADODB.Connection")
Myconn.Open "driver={Microsoft Access Driver (*.mdb)}; DBQ= " & App.Path & "\kasse.mdb"
On Error Resume Next
SQL = "Select * FROM kassebeh"
Set rs = Myconn.Execute(SQL)
  Do While Not rs.EOF
Text1 = rs("primo")
Text2 = rs("oms")
Text3 = rs("ultimo")
rs.movenext
Loop
Myconn.Close
End Sub
Avatar billede martin_moth Mester
02. september 2003 - 19:28 #17
Så meget ret havde jeg nu ikke. Det havde været meget mere elegang med en movelast og evt. en moveprevious - forstår ikke hvorfor det ikke virker. Forsøgte du med DAO? Måske kan andre forklare hvorfor den brokker sig over movelast og moveprevious..?

Den løsning du fik på email er jo helt anderledes, den går ud på at du kun henter en post (den sidste) ind i dit recordset - det du vil er vel at hente alle poster til recordsettet, og derefter nappe den sidste post...

NB: Den fejl du fik med DAO skyldes muligvis, at du ikke har dimmet din "dindb" (dmi dindb as database), eller at du ikke har oprettet en reference til DAO 3.6 (eller hvad nummer det nu er nået til...)
Avatar billede force_master Praktikant
02. september 2003 - 19:36 #18
Hej
Kan faktisk god leve at KUN få DEN sidste post ind.
men det virker da nu , men som sagt , med mange post kan det måske tage tid.
så hvis du lige har en løsning på KUN DEN sidste post , er jeg taknemlig
Avatar billede martin_moth Mester
02. september 2003 - 19:48 #19
Det er blot at ændre din SQL-sætning, så den:

Sorterer bagfra
Sorterer efter ID
Kun medtager den første (dvs. den sidste, da det er bagfra)

Som det du fik på e-mail.

Er du i tvivl om hvordan SQL fungerer, er her 4-5 sider som meget overskueligt gennemgår de mest basale funktioner
http://www.w3schools.com/sql/sql_intro.asp

Bemærk, at der også er en funktion LAST, som du garanteret også kan bruge :o)

Good luck
Avatar billede martin_moth Mester
02. september 2003 - 19:51 #20
Du kan også gøre som du hele tiden har gjort, men indlæse recordsættet i omvendt rækkefølge, ved at bruge ORDER BY xxx DESC (descending)
http://www.w3schools.com/sql/sql_orderby.asp

Så slipper du for at loope :o)

Mulighederne er mange...
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
Kurser inden for grundlæggende programmering

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