24. marts 2014 - 15:36Der 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.
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.
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.
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"
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.
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, ....?
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
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.