Avatar billede civil05 Nybegynder
02. juni 2007 - 21:25 Der er 10 kommentarer og
1 løsning

problemer med sql i VBA

Hej,

Dette spørgsmål er en udspringer fra http://www.eksperten.dk/spm/780584

jeg har forsogt at implementere nedenstaaende kode i min database, men det giver problemer og jeg faar at vide at folgende streng er nul sngForbrug = rst("Vandmaaler")

Det jeg onsker er, at man paa en form som er linket til en tabel (tblForbrug) har folgende felter Vandmaaler, Dato og Forbrug.

efter indtastning af en Dato og vaerdi i feltet Vandmaaler skal koden kore og frataekke vaerdien for Vandmaler, svarende til en dag foer i forhold til datoen, fra den netop indtastende Vandmaaler vaerdi. Dette resultat skal saa afleveres til feltet Forbrug.

haaber virkelig I kan hjaelpe!!!!

Alle naevnte felter optraeder i tabellen

koden er her

Sub Vandmaaler_AfterUpdate()

Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String
Dim sngForbrug As Single

Set conn = CurrentProject.Connection
Set rst = New ADODB.Recordset

strSQL = "SELECT Vandmaaler FROM tblForbrug WHERE Dato = DateAdd('d', -1, tblForbrug.Dato) ORDER BY tblForbrug.Dato DESC;"
'Debug.Print strSQL
rst.Open strSQL, conn
    sngForbrug = rst("Vandmaaler")
rst.Close
Set rst = Nothing

'''strSQL = "INSERT INTO tblForbrug ( Vandmaaler, AflaesningsDato ) Values "
'''strSQL = strSQL & "(" & Me.txtForbrug & "," & Date & ")"
'Debug.Print strSQL
conn.Execute strSQL

conn.Close
Set conn = Nothing

MsgBox "Du har brugt: " & Me.Vandmaaler - sngForbrug

End Sub
Avatar billede kjulius Novice
02. juni 2007 - 22:35 #1
Du kan tage to veje. Enten skal du ændre sngForbrug til en type variant, som kan "rumme" en null værdi. Eller også skal du ændre din SQL. Jeg synes personligt, at du skal ændre din SQL:

SELECT Nz(Vandmaaler, 0) FROM tblForbrug WHERE Dato = DateAdd('d', -1, tblForbrug.Dato) ORDER BY tblForbrug.Dato DESC

Det vil gøre, at en null-værdi i tabellen (som bare betyder, at der endnu ikke er indtastet noget i feltet), vil blive "konverteret" til et 0.
Avatar billede kjulius Novice
02. juni 2007 - 22:36 #2
Feltet skal naturligvis navngives:

SELECT Nz(Vandmaaler, 0) AS Vandmaaler FROM tblForbrug WHERE Dato = DateAdd('d', -1, tblForbrug.Dato) ORDER BY tblForbrug.Dato DESC
Avatar billede civil05 Nybegynder
02. juni 2007 - 23:48 #3
Hej Kjulius,

jeg har prøvet din SELECT istedet for, men der få stadig en fejl med at sngForbrug er nul... jeg er desværre lidt blank på problemet...
Avatar billede civil05 Nybegynder
03. juni 2007 - 18:07 #4
kan det være det er mit datoformat der går i ged, eller??? hvis der er nogen som har en anden løsning så sig endelig til :-)
Avatar billede kjulius Novice
04. juni 2007 - 08:39 #5
Der kan selvfølgelig være det galt, at du ikke har indtastet noget i går. Så vil din forespørgsel ikke returnere nogen række. Det var også det forbehold svareren (ffsoft) angiv i dit oprindelige spørgsmål:

"Det er ikke en fejlsikker løsning, hvis ikke brugerne indtaster
hver dag vil det gå galt."

Du kunne i stedet anvende en let modificeret forespørgsel, som returnerer det senest indtastede, i stedet for kun fra i går:

SELECT Nz(Vandmaaler, 0) AS Vandmaaler
FROM tblForbrug
WHERE Dato = (SELECT (MAX(Dato) FROM tblForbrug WHERE Dato < Date) ORDER BY tblForbrug.Dato DESC
Avatar billede civil05 Nybegynder
04. juni 2007 - 09:32 #6
Hej Kjulius,

det lyder meget fornuftigt med den løsning, med at bruge den senest indtastede værdi. Jeg har indtastet din forespørgsel så min kode nu ser således ud, jeg får nu fejlen syntax error. Der manglede en ) i dit forslag den har jeg sat efter date... er det forkert?

Sub Vandmaaler_AfterUpdate()

Dim conn As ADODB.connection
Dim rst As ADODB.recordset
Dim strSQL As String
Dim sngForbrug As Single

Set conn = CurrentProject.connection
Set rst = New ADODB.recordset

strSQL = "SELECT Nz(Vandmaaler,0)As Vandmaaler FROM tblForbrug WHERE Dato = (Select (MAX(Dato) from tblForbrug Where Dato < Date))ORDER BY tblForbrug.Dato DESC;"
'Debug.Print strSQL
rst.Open strSQL, conn
    sngForbrug = rst("Vandmaaler")
rst.Close
Set rst = Nothing

''strSQL = "INSERT INTO tblForbrug ( Vandmaaler, AflaesningsDato ) Values "
''strSQL = strSQL & "(" & Me.txtForbrug & "," & Date & ")"
'Debug.Print strSQL
conn.Execute strSQL

conn.Close
Set conn = Nothing

'MsgBox "Du har brugt: " & Me.txtForbrug - sngForbrug

End Sub
Avatar billede civil05 Nybegynder
04. juni 2007 - 13:27 #7
Hej

med udgangspunkt i overstående kode har jeg fundet frem til at det sandsynligvis er mit datoformat som driller, da følgende virker:
strSQL = "SELECT Nz(Vandmaaler, 0) AS Vandmaaler FROM tblForbrug WHERE tblForbrug.Dato=#05/27/2007#"

her er der byttet rundt på dd og mm

men hvordan formaterer jeg mit datofelt Dato så jeg kan bruge det istedet den specifikke 05/27/2007?
Avatar billede civil05 Nybegynder
04. juni 2007 - 14:13 #8
Jeg har fundet denne her:
Format(tblForbrug.Dato,'mm-dd-yyyy) men jeg er i tvivl om hvordan jeg får den implementeret?
Avatar billede civil05 Nybegynder
04. juni 2007 - 14:45 #9
Saa har jeg selv fundet losningen

strSQL = "SELECT Nz(Vandmaaler, 0) AS Vandmaaler FROM tblForbrug WHERE tblForbrug.Dato= DateAdd('d', -1, #" & Format([Dato], "mm-dd-yyyy") & "# ) ORDER BY tblForbrug.Dato DESC;"

Kjulius du skal have point som tak for input, laeg et svar
Avatar billede kjulius Novice
04. juni 2007 - 21:58 #10
Undskyld jeg ikke har svaret før, men jeg har haft problemer med min webspeed forbindelse, som er temmelig ustabil pt.

Vedr. min SQL var der en fejl (en startparantes for meget), så det skulle have været:

SELECT Nz(Vandmaaler, 0) AS Vandmaaler
FROM tblForbrug
WHERE Dato = (SELECT MAX(Dato) FROM tblForbrug WHERE Dato < Date)
ORDER BY tblForbrug.Dato DESC

Mht. datoformater, så er det mest foolproof format at holde sig til det amerikanske udgangspunkt, som den altid forstår:

mm/dd/yy

Men det er når du specificerer den specifikt som en tegnstreng, altså i # #. Så længe du holder dig til rene datoer som returneret fra Date funktionen burde det ikke være nødvendigt at formattere den i et specielt format.

Jeg kan derfor ikke helt forstå, hvis din oprindelige forespørgsel skulle give dig problemer - i hvert fald så længe der bliver indtastet en ny værdi hver dag. I så fald vil jeg anbefale min SQL med subquery for at finde den senest indtastede værdi.
Avatar billede civil05 Nybegynder
05. juni 2007 - 12:19 #11
Hej Kjulius,

jeg syntes også umiddelbart, at din løsning var bedre, men så kom jeg til at tænke på hvis brugeren går tilbage til tidligere indtastninger og retter vandforbrug, så vil den jo ikke finde den rigtige værdi fordi den tager udgangspunkt i date(), jeg har suppleret DateAdd(-1) med en if sætning som oplyser brugeren om manglende indtastning dagen før såfremt det bliver nødvendigt, men tak for hjælpen alligevel! Jeg er forholdsvis ny bruger, men synes rigtig godt om dette forum :-)
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