Avatar billede longgaard_at_work Nybegynder
06. marts 2013 - 11:22 Der er 9 kommentarer og
1 løsning

QueryDefs syntaksfejl ved brug af kommatalsvariabel i WHERE klausulen

I WHERE klausulen, skal jeg bruge variabel (Type: single; Navn: UdskriftsIndikator) indeholdende et kommatal. Det giver mig lidt problemer med syntaksen i min QueryDefs.
Hvis jeg i testøjemed undlader variablen, kører QueryDefs fint.

Følgende fejl opstår.
Run-time error '3075':

Der er en syntaksfejl, fordi der mangler et komma. i
forespørgselsudtrykket "(((T_Attester.Udskrevet) = False) AND
((T_Attester.UdskriftsInstans) = 0,4102136))".

Min kode ser således ud:

Dim UdskriftsIndikator As Single
UdskriftsIndikator = UdskriftsIndikator = Rnd(Now())

CurrentDb.QueryDefs("Q_Rapport").SQL = "SELECT bla, bla, bla..." & _
"FROM bla, bla, bla..." & _
"WHERE (((T_Attester.Udskrevet) = False) AND ((T_Attester.UdskriftsInstans) = " & UdskriftsIndikator & "))" & _
"ORDER BY bla, bla, bla... ;"

Nogle gode bud på korrekt tegnsætning omkring variablen "UdskriftsIndikator"?
Avatar billede hugopedersen Nybegynder
06. marts 2013 - 11:58 #1
Du kan ikke bruge en variabel i en SQL sætning!

Hvis du vil vælge poster hvor Udskriftsinstans = Udskriftindikator så skal du lave en VBA funktion der returnerer en værdi.

Public Function UdskriftIndikator() As Double

  UdskriftIndikator = 1.23456
 
End Function

SELECT Table1.UdskriftsIndikator
FROM Table1
WHERE UdskriftsIndikator=UdskriftIndikator();
Avatar billede longgaard_at_work Nybegynder
06. marts 2013 - 13:06 #2
Det er modtaget.

Jeg kan se at det bliver nødvendigt til at gentænke mit forsøg på at give "UdskriftsIndikator" en randomizeret unik værdi, idet værdien skal bruges flere gange i koden til knappen.

Som jeg ser det kan jeg ikke opsamle værdien fra funktionsafviklingen, indlejret i QueryDefs på nogen måde.
Avatar billede hugopedersen Nybegynder
06. marts 2013 - 13:13 #3
Hvis jeg forstår dig ret så vil du danne en random værdi på en knap som du så vil bruge flere gange indtil du næste gang trykker på knappen.

Det er ret nemt:
Lav en global variabel som du tildeler en værdi når du trykker på knappen.
Sæt din funktion UdskriftIndikator til at returnere denne værdi

Så burde du have den ønskede funktion
Avatar billede longgaard_at_work Nybegynder
06. marts 2013 - 13:24 #4
Tænkte selv lidt på den mulighed, men er ikke helt på det rene med hvor global en global variabel er i et flerbruger system.

Testede iøvrigt med en Stringværdi "StrSQL" indeholdende koden til min QueryDefs.
CurrentDb.QueryDefs("Q_Rapport").SQL = StrSQL

Det bryder Access sig heller ikke om. Der rapporteres stadig kommafejl.
Hænger det sammen med at vi bruger [,] som komma frem for [.] punktummer?
Avatar billede hugopedersen Nybegynder
06. marts 2013 - 13:30 #5
Det kan meget vel være :-)

Hvad er det helt specifikt du skal bruge din SQL til?
Er det en recordsource til en rapport eller hvad.

Hvis du har et flerbruger system så har du forhåbentligt lavet det så der er en frontend til hver bruger. Ellers kan du meget nemt komme i problemer.
Jeg lavede engang noget der kørte på Citrix, men hver bruger havde sin egen frontend og det spillede helt fint.
Avatar billede longgaard_at_work Nybegynder
06. marts 2013 - 14:14 #6
Systemet er pt. under udvikling, men der bliver en frontend til lokal afvikling for hver bruger, og fælles tabeller på et netværksdrev.

Frontend havde jeg tænkt mig skulle være ens kopier til alle brugere. Problem?

Ideen med QueryDefs er at brugerene skal kunne køre nogle rapporter til print.
Hver post skal udskrives, men kun een gang.
Selv om to eller flere bruger kører rapport til print samtidig, må der ikke forekomme duplikerede poster på tryk.

For at imødegå problemer med paper jam mv. i printeren skal brugeren manuelt verificerer at print er OK.

Til det bruger jeg to felter i tabellen.
Et Ja/Nej felt til at indikerer om print tidligere et gået godt.
Et Tal felt (Single) til at angive at posten er under udskrivning.
Det er single feltet jeg gerne vil give en unik randomizeret værdi, som jeg kan knytte til brugeren og dennes udskriftsession.
Avatar billede longgaard_at_work Nybegynder
06. marts 2013 - 14:55 #7
Lidt mere info:
Ja/Nej og UdskriftsIndikator felterne bliver initialiseret med kendte værdier ved postens oprettelse.

UdskriftsIndikator bliver opdateret til en unik random værdi lige inden rapporten trækkes. Poster til rapporten bliver udvalgt på baggrund af begge disse felter.

Når brugeren verificerer at posterne er udskrevet korrekt toggles Ja/Nej feltet, og UdskriftsIndikator feltet bliver sat til en ny kendt værdi.

Giver mit skriv mening, eller har jeg hovedet for langt inde i databasen?
Avatar billede hugopedersen Nybegynder
06. marts 2013 - 15:29 #8
Du skal i hvert fald sørge for at hver bruger har sin egen kopi af frontend - det siges at man godt kan have flere brugere til at køre på den samme, men det har jeg prøvet og det er ikke smart.
Øvelsen bliver så at sørge for at alle har den sidste nye version af frontend.
Det lavede jeg på Citrix serverne ved at der kørte et script hver nat som kopierede en ny version rundt til alle brugere. Så smed jeg bare en ny version op hvor den kopierede fra nåe jeg lavede ændringer.
Når alle har deres egen kopi, så behøver du heller ikke spekulere på om variable ændres. Det vil de nu nok heller ikke gøre hvis den samme fil køres af flere hvis den ligger på en server og afvikles fra lokal maskine. Problemt vil være hvis du som jeg gjorde havde det på en Citrix hvor flere brugere så ville køre den samme fil fra samme maskine.

Jeg kan ikke lige gennemskue meningen med at en post ikke må skrives ud af mere end en bruger ad gangen. Men det skal jeg nok heller ikke :-)

I dag roder jeg ikke så meget med Access mere. Jeg bruger den mest til når jeg udvikler Delphi applikationer. Da bruger jeg næsten kun MySQL som database (få gange MS SQL)

Du kan altid prøve at kalde mig på  Messenger via  oz8hp@hotmail.com hvis du har nogle spørgsmål som jeg måske kan hjælpe med.
Avatar billede longgaard_at_work Nybegynder
06. marts 2013 - 16:04 #9
Årsagen til at en post kun må printes een gang er at udskriften skal sendes ud af huset, og vi ønsker ikke at samme post sendes mere end een gang.

Jeg har nu fået testet metoden med en global variabel og funktionskald, det giver samme problem med komma.

Tilgengæld kan jeg godt bruge en variabel i min QueryDefs, blot det er et heltal.

Jeg laver derfor en typecast til Long og ganger med 10 mill.
UdskriftsIndikator = CLng(Rnd(Now()) * 10000000)

og i QueryDefs typecaster jeg tilbage til Single (som passer til feltet i databasen
"WHERE (((T_Attester.Udskrevet) = False) AND ((T_Attester.UdskriftsInstans) = " & CSng(UdskriftsIndikator) & "))" & _


Alt i alt er jeg stadig lidt overbevist om at det er et spørgsmål om korrekt tegnsætning omkring variablen som gør at Access ikke forstår variablen i første omgang...
Avatar billede neoman Novice
17. marts 2013 - 16:07 #10
I SQL sætninger SKAL kommatal skrives på det amerikanske format, altså med "." som decimal separator. Når vi nu engang har "," som decimalseparator, så kan vi få decimaltal ind i SQL vha. Str-funktionen, som altid anvender "." som decimalseparator.

Fx Str(1,5)= "1.5" hvilket jo er det du skal bruge.
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