Oprettet fre. d. 27. august 2010 kl. 10:03:48

svjensen
svjensen (14.155 point. Point ude: 210)

Returner tildelt værdi fra autonummerering

Hvordan kan jeg få returneret den værdi, der indsættes i et autonummereringsfelt, så jeg kan bruge den i forbindelse med øvrige INSERT?

Skrevet fre. d. 27. august 2010 kl. 10:09:58| #1

spg
spg (41.031 point)
www.parodux.com
DLast("[AutoNummerFelt]";"DinTabel")

Skrevet fre. d. 27. august 2010 kl. 10:30:53| #2

svjensen
svjensen (14.155 point)
Jeg har behov for at indarbejde det i et VBA script.
En simplificeret udgave af scriptet er vist herunder. Jeg vil så gerne have funktionen til at returnere den omtalte værdi.
Er det stadig DLast jeg skal anvende, og i så fald hvordan?

I eksemplet herunder skrives til en helt simpel tabel med to felter: uid (autonummerering) og Tekst (text)

Kode:

Const ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Q:\PL\PLA\ALLE\03 Periodeplan\Sandkasse\Access programmering\TestDB.mdb;Persist Security Info=False"

Function SkrivTilDBViaSQL(Tekst As String) As Boolean
    Dim SQLstr As String
    Dim MyCon As New ADODB.Connection

    MyCon.ConnectionString = ConStr
    MyCon.Open

    SQLstr = "INSERT INTO tblTest (Tekst) VALUES ('" & Tekst & "')"
   
    MyCon.Execute SQLstr
   
    SkrivTilDBViaSQL = True
   
    'Oprydning i fht. DB
    MyCon.Close
    Set MyCon = Nothing
End Function

Skrevet fre. d. 27. august 2010 kl. 10:41:46| #3

spg
spg (41.031 point)
www.parodux.com
Du kan se effekten ved at sætte dette ind i slutningen af din funktion:

msgbox DLast("[uid]","tblTest")

Skrevet fre. d. 27. august 2010 kl. 10:51:29| #4

svjensen
svjensen (14.155 point)
Det giver mig en 'Compile error: Sub or Function not defined', med 'DLast' markeret.

Skrevet fre. d. 27. august 2010 kl. 11:26:00| #5

spg
spg (41.031 point)
www.parodux.com
undskyld!~)

docmd.msgbox DLast("[uid]","tblTest")

Skrevet fre. d. 27. august 2010 kl. 11:41:33| #6

svjensen
svjensen (14.155 point)
Går ud fra at det er:

MsgBox docmd.DLast("[uid]", "tblTest")
??

Det fjerner i hvertfald fejlen, men giver mig ikke nogen pop-up. Har prøvet med debug.print også, men uden held.

Skrevet fre. d. 27. august 2010 kl. 11:46:15| #7

spg
spg (41.031 point)
www.parodux.com
docmd.msgbox DLast("[uid]","tblTest")

Skrevet fre. d. 27. august 2010 kl. 11:47:32| #8

spg
spg (41.031 point)
www.parodux.com
næh... det er da ikke docmd.

lige et øjeblik, så tjekker jeg lige!~)

Skrevet fre. d. 27. august 2010 kl. 11:55:17| #9

spg
spg (41.031 point)
www.parodux.com
det forstår jeg ikke... mit første forslag virker fint her hos mig?~)

..altså msgbox DLast("[uid]","tblTest")

..du kan prøve DMax, men resultatet bliver nok det samme... fejlen kan måske være et andet sted, selvom den stopper ved Dlast... Kører det uden denne msgbox?~)

Skrevet fre. d. 27. august 2010 kl. 12:16:45| #10

spg
spg (41.031 point)
www.parodux.com
Kører du med:

Option Compare Database
Option Explicit

i starten af din modul... det er altid en god ide og kan nogle gange vise fejl, som ellers ikke ville blive opdaget!~)

Skrevet fre. d. 27. august 2010 kl. 12:21:33| #11

svjensen
svjensen (14.155 point)
Åh, jeg tåbe.
Problemet er, at mit script kører i excel, da data skal importeres fra regneark.
Så spørgsmålet er i virkeligheden stillet i den forkerte kategori.
Det beklager jeg :-)

Ved du tilfælgdivis, hvordan jeg kan få returneret værdien i excel VBA?

Skrevet fre. d. 27. august 2010 kl. 12:42:21| #12


Skrevet fre. d. 27. august 2010 kl. 12:48:57| #13

svjensen
svjensen (14.155 point)
OK. Tak for din tid. Jeg beklager, at det var forgæves :-)

/Søren

Skrevet fre. d. 27. august 2010 kl. 12:53:14| #14


Skrevet fre. d. 27. august 2010 kl. 13:10:01| #15

svjensen
svjensen (14.155 point)
Fik hul igennem fra excel vha.:

Access.Application.DLast("[uid]", "tblTest")

Men den returnerer værdien fra den sidste post inden jeg skriver til tabellen.
Hvis posten inden har uid 6, og jeg via scriptet skriver til tabellen og den angiver uid til 7, så returnerer DLast altså 6.
Og det er jo ikke lige det jeg har brug for...

Kan vi køre den videre her, eller skal jeg oprette et nyt spørgsmål?

Skrevet fre. d. 27. august 2010 kl. 13:16:57| #16

spg
spg (41.031 point)
www.parodux.com
kører du den efter:

MyCon.Execute SQLstr

Skrevet fre. d. 27. august 2010 kl. 13:24:03| #17

svjensen
svjensen (14.155 point)
Ja. Den kommer lige efter:
SkrivTilDBViaSQL = True

Skrevet søn. d. 29. august 2010 kl. 12:02:04| #18

DLAST kommentar:

Advaret, først beskrivelsen i f1-hjælpen og derefter af Duane Hookom i

http://www.pcreview.co.uk/ (...)

testede jeg med:

Sub testdlast()
    Dim bigfield, id As Long, dlastV
    bigfield = String(32768, 65)
   
    CurrentDb.Execute "create table dlasttest (id autoincrement not null,fillField memo,constraint dlasttest_PK primary key(id))"
    Do
        id = id + 1
        CurrentDb.Execute "insert into dlasttest(fillField) values(""" & bigfield & """)"
        If id Mod 10 = 0 Then
            CurrentDb.Execute "delete from dlasttest where id < " & Int(id * 0.8)
            Debug.Print "less than " & Int(id * 0.8) & " is deleted": End If
        dlastV = dlast("id", "dlasttest")
    Loop Until id <> dlastV
    Debug.Print "Dlast() returned: " & dlastV & " after inserting autonumber:" & id
   
End Sub

---

Tilmed vil fejlens konsekvens ofte være join af forkerte ting - fejldata - en type fejl der kan være svær at finde årsag til hvis man ikke har en mistanke.

Skrevet søn. d. 29. august 2010 kl. 14:31:38| #19

svjensen
svjensen (14.155 point)
Det bekræfter jo mit problem :-)
Jeg har i øvrigt prøvet med DMax også, men det gav faktisk lidt samme problem. Hvis jeg anvender det i samme script, hvori jeg skriver til tabellen, så medtager den ikke den sidste entry.
Og da jeg netop har behov for at vide, hvilken værdi denne er tildelt (da jeg skal bruge den til andre tabeller), så er jeg lige vidt.

Er der andre forslag til, hvordan jeg kan få returneret værdien?

Skrevet søn. d. 29. august 2010 kl. 15:18:25| #20

Jeg vil mene at det er garanteret at en insert statement, i ms-access, der ikke explicit tildeler autonummer feltet værdi, afstedkommer at autonummer får værdien 1 højere end højeste før indsættelse.
Dette gælder også selv om der har været explicite tildelinger med lavere værdier i 'ledige huller' - autonumber counteren forbliver på 'max'.

dmax ligesom de andre d<aggreate> ting er bekvemme ms-access vba funktion overbygninger på de almindelige sql aggreate funktioner: min,max,count,sum,.....

i #2 tilgåes datakilden fra adodb (fra excel erfarer vi senere) - jeg ville holde mig til samme tilgangsmåde og lave en select max(<autonumber field name>) query.

Begrundelsen er at det ikke er til at vide hvornår forskellige lag af buffering flushes, men holder man sig indenfor samme tilgangsmåde må man forvente at det fra producentens side er implementeret på den brugbar måde.

Skrevet man. d. 30. august 2010 kl. 11:01:10| #21

svjensen
svjensen (14.155 point)
Tilsyneladende er der hjælp at hente her:
http://databases.aspfaq.com/ (...)

Men jeg er usikker på, hvordan jeg kan indarbejde det i min VBA kode.

Skrevet man. d. 30. august 2010 kl. 11:50:21| #22

#2 omskrevet til kodeeksemplet lidt nede i det linket i #21 henvider til, forudsat dit autonumber felt hedder 'id'. Funktionen SkrivTilDBViaSQL retunerer nu den nye id.



Function SkrivTilDBViaSQL(tekst As String) As Boolean
    Dim SQLstr As String
    Dim MyCon As New ADODB.Connection
    Dim rs As ADODB.Recordset

    MyCon.ConnectionString = ConStr
    MyCon.Open

    SQLstr = "INSERT INTO tblTest (Tekst) VALUES ('" & tekst & "')"
 
    Set rs = MyCon.Execute(SQLstr)
 
    SkrivTilDBViaSQL = rs("id") ' rs(0)
 
    'Oprydning i fht. DB
    MyCon.Close
    Set MyCon = Nothing
End Function

Skrevet man. d. 30. august 2010 kl. 12:21:15| #23

svjensen
svjensen (14.155 point)
Mangler der ikke noget i SQL sætningen?
I linket i #21 anvendes 'SELECT @@IDENTITY'.

Jeg har prøvet at indsætte det, men kan ikke helt få det til at lykkes.

Skrevet man. d. 30. august 2010 kl. 13:48:34| #24

Jo, det har du ret i - jeg har læst det som fanden læser bibelen!

Måske skal tabellen være skabt med den indentity ting, som antydet i :
"CREATE TABLE AutoIncrementTest " & _
            "(ID int identity, Description varchar(40), " & _
            "CONSTRAINT AutoIncrementTest_PrimaryKey PRIMARY KEY (ID))"

fra linket:
http://support.microsoft.com/ (...)

Ellers prøv eksemplet under fra linket i #21, hvor der efterfølgende særskilt hentes med 'select max(id) .....'

Skrevet man. d. 30. august 2010 kl. 14:04:58| #25

svjensen
svjensen (14.155 point)
Det prøver jeg at kigge nærmere på.
Indtil videre har jeg fået det til at virke vha. af nedenstående, som er en lidt anden tilgang.


Sub ADOFromExcelToAccess()
' exports data from the active worksheet to a table in an Access database
' this procedure must be edited before use
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
Dim pk As Long
    ' connect to the Access database
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Q:\PL\PLA\ALLE\03 Periodeplan\Sandkasse\Access programmering\TestDB.mdb;Persist Security Info=False"
    ' open a recordset
    Set rs = New ADODB.Recordset
    rs.Open "tblTest", cn, adOpenKeyset, adLockOptimistic, adCmdTable
    ' all records in a table
        With rs
            .AddNew ' create a new record
            ' add values to each field in the record
            .Fields("Tekst") = "Kurt"
'            .Fields("FieldName2") = Range("B" & r).Value
'            .Fields("FieldNameN") = Range("C" & r).Value
            ' add more fields if necessary...
            .Update ' stores the new record
            pk = .Fields("uid")
        End With
    Debug.Print pk
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Skrevet man. d. 30. august 2010 kl. 19:50:52| #26

Det er ligeså godt med recordset methods som noget andet - og udmærket at du fik præsenteret forskellige metoder.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Link til et dokument

Oprettet den 10. februar 2012 kl. 14.15
omn giver 60 point for svar | Giv et svar »

Formular med flere paramtre

Oprettet den 9. februar 2012 kl. 16.48
stuegnu giver 100 point for svar | Giv et svar »

Kodemodul ???

Oprettet den 8. februar 2012 kl. 17.05
olejohn giver 200 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger