Avatar billede rodding Juniormester
25. august 2005 - 15:54 Der er 8 kommentarer og
1 løsning

Last record

Forestil jer en  select indeholdende en sortering på dato og det giver f.eks 5 record.

Hvis jeg ved at det er den sidste(eller den første) i resultatet jeg skal bruge, hvordan får jeg så fat i kun den.
Avatar billede darth-domino Nybegynder
25. august 2005 - 15:57 #1
rsRecordset.movelast?
Avatar billede darth-domino Nybegynder
25. august 2005 - 15:58 #2
Ja... eller rsRecordset.movefirst?
Avatar billede kjulius Novice
25. august 2005 - 22:24 #3
Brug en sortering, hvor du "vender" den. Det gør du ved at angive DESC efter de felter du sorterer på, f.eks.

SELECT *
FROM tabel
WHERE kundenr < 300
ORDER BY kundenr DESC

På den måde vil du som første row du læser få den kunde med det største kundenr under 300. Hvis man bruger .MoveLast (som kun kan bruges i VB/VBA/VBScript/ASP), vil det gennemtvinge en komplet læsning af bufferen, hvilket ikke er optimalt, hvis det kun er den sidste row man er interesseret i.

De fleste databaser har desuden måder at begrænse det recordsæt der returneres. Access har f.eks. SQL instruktionen TOP xxx:

SELECT TOP 1 *
FROM tabel
WHERE kundenr < 300
ORDER BY kundenr DESC

vil begrænse det antal rows der returneres til 1 row, hvilket vil være det optimale i dit tilfælde.
Avatar billede claesdamlund Nybegynder
26. august 2005 - 00:49 #4
TOP fungerer også i MS SQL, men du kan også prøve følgende

SELECT *
FROM tabel
WHERE dato = (SELECT MAX(dato) FROM tabel WHERE felt = kriterie)

Det returnerer den eller de poster som modsvarer den seneste dato i sub-selecten (hvilket svarer til den sidste dato i en stigende sortering). Du kan bruge MIN-funktionen til at finde første post.

Kræver dog at din database understøtter sub-selects.
Avatar billede rodding Juniormester
26. august 2005 - 09:46 #5
Claes smid et svar, dit sub-select virker fint.

Det er en DB2 database, og den håndterer åbenbart ikke TOP og rsRecordset....
Avatar billede claesdamlund Nybegynder
26. august 2005 - 16:51 #6
Det lyder godt. Held og lykke med det.

Claes
Avatar billede kjulius Novice
26. august 2005 - 18:16 #7
I en DB2 database burde du til gengæld kunne specificere det ala:

SELECT *
FROM tabel
WHERE dato < (CURDATE() - 30 DAYS)
ORDER BY dato DESC
FETCH 1 ROW ONLY
Avatar billede kjulius Novice
26. august 2005 - 23:07 #8
rodding--> citat: "Det er en DB2 database, og den håndterer åbenbart ikke TOP og rsRecordset...."

DB2 bruger ganske rigtigt ikke TOP xx instruktionen, men FETCH xx ROWS ONLY, som jeg skrev ovenfor. Jeg var ikke klar over hvilken database du bruger (ved det, jeg burde have spurgt :-) ), derfor gav jeg et eksempel med TOP xx, som bruges af Access og MS SQL. MySQL bruger en LIMIT funktion, og sådan leger de i hver deres sandkasse, de kære databaseproducenter.

Recordset.MoveLast er derimod en ADO funktionalitet (metode), og har ikke direkte noget med SQL / DB2 at gøre.
Den positionerer bare cursoren inden for det recordsæt databasen returnerer som resultat af udførelsen af din SQL.
Avatar billede rodding Juniormester
27. august 2005 - 08:50 #9
Tak for svarene.

kjulius tak for forklaring, vil jeg gøre brug af en anden gang.
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
Computerworld tilbyder specialiserede kurser i database-management

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