Avatar billede macriis Nybegynder
18. august 2004 - 11:11 Der er 11 kommentarer og
1 løsning

INSERT i 2 tabeller med et relateret felt skaber problemer

Hej

Jeg har et problem med en form der skal gemmes i 2 tabeller, hvor den ene tabel refererer til den anden.

Altså der oprettes først data i tabellen kunde hvorefter at der opettes data i tabellen kontakt. Jeg har derfor brug for kundeId fra tabellen kunde til at sætte ind i tabellen kontakt for at kontaktpersonen kan refereres til kunden.
Det bør nævnes at telefonnr er oprettet som variabel tidl. i koden.


Koden ser sådan ud indtil videre.

Conn.Execute ( "INSERT INTO kunde (kundenavn, telefonnr, adresse, postnr, [by], dato, klokkeslaet, statusKunde, noter, website, oprettetDato, oprettetAf, brugerId, kundeGruppeMainId) VALUES ('" & Request.Form("kundenavn") & "','" & telefonnr & "','" & Request.Form("adresse") & "','" & Request.Form("postnr") & "','" & Request.Form("by") & "','" & dato & "','" & Request.Form("klokkeslaet") & "','" & Request.Form("statusKunde") & "','" & Request.Form("noter") & "','" & Request.Form("website") & "','" & Now & "','" & Session("navn") & "', '" & Session("brugerId") & "', '" & Request.Form("kundeGruppeMain") & "')" )


strSQL = "SELECT kundeId FROM kunde WHERE telefonnr = " & telefonnr
Set rsKundeId = Conn.Execute(strSQL)

       
Conn.Execute ( "INSERT INTO kontakt (kundeId, kontaktnavn, titel, telefonnrD, email, oprettetDato, oprettetAf, primaerKontakt) VALUES ('" & rsKundeId("kundeId") & "','" & Request.Form("kontaktperson") & "','" & Request.Form("titel") & "','" & Request.Form("telefonnr2") & "','" & Request.Form("email") & "','" & Now & "', '" & Session("navn") & "', 'true')" )
Avatar billede fennec Nybegynder
18. august 2004 - 11:15 #1
hvilken database bruger du??
Avatar billede erikjacobsen Ekspert
18. august 2004 - 11:19 #2
Hvis telefonnummer i forvejen er unikt, hvorfor bruger du så ikke det som primær
nøgle/fremmednøgle og som kundenummer?
Avatar billede macriis Nybegynder
18. august 2004 - 11:19 #3
Access (version 2000-filformat)
Avatar billede fennec Nybegynder
18. august 2004 - 11:25 #4
Set rsKundeId = Conn.Execute("SELECT @@IDENTITY AS kundeId")
Henter det sidste indsatte ID.
Avatar billede macriis Nybegynder
18. august 2004 - 11:31 #5
fennec: Tak. Det var lige det jeg søgte.
Vil en sådan forespørgsel kunne skabe problemer / være "teknisk forkert" da der ikke refereres direkte til den kunden.
Jeg tænker på: hvis der nu er 100 brugere, der klikker opret samtidigt, kan det så ske at Set rsKundeId = Conn.Execute("SELECT @@IDENTITY AS kundeId") henter en anden brugers "indtastning"?
Avatar billede macriis Nybegynder
18. august 2004 - 11:32 #6
erikjacobsen: Det må være i pga. mangel på erfaring.
Det er desværre for sent nu.
Avatar billede fennec Nybegynder
18. august 2004 - 11:36 #7
Det skulle den helst ikke. Jeg skrev det på den måde, fordi jeg ikke er sikker på om Access understøtter denne funktion. Der få du det hele på en gang.

set rsKundeId = conn.execute("SET NOCOUNT ON; INSERT INTO DinTabel(...) VALUES(...); SELECT @@IDENTITY AS kundeId;")
Avatar billede macriis Nybegynder
18. august 2004 - 11:43 #8
Smartos!

Hvad gør funktionen SET NOCOUNT ON?
Avatar billede erikjacobsen Ekspert
18. august 2004 - 11:43 #9
select @@identity er ganske sikker, så længe det er samme connection som din INSERT
bliver lavet på, helt uanset andre brugere. Du behøver ikke den sidste version.
Avatar billede macriis Nybegynder
18. august 2004 - 11:48 #10
erikjacobsen: Ok. Tak for infoen!
Avatar billede fennec Nybegynder
18. august 2004 - 11:52 #11
når du f.eks opdatere din database, får du en returværdi som angiver hvormange felter der er blevet påvirket. Ved at sætte "SET NOCOUNT ON" sender den IKKE det tilbage.

Prøv f.eks dette:
set rs = conn.execute("update EnTabel set Enkolonne='et eller andet' where HvadVedJeg='EtEllerAndet'", AntalOpdateretFelter)

så angiver AntalOpdateretFelter hvor mange felter der er blevet påvirket.
Avatar billede macriis Nybegynder
18. august 2004 - 11:55 #12
Iøvrigt ser det ud til at Access ikke kan finde ud af at afvikle denne:

set rsKundeId = conn.execute("SET NOCOUNT ON; INSERT INTO DinTabel(...) VALUES(...); SELECT @@IDENTITY AS kundeId;")

Får at vide:

Microsoft JET Database Engine (0x80040E14)
Der er fundet tegn efter slutningen af SQL-sætningen.

Så jeg benytter blot første forslag.

Tak til alle.
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