Avatar billede civil05 Nybegynder
28. maj 2007 - 18:28 Der er 15 kommentarer og
1 løsning

sql til vba

Hej

jeg sidder med en database hvor jeg ønsker at flytte mine forespørgsler over i VBA, men det driller. Følgende SQL virker fint i en forespørgsel, men hvordan skal det se ud for at virke i VBA. Funktionen skal trække to vandaflæsninger fra hinanden på baggrund af vandaflæsningen fra foregående og nyeste aflæsning.

Forskel: [T].[Vand]-(SELECT T2.[Vand] FROM Tabel T2 WHERE T2.Dato = DateAdd("d",-1,T.Dato))

mvh
Anders
Avatar billede mugs Novice
28. maj 2007 - 18:52 #1
Du kan altid fyre en SQL af i VBA mws kommandoen DoCmd.RunSQL

DoCmd.RunSQL "[T].[Vand]-(SELECT T2.[Vand] FROM Tabel T2 WHERE T2.Dato = DateAdd("d",-1,T.Dato))"
Avatar billede civil05 Nybegynder
28. maj 2007 - 18:56 #2
det prøver jeg, men hvordan skriver jeg udtrykket så det er input til feltet forskel?
Avatar billede mugs Novice
28. maj 2007 - 19:02 #3
Da jeg ikke har Access installeret i øjeblikket, er dette et rent gæt og ikke afprøvet:

Dim VARa as long
VARa = DoCmd.RunSQL "[T].[Vand]-(SELECT T2.[Vand] FROM Tabel T2 WHERE T2.Dato = DateAdd("d",-1,T.Dato))"

Me.Forskel = VARa

Eller blot:

Me.Forskel = DoCmd.RunSQL "[T].[Vand]-(SELECT T2.[Vand] FROM Tabel T2 WHERE T2.Dato = DateAdd("d",-1,T.Dato))"
Avatar billede ffsoft Praktikant
28. maj 2007 - 19:08 #4
Det kan du ikke. Access virker kun med udtræksforespørglser
i VBA.

Du skal oprette et recordset som afleverer en variabel og den
kan du så trække fra en anden variabel som får sin værdi fra
formularen.

strSQL = "SELECT T2.[Vand] FROM Tabel T2 WHERE T2.Dato = DateAdd("d",-1,T.Dato)"

rst.Open strSQL, conn
intT2Vand = rst("T2")
rst.Close
Set rst = Nothing

intResultat = form.request("T1Vand")-intT2Vand

noget i den stil.
Avatar billede kjulius Novice
28. maj 2007 - 19:13 #5
'Definer en objektvariabel som recordsæt...
dim rs as Recordset

Definer recordset variablen til at indeholde et åbent recordsæt (rækkerne i en forespørgsel)...
set rs = currentdb.openrecordset("SELECT [T].[Vand]-(SELECT T2.[Vand] FROM Tabel T2 WHERE T2.Dato = DateAdd('d',-1,T.Dato)) AS Forskel FROM T WHERE T.Id=33")

'Tildel værdien fra forespørgslen til en VB variabel..
Forskel = rs.Fields("Forskel").Value  'Kan evt. forkortes til rs("Forskel")

'Luk forespørgslen...
rs.close

Værdien der returneres vil være taget fra den første (og måske eneste?) række i recordsættet.
Avatar billede kjulius Novice
28. maj 2007 - 19:20 #6
Hvis du i forvejen har defineret forespørgslen, kan du selvfølgelig bare referere til denne med navn i stedet for at specificere den i .OpenRecordset:

set rs = currentdb.openrecordset("Forespørgsel1")
Avatar billede civil05 Nybegynder
28. maj 2007 - 22:40 #7
Hej ffsoft,

har du mulighed for at skrive dit forslag helt ud så jeg kan afprøve det? jeg er ikke helt skarp til kode...
Avatar billede kjulius Novice
29. maj 2007 - 01:29 #8
Bare for at være helt på det rene. :-) Når du siger VBA, mener du så i virkeligheden VBScript (som i ASP webprogrammering), sådan som ffsoft lægger op til i dennes svar?
Eller er det stadig ren Access VBA, som jeg har antaget?
Avatar billede ffsoft Praktikant
29. maj 2007 - 11:28 #9
Forudsætninger:
Det er en ren Access løsning
Tabellen hedder tblForbrug og indeholder felterne Vandmaaler og
AflaesningsDato
På formularen er der et felt der hedder txtForbrug


Sub txtForbrug_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 AflaesningsDato = DateAdd('d', -1, Date()) ORDER BY tblForbrug.AflaesningsDato DESC;"
Debug.Print strSQL
rst.Open strSQL, conn
    sngForbrug = rst("Vandmaaler")
rst.Close
Set rst = Nothing
conn.Close
Set conn = Nothing

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

End Sub

Det er ikke en fejlsikker løsning, hvis ikke brugerne indtaster
hver dag vil det gå galt.
Den indtastede værdi skal vel gemmes i databasen som denne dags
forbrug.
Avatar billede civil05 Nybegynder
29. maj 2007 - 13:59 #10
Hej ffsoft,

Tak for dit indlæg, jeg prøver det senere det ser lovende ud, men kan det godt passe, at udtrykket ikke trækker to vandmaaler værdier fra hinanden? Det skal trække dagens "vandmaaler værdi" fra den foregående dags "vandmaaler værdi" og returnere den til et felt i tabellen som hedder Forbrug....

mvh
Anders
Avatar billede ffsoft Praktikant
29. maj 2007 - 14:38 #11
Du må først lige svare på det du bliver spurgt om.
kjulius og jeg har begge stillet dig spørgsmål og du
kan ikke forvente hjælp, hvis du ikke selv vil hjælpe til.
Avatar billede civil05 Nybegynder
29. maj 2007 - 16:10 #12
ok, ang. kjulius, så drejer det sig om en ren løsning til Access, jeg vil gerne helt udgå forespørsler og udelukkende køre det via VBA, så der er ingen forespørsler at relatere til....
Avatar billede ffsoft Praktikant
29. maj 2007 - 20:32 #13
Du kan finde databasen her:

http://www.ffsoft.dk/Kunde/anders.zip

Der er tilføjet dette:

strSQL = "INSERT INTO tblForbrug ( Vandmaaler, AflaesningsDato ) Values "
strSQL = strSQL & "(" & Me.txtForbrug & "," & Date & ")"
'Debug.Print strSQL
conn.Execute strSQL
Avatar billede civil05 Nybegynder
29. maj 2007 - 21:01 #14
Hej ffsoft,

tak for det fornemme svar, meget brugbart! jeg har lige kort tjekket databasen ud og det ser ud til at kunne præcist hvad jeg ønsker, jeg får nok først tid til at kigge nærmere på det i weekenden, så kan det godt være der dukker et spørgsmål eller to op, men tak, har du fået dine point?
Avatar billede ffsoft Praktikant
29. maj 2007 - 21:06 #15
Yeps, tak for point.
Avatar billede civil05 Nybegynder
29. maj 2007 - 21:18 #16
selv tak
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