02. maj 2006 - 12:56Der er
16 kommentarer og 2 løsninger
SQL til at vise næste nummer i autonummering
Er det nuligt at lave en sqlsætning der viser næste id-nummer i autonummeringsrækkkefølgen? Jeg har prøvet med SELECT MAX(kundeid)+1 FROM kunde - Men den er ikke god nok, da den kun tæller det sidste kendte nummer i rækkefølgen, og tager ikke hensyn til at der måske er slettet poster i tabellen.
Et eksempel: Der er 4 poster i tabellen (idnr. 1-4), så næste autonummering vil blive 5. Men hvis jeg sletter post 4, vil næste autonummering stadig være 5. Hvis jeg bruger SELECT MAX(id)+1, vil der kun vise nummeret efter 3, og ikke 5 som jo er det næste autonummering.
"Men hvis jeg sletter post 4, vil næste autonummering stadig være 5"
Brugte autonumrer vil ikke blive genbrugt før du har komprimeret databasen. Hvis du f.eks har posterne 1,2,3,4 og sletter post 3, vil dette autonummer ALDRIG blive genbrugt før du sletter post 4 og komprimerer.
Autonummerings felter er ikke noget man hverken ser, eller interesserer sig for, det er noget Access selv styrer. Hvis du har brug for numre i en eller anden rækkefølge, bør du oprette et felt specielt til dette. Så skal du så osse selv vedligeholde numrene.
Sub test() Set db = CurrentDb Set rec = db.OpenRecordset("test") rec.MoveLast sidste = rec.Fields(0) '5 - 1. felt er autonumm. antalposter = rec.RecordCount '4 End Sub
supertekst: Såvidt jeg kan se, så gør den det samme som MAX(id) i en SQL.
Løsningen skal helst være som SQL-sætning.
Når jeg forsøger med SELECT @@identity, så får jeg bare 5 poster med værdi 0 i. Jeg har skrevet den således: SELECT @@identity as nytID FROM Kunde; - Er det rigtigt?
Det virker, som om du opfatter det mere komplekst end det er. Hvis dit autonummerfelt hedder ID, skriver du bare: SELECT ID FROM Kunde; M.h.t. "Hvis jeg bruger SELECT MAX(id)+1, vil der kun vise nummeret efter 3, og ikke 5 som jo er det næste autonummering." Ja! Max finder det højeste nummer - her 3. Man vil sjældent være interesseret i at genbruge ID'er, idet det kan skabe basis for diskussioner som "mener du den gamle post 4 eller den nye?" Det bedste råd er: Brug Access autonummerfelt. Det virker altid. Og som ffsoft siger: "det er ikke noget man hverken ser eller interesserer sig for"
Hvis man nu antager at man har en appliaktion man bruger til at oprette kunder, og man gerne vil vide hvad kundenr en kunde vil få tildelt; ville det da være rart at man i sin applikation kan se hvilket kundenr man er ved at tildele en kunde. Det er rigtig nok hvad ffsoft og fdata siger, at der kan opstå komplikationer hvis man anvender samme kundeid. Hvorfor det ville være rart at man kan vide hvilket nummer man er nået til, også selv om man har slettet nogle poster.
... og igen: Svaret må da være, at "det nummer, man er nået til", som du skriver, er nøjagtig max. værdien af ID. Denne kan du i øvrigt kan slå direkte op med DMax("ID","Kunder") og vise i en dialog eller på skærmen. Det nye kundenr. bliver altså denne værdi plus en.
Jeb ville glemme alt om autonummerfelt som kundenr som fdata også er inde på. Du kan gøre autoinummerfeltet til tabellens PK. Opret derefter et nyt numerisk felt og kald det f.eks. kundenr. I den formular hvori du opretter nye kunder vil jeg i formularens VedAktuel (current) indsætte fdata's DMax:
If Me!NewRecord then Me! kundenr = DMax("ID","Kunder") +1 end if
Nu vil den nye kunde som Default få kundenr der er = tabellens max. værdi i kundenr +1
Ja - Du kan evt. beholde autonummerfeltet som en PK, men du kan også bruge kundenr til PK. Jeg har ikke afprøvet SELECT MAX(id)+1, men med mit forslag tildeler Access selv et nyt kundenr, og du skal således ikke røre ved kundenr, det klarer Access selv på samme måde som ved autonummerfeltet.
... men pas på ved sletninger, hvis du har relaterede poster (f.eks. fakturaer eller kontaktpersoner). Hvis du sletter kunden med det højeste nummer uden at slette sidetabellerne, vil den nye kunde "overtage" alle den gamle kundes poster. Bare en lille advarsel ;o)
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.