Avatar billede jensrrasmussen Juniormester
24. marts 2014 - 15:36 Der er 6 kommentarer og
1 løsning

INSERT i ACCESS

Hej eksperter/

Jeg har nu brugt 1 dag på at få en INSERT sætning til at lave en ny record i min access-database uden held.

Jeg har følgende udfordringer
- første felt, kaldet Id, er et autonummeringsfelt, som access selv skal tildele
- de andre 46 felter er en skøn blanding af tekst, notat, tal og datoer.
- i flere felter indeholder værdien et eller flere kommaer
- alle felter - bortset fra Id, skal være en kopi af en allerede eksisterende record.
- jeg er usikker på hvordan jeg får eksekveret INSERT korrekt

Jeg trækker den eksisterende record ud med følgende kode:
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open DSN
strSQL = "SELECT * FROM Varekatalog where Id =" & Vareid
set rs = Conn.Execute(strSQL)
Og ved en kontroludskrift ser det rigtigt ud.

Og jeg forsøger at lave den nye record ved at fortsætte med:
Set Conn1 = Server.CreateObject("ADODB.Connection")
Conn1.Open DSN
strSQL1 = "Insert into Varekatalog (Varenr, navn, aargang, vingaard, vinforhandler, land, region, klassifikation, pris, druetype1, druetypemaengde1, druetype2, druetypemaengde2, druetype3, druetypemaengde3, druetype4, druetypemaengde4, druetype5, druetypemaengde5, druetype6, druetypemaengde6, druetype7, druetypemaengde7, cl, tilbudspris, tilbudsfrist, tilbudsflaskemaengde, nyhed, beskrivelse, farve, aroma, smag, anmeldelse1, anmeldelse2, anmeldelse3, alkoholprocent, billedplacering, produktion, udbytte, type, lagring, madtil, udsolgt, sortering, senestaendret, oprettet) "
          strSQL1 = strSQL1 & " VALUES (" & rs("Varenr") & ", '" & rs("navn") & "', " & rs("aargang") & ", " &  rs("vingaard") & ", " & rs("vinforhandler") & ", '" & rs("land") & "', '" &  rs("region") & "', '" &  rs("klassifikation") & "', " &  rs("pris") & ", " &  rs("druetype1") & ", " &  rs("druetypemaengde1") & ", " &  rs("druetype2") & ", " &  rs("druetypemaengde2") & ", " &  rs("druetype3") & ", " &  rs("druetypemaengde3") & ", " &  rs("druetype4") & ", " &  rs("druetypemaengde4") & ", " &  rs("druetype5") & ", " &  rs("druetypemaengde5") & ", " &  rs("druetype6")
        strSQL1 = strSQL1 & ", " & rs("druetypemaengde6") & ", " &  rs("druetype7") & ", " &  rs("druetypemaengde7") & ", " &  rs("cl") & ", " &  rs("tilbudspris") & ", '" &  rs("tilbudsfrist") & "', " &  rs("tilbudsflaskemaengde") & ", '" &  rs("nyhed") & "', '" &  rs("beskrivelse") & "', '" &  rs("farve") & "', '" &  rs("aroma") & "', '" &  rs("smag") & "', '" &  rs("anmeldelse1") & "', '" &  rs("anmeldelse2") & "', '" &  rs("anmeldelse3") & "', " &  rs("alkoholprocent") & ", '" &  rs("billedplacering") & "', " &  rs("produktion") & ", " &  rs("udbytte") & ", '" &  rs("type") & "', '" &  rs("lagring") & "', '" &  rs("madtil") & "', '" &  rs("udsolgt") & "', " & rs("sortering") & ", #" & null & "#, #" & now & "#)"

Conn1.Execute(strSQL1)

Det giver fejlen: Der er en syntaksfejl i INSERT INTO-sætningen.

Men hvilke fejl er der - for der er sikkert mere end en :-(?

Hvis jeg undlader at markere tekst og notater med ' ' og datoer med # # samt intet omkring tal, får jeg en anden fejl, nemlig:  Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "10 Years Port". (Dette er værdien af feltet navn)
Det interessante her er at dette er felt nr. 3. Felt nr. 2, som er et tal-felt ved navn varenr brokker den sig ikke over.

Bemærk at jeg intet sted skriver noget om recordens Id, som jeg tror Access selv vil sætte - så jeg angiver kun 46 af de 47 felter i min INSERT-sætning, såvel med feltnavn som med feltværdi. Er det forkert?

Jeg har også mistanke til de tekstfelter, der indeholder kommaer - kan de lave ballade i strengen af VALUES, som jo er adskilt af kommaer?

Mange spørgsmål - håber på hjælp, så jeg kan få indsat en ny record.

mvh.
  /Jens
Avatar billede kgkg Nybegynder
24. marts 2014 - 15:47 #1
Hvordan ser din strSQL1 ud hvis du laver et dump af variablen?

Det du specielt skal kigge på er de felter hvor du har priser. De skal konverteres til tekst og omsluttes af anførselstegn, da danske pris formater indeholder et komma, er det tit der hvor der opstår problemer ved en INSERT. Da komma jo er feltadskiller.

Og i dine notat felter skal du sørge for at de også er omsluttet af anførselstegn, da de som du selv nævner kan indeholde komma.
Avatar billede jensrrasmussen Juniormester
24. marts 2014 - 16:37 #2
OK det vil jeg prøve, for jeg har 12 felter med kommatal (reelle tal).

Og hvad med dobbelt anførselstegn for de forekommer også i nogle af felterne. Skal disse felter Replaces med " ist. "?

mvh.
  /jens
Avatar billede jensrrasmussen Juniormester
24. marts 2014 - 18:24 #3
Hej igen/

Så har jeg konverteret alle decimaltal med Cstr(decimaltal) og omsluttet dem med anførselstegn og konverteret såvel enkelt som dobbeltanførselstegn med funktionen:
Function udskift(tegn)
If IsNull(tegn) Or tegn = "" then
  udskift = null
else
  udskift = CStr(replace(replace(Replace(tegn,"'","'"),""","""),",",","))
end if
end function

alligevel får jeg samme fejl. Min strSQL1-sætning viser ved udskrift:

StrSQL1=Insert into Varekatalog (Varenr, navn, aargang, vingaard, vinforhandler, land, region, klassifikation, pris, druetype1, druetypemaengde1, druetype2, druetypemaengde2, druetype3, druetypemaengde3, druetype4, druetypemaengde4, druetype5, druetypemaengde5, druetype6, druetypemaengde6, druetype7, druetypemaengde7, cl, tilbudspris, tilbudsfrist, tilbudsflaskemaengde, nyhed, beskrivelse, farve, aroma, smag, anmeldelse1, anmeldelse2, anmeldelse3, alkoholprocent, billedplacering, produktion, udbytte, type, lagring, madtil, udsolgt, sortering, senestaendret, oprettet) VALUES (555, '10 Years Port', , , , 'Portugal', 'Duoro Valley', '', '169', 49, '40,5', 73, '30', 76, '20', 37, '10', , '', , '', , '', '', '', '', , 'Ja', 'Cognacfarvet 10 år gammel Tawny med et mix mellem gamle og nye blandinger, som er vanskelig at efterligne.
Quinta da Marrocos, er et familiedrevet Portvinsslot, som ligger lidt øst for Pinhao, som vel regnes for smørhullet i portvinsområdet. Slottet ligger helt ned til Douro hovedfloden.
Mange steder i portvins området har man kørt med store entreprenørmaskiner og jævnet de stendiger, som man i århundreder har opbygget, for at al arbejdet kan gøres maskinelt. Det har medført, at jorden er rodet rundt og har givet mange jordskred. Ydermere er det også meget unge (smagssvage) planter, der oftest benyttes.
I Quinta da Marrocos derimod holder man de gamle traditioner i hævd og lægger størst vægt på kvalitet. Druerne dyrkes stadig på terrasser, og der plantes kun nye planter, når de gamle dør. Dvs. at vinen er baseret på meget gamle planter - ofte op til 100 år, som giver et utroligt lavt udbytte. Dette giver en flot velafbalanceret vin, med elegance og god struktur, som så gør, at man kan gære mere af sukkeret ud og dermed bliver vinen ikke så "sødmarmeladet". Den kan derfor fint anvendes til kraftige kødretter så som peberbøf, oksesteg og lam, ja og så selvfølgelig også til dessert og kaffe.', '', 'Bouquet af nødder og honning.', 'En smag af modne frugter og blomster.', 'Det vandt bronzemedalje ved "Bruxelles Monde Selection concours 2007".', '', '', '', '555.JPG', , '', 'Dessertvin', '', '', 'Nej', 50, ##, #24-03-2014#)


Så hvad mon jeg gør galt - da fejludskriften (err.description) er : "Der er en syntaksfejl i INSERT INTO-sætningen"

mvh.

  /Jens
Avatar billede kgkg Nybegynder
24. marts 2014 - 19:36 #4
Du har et felt som du kalder type.

type er et reserveret ord i Access, så her skal du ændre type til [type].

I din VALUES definition, har du følgende:
VALUES (555, '10 Years Port', , , , 'Portugal'

Efter 10 Years Port, har du , , , , stående. Du skal sørge for at det står som en tom streng, så der skal stå:

VALUES (555, '10 Years Port', '', '', '', 'Portugal'

Der mangler ligeledes '' i din VALUES definition for felt 18 og 20(druetype 5 og 6) og efter værdien '555.JPG' mangler der også  '' tegnende.

Nå, men så er der lidt at starte med.

Du kan evt. splitte din SQL op, så den kun indeholder et par felter. Og så prøve at indsætte den. Og hvis det går godt, så tilknytter du flere og flere felter. Indtil at hele din SQL sætning accepteres.
Avatar billede groenaert Novice
24. marts 2014 - 19:27 #5
Det kan være fordi du bruger ordet type:
StrSQL1=Insert into Varekatalog (Varenr, navn, aargang, vingaard, vinforhandler, land, region, klassifikation, pris, druetype1, druetypemaengde1, druetype2, druetypemaengde2, druetype3, druetypemaengde3, druetype4, druetypemaengde4, druetype5, druetypemaengde5, druetype6, druetypemaengde6, druetype7, druetypemaengde7, cl, tilbudspris, tilbudsfrist, tilbudsflaskemaengde, nyhed, beskrivelse, farve, aroma, smag, anmeldelse1, anmeldelse2, anmeldelse3, alkoholprocent, billedplacering, produktion, udbytte, type,

Type er et reserveret ord i Access. Prøv med [type] i stedet for.
Avatar billede jensrrasmussen Juniormester
24. marts 2014 - 20:37 #6
hej  igenigen/

Jeg er ikke en haj, så jeg må lige forstå dig ret.

Jeg har rettet ", type," til ", [type]," - det var imidlertid ikke nok, da fejlmeddelelsen stadig er den samme.

Du siger : "Efter 10 Years Port, har du , , , , stående. Du skal sørge for at det står som en tom streng, så der skal stå: VALUES (555, '10 Years Port', '', '', '', 'Portugal' "
Men disse felter er tomme heltalsfelter. Skal de også konverteres til strenge?

Du siger: "Der mangler ligeledes '' i din VALUES definition for felt 18 og 20(druetype 5 og 6) og efter værdien '555.JPG' mangler der også  '' tegnende."
Disse felter igen tomme heltalsfelter, så samme spørgsmål som ovenfor.

Er det korrekt, at jeg IKKE angiver feltnavn for det første autonummererede felt? Eller skal jeg have Id, i starten og så en tom værdi? Altså Insert into Varekatalog (Id, Varenr, ......) og så udlade at give en value for Id, men starte med values for varenavn, ....?

mvh.    /Jens
Avatar billede jensrrasmussen Juniormester
24. marts 2014 - 22:54 #7
Så lykkedes det.

Alle tekstfelter røg gennem en if-then-else som:
  if IsNull(rs("lagring")) then
      strSQL1 = strSQL1 & ", " & "null"
  else
      strSQL1 = strSQL1 & ", '" & Udskift(rs("lagring")) & "'"
  end if

og alle heltalfelter gennem:
  if IsNull(rs("sortering")) then
      strSQL1 = strSQL1 & ", " & "null"
  else
      strSQL1 = strSQL1 & ", " & Udskift(rs("sortering"))
  end if

Og decimaltallene (reelle tal) gennem:
  if IsNull(rs("alkoholprocent")) then
      strSQL1 = strSQL1 & ", " & "null"
  else
      strSQL1 = strSQL1 & ", '" & rs("alkoholprocent") & "'"
  end if
mens datofelter blev omkrandset af # #

hvor funktionen udskift er:
Function udskift(tegn)
  udskift = replace(Replace(tegn,"'","'"),""",""")
end function

Og det gav en strSQL, som virker :-): nemlig:

StrSQL1=Insert into Varekatalog (Varenr, navn, aargang, vingaard, vinforhandler, land, region, klassifikation, pris, druetype1, druetype2, druetype3, druetype4, druetype5, druetype6, druetype7, druetypemaengde1, druetypemaengde2, druetypemaengde3, druetypemaengde4, druetypemaengde5, druetypemaengde6, druetypemaengde7, cl, tilbudspris, tilbudsfrist, tilbudsflaskemaengde, nyhed, beskrivelse, farve, aroma, smag, anmeldelse1, anmeldelse2, anmeldelse3, alkoholprocent, billedplacering, produktion, udbytte, [type], lagring, madtil, udsolgt, sortering, senestaendret, oprettet) VALUES (1234, 'TEST af hjemmeside', null, 9, null, '', '', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, '', null, 'Ja', '', '', '', '', '', '', '', '0', '', null, null, 'ingen', '', '    8 - Abrikos trifli', 'Nej', 50, null, #24-03-2014#)


Så tak for hjælpen

mvh.
  /jens
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