Avatar billede rosco Novice
18. februar 2009 - 12:47 Der er 24 kommentarer og
1 løsning

Access og Accent

Jeg bruger denne kode ved ikke på liste.

Private Sub LinkRelaterede_NotInList(NewData As String, Response As Integer)
Dim prompt As String
     
    prompt = "Det indtastede er ikke på listen." & vbCrLf
    prompt = prompt & "Tilføjes?"
   
    If (MsgBox(prompt, vbExclamation + vbYesNo, "Not in list!") = vbYes) Then
       
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO tblRelaterede(Relaterede) VALUES ('" & NewData & "')"
        DoCmd.SetWarnings True
       
        Response = acDataErrAdded
    Else
        Response = acDataErrContinue
       
    End If
End Sub

Men den fejler når den tekst der skal tilføjes indeholder franske accent som (`´') som f.eks.  L'Instant de Guerlain, i en database til registrering af parfumer
Avatar billede mugs Novice
18. februar 2009 - 13:14 #1
Sakset fra hjælpen:

Quotation Marks in Strings
See Also Specifics
In situations where you must construct strings to be concatenated, you may need to embed a string within another string, or a string variable within a string. Situations in which you might need to nest one string within another include:

When specifying criteria for domain aggregate functions.
When specifying criteria for the Find methods.
When specifying criteria for the Filter or ServerFilter property of a form.
When building SQL strings.

In all of these instances, Microsoft Access must pass a string to the Microsoft Jet database engine. When you specify a criteria argument for a domain aggregate function, for example, Microsoft Access must evaluate any variables, concatenate them into a string, and then pass the entire string to the Jet database engine.

If you embed a numeric variable, Microsoft Access evaluates the variable and simply concatenates the value into the string. If the variable is a text string, however, the resulting criteria string will contain a string within a string. A string within a string must be identified by string delimiters. Otherwise, the Jet database engine won't be able to determine which part of the string is the value you want to use.

The string delimiters aren't actually part of the variable itself, but they must be included in the string in the criteria argument. There are three different ways to construct the string in the criteria argument. Each method results in a criteria argument that looks like one of the following examples.

"[LastName] = 'Smith'"
- or -

"[LastName] = ""Smith"""
Include Single Quotation Marks
You should include single quotation marks in the criteria argument in such a way that when the value of the variable is concatenated into the string, it will be enclosed within the single quotation marks. For instance, suppose your criteria argument must contain a string variable called strName. You could construct the criteria argument as in the following example:

"[LastName] = '" & strName & "'"
When the variable strName is evaluated and concatenated into the criteria string, the criteria string becomes:

"[LastName] = 'Smith'"
Note  This syntax does not permit the use of apostrophes (') within the value of the variable itself. If the value of the string variable includes an apostrophe, Microsoft Access generates a run-time error. If your variable may represent values containing apostrophes, consider using one of the other syntax forms discussed in the following sections.

Include Double Quotation Marks
You should include double quotation marks within the criteria argument in such a way so that when the value of the variable is evaluated, it will be enclosed within the quotation marks. Within a string, you must use two sets of double quotation marks to represent a single set of double quotation marks. You could construct the criteria argument as in the following example:

"[LastName] = """ & strName & """"
When the variable strName is evaluated and concatenated into the criteria argument, each set of two double quotation marks is replaced by one single quotation mark. The criteria argument becomes:

"[LastName] = 'Smith'"
This syntax may appear more complicated than the single quotation mark syntax, but it enables you to embed a string that contains an apostrophe within the criteria argument. It also enables you to nest one or more strings within the embedded string.

Include a Variable Representing Quotation Marks
You can create a string variable that represents double quotation marks, and concatenate this variable into the criteria argument along with the value of the variable. The ANSI representation for double quotation marks is Chr$(34); you could assign this value to a string variable called strQuote. You could then construct the criteria argument as in the following example:

"[LastName] = " & strQuote & strName & strQuote
When the variables are evaluated and concatenated into the criteria argument, the criteria argument becomes:

[LastName] = "Smith"
Avatar billede rosco Novice
18. februar 2009 - 14:56 #2
har forsøgt med :
DoCmd.RunSQL "INSERT INTO tblRelaterede(Relaterede) VALUES ('""" & NewData & """"')"

DoCmd.RunSQL "INSERT INTO tblRelaterede(Relaterede) VALUES ( & strQuote & NewData & strQuote )"

Det løste ikke problemet med at tilføje direkte til tabellen hvis teksten indeholder accent.

Måske har jeg ikke gjort det korrekt.
Avatar billede fdata Forsker
18. februar 2009 - 19:54 #3
Det er nok ikke alle accenter, der giver problemer. Traditionelt er det kun en almindelig apostrof, idet den også bruges i SQL udtryk. Prøv evt.

  Replace(NewData;"'";"´")

Altså konverter fra den irriterende ' til en harmløs ´.
´ er apostroffen, som man normalt bruger over á; men den funker også over blanktegn.
Avatar billede rosco Novice
18. februar 2009 - 22:28 #4
Hvor skal den Placeres?

Alt efter apostroffen i dette, Replace(NewData;"'";"´") opfattes som kommentar.  '";"´")
Avatar billede fdata Forsker
18. februar 2009 - 22:43 #5
DoCmd.RunSQL "INSERT INTO tblRelaterede(Relaterede) VALUES ('" & Replace(NewData;"'";"´") & "')"
Avatar billede rosco Novice
19. februar 2009 - 13:30 #6
fdata:
Jeg får denn fejlmeddelelse,

Compile error:
Expected list separator or )

Den fejler på semicolonet efter NewData
Avatar billede fdata Forsker
19. februar 2009 - 18:12 #7
Oooops. Sorry. Skift lige semikolonnerne ud med kommaer. Altså:

DoCmd.RunSQL "INSERT INTO tblRelaterede(Relaterede) VALUES ('" & Replace(NewData, "'", "´") & "')"

Replace-udtrykket står jo i VBA. Her bruger man komma.
I forespørgsler bruger man semikolon. Min fejl  :o(
Avatar billede rosco Novice
20. februar 2009 - 10:36 #8
fdata:
Det fungerer stadig ikke :-/
måske det var bedre at sende brugeren videre til en oprettelsesformular, i dette tilfælde.
Avatar billede fdata Forsker
21. februar 2009 - 17:45 #9
Jeg er ikke helt med på din seneste kommentar. Back to reality:
Hvad er problemet (fejlmeddelelse)?
Kan du evt. droppe lidt kode her, så vi kan tjekke den?
Avatar billede rosco Novice
22. februar 2009 - 13:32 #10
Koden er denne

Private Sub LinkRelaterede_NotInList(NewData As String, Response As Integer)
Dim prompt As String
     
    prompt = "Det indtastede er ikke på listen." & vbCrLf
    prompt = prompt & "Tilføjes?"
   
    If (MsgBox(prompt, vbExclamation + vbYesNo, "Not in list!") = vbYes) Then
       
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO tblRelaterede(Relaterede) VALUES ('" & Replace(NewData, "'", "´") & "')"
        DoCmd.SetWarnings True
       
        Response = acDataErrAdded
    Else
        Response = acDataErrContinue
       
    End If
End Sub

Den nye der skal oprettes på listen: L'Air du Temps

Meddelelse:

Den tekst, du indtastede, er ikke et element på listen
Marker et element på listen, eller indtast en tekst, der passer til et af de viste elementer.
Avatar billede fdata Forsker
22. februar 2009 - 14:02 #11
Men det er jo ikke en fejlmeddelelse, der har noget at gøre med INSERT INTO sætningen!
Bliver posten indsat?
(Tast evt F9 i INSERT INTO linien og se, om Access stopper dér, når du tester dropdown boksen)
Avatar billede rosco Novice
22. februar 2009 - 15:34 #12
Problemet er at teksten ikke bliver indsat i tabellen, når teksten indeholder et accent, tekst uden accent indsættes uden problemer.
Avatar billede fdata Forsker
22. februar 2009 - 20:07 #13
Gider du ikke prøve at skyde en Debug.Print ind og så vise mig, hvad der dukker op i Immediate vinduet (Ctrl-G), når du har forsøgt at indsætte.
Altså:

Private Sub LinkRelaterede_NotInList(NewData As String, Response As Integer)
Dim prompt As String
Dim strSQL as String
   
    prompt = "Det indtastede er ikke på listen." & vbCrLf
    prompt = prompt & "Tilføjes?"
 
    If (MsgBox(prompt, vbExclamation + vbYesNo, "Not in list!") = vbYes) Then
     
        DoCmd.SetWarnings False
        strSQL="INSERT INTO tblRelaterede(Relaterede) VALUES ('" & Replace(NewData, "'", "´") & "')"
        Debug.Print strSQL
        DoCmd.RunSQL (strSQL)
        DoCmd.SetWarnings True
     
        Response = acDataErrAdded
    Else
        Response = acDataErrContinue
     
    End If
End Sub
Avatar billede rosco Novice
22. februar 2009 - 21:04 #14
INSERT INTO tblRelaterede(Relaterede) VALUES ('L´Air du Temps')
Avatar billede fdata Forsker
23. februar 2009 - 18:34 #15
Den er jo i orden. Det burde da virke. Mystisk!!!?!??

Det mest underlige er at du BÅDE får Access' standardfejlmeddelelse OG at rutinen tilsyneladende udføres.

Er vi enige om at det er scenariet? Du får både fejlmeddelelsen
  Den tekst, du indtastede, er ikke et element på listen
  Marker et element på listen, eller indtast en tekst, der passer til et af de viste elementer.
.. og ser INSERT INTO sætningen dukke op i Immediate-vinduet?
Avatar billede rosco Novice
24. februar 2009 - 18:10 #16
Ja det er korrekt.
Og det burde virke.??
Avatar billede fdata Forsker
25. februar 2009 - 09:02 #17
Tjah... Hele fidusen ved NotInList er jo at du selv kan styre hvad der skal ske, hvis elementet ikke er på listen. I dit tilfælde udføres din kode tilsyneladende samtidig med at Access viser sin standardfejlmeddelelse; men uden at posten oprettes!?! Ved elementer uden accenter kører alt perfekt!!?!!

Jeg har testet et tilsvarende scenarie her - og alt kører perfekt. Er du stensikker på at der ikke er anden kode indblandet, der forstyrrer billedet?
Har du mulighed for at isolere tabellen og koden i en lille testbase?
Avatar billede rosco Novice
28. februar 2009 - 17:18 #18
Jeg prøver din løsning i en testdb.
Avatar billede rosco Novice
06. marts 2009 - 23:23 #19
har prøvet i en anden db, samme resultat.
Avatar billede fdata Forsker
09. marts 2009 - 00:24 #20
Det lyder højst besyndeligt.

Lad os lige rekapitulere:
1. Der er ikke anden kode involveret end den, du har vist her
2. I begge tilfælde (med/uden accent) eksekveres din kode
3. Ved tekster UDEN accent vises kun din egen meddelelse hvorefter posten oprettes
3. Ved tekster MED accent vises Access' fejlmeddelelse og derefter din egen meddelelse, hvorefter posten IKKE oprettes!?!

Hvis ovenstående er korrekt, står vi jo overfor et ægte mysterium. Som skrevet har jeg testet et tilsvarende scenarie, som spiller uden problemer.

Nu er nysgerrigheden/stædigheden jo vakt. Reglerne på e tillader jo ikke at vi løser problemer "bagom ryggen"; så den eneste mulighed, jeg ser, er at du poster din email adresse her. Så kunne jeg jo sende dig en email adresse, som du kunne sende din nye lille testbase til. Så tjekker jeg den og poster mine kommentarer her på e.
Avatar billede rosco Novice
11. marts 2009 - 22:11 #21
Jeg takker:
Vi skal vel bare sørge for at løsningen ender her til glæde for andre.

Mail: erlenbach snabela computer.dk
Avatar billede rosco Novice
11. marts 2009 - 22:12 #22
db er i 2007, kan konverteres.
Avatar billede fdata Forsker
15. marts 2009 - 23:02 #23
Db modtaget og tjekket.

Problemet er generel forvirring. Apostroffer (') erstattes med accenter(´); men så kan posten ikke genfindes. Årsagen er, at man jo indtaster med apostrof; men posten ligger nu med accent ;o(

Løsningen ligger lige for. I stedet for
  Replace(NewData, "'", "´")
bruger du bare
  Replace(NewData, "'", "''") 

Altså: Erstat en apostrof med to. Så spiller det.

(Husk at rette posterne, der nu er oprettet med accent)
Avatar billede rosco Novice
19. marts 2009 - 10:03 #24
fdata: Tusind tak, det virker perfekt.
Avatar billede fdata Forsker
19. marts 2009 - 10:20 #25
Super. Vi er jo ikke glade for at give op, vel? ;o))
Takker for point
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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