Avatar billede larsgrau Forsker
22. juli 2011 - 20:48 Der er 4 kommentarer og
1 løsning

Udregne noget i en database

Hej

Jeg kunne godt tænke mig at lave en database over mit el/vand/varm, men jeg kan ikke lige finde ud af hvordan man trækker to tal fra hinanen.

Jeg har en tabel som indholder følgende:

ID/DATO/EL/VAND/VARM/EL SIDEN SIDST/VAND SIDEN SIDST/VARM SIDEN SIDST

Så vil jeg jo gerne have den trækker det tal jeg taster ind i el, at den regner ud hvad jeg har brugt siden sidst og sætte det ind i EL SIDEN SIDST o.s.v. Jeg tror jeg skal bruge en forspørgelse, men jeg er ikke helt sikker, eller skal jeg over i VBA og skrive det der ??

Venlig Hilsen
Lars
Avatar billede mugs Novice
22. juli 2011 - 21:19 #1
Jeg har 2 felter i min form. Aflæsning er den værdi du aflæser, differencen fra sidste aflæsning gemmes i feltet forbrug. Kræver en reference til DAO:

Private Sub aflæsning_Exit(Cancel As Integer)
Dim rs As DAO.Recordset
Dim VARa As Double
Set rs = Me.RecordsetClone
rs.MoveLast
VARa = "" & rs!aflæsning & ""
forbrug = Me.aflæsning - VARa
rs.Close
End Sub
Avatar billede Slettet bruger
22. juli 2011 - 21:55 #2
Man gemmmer ikke beregnede værdier i tabel - man beregner dem efter behov i en forespørsel - derfor blot denne tabel, 'EnergiFrb', til illustration

id    dato        el      vand    varme
1    01-02-2011    2000    100    500
2    01-03-2011    2200    150    700
3    01-04-2011    2350    200    850
4    01-05-2011    2400    300    925

Vi skal ud i en selvjoin - prøv nu:

select * from EnergiFrb as b,EnergiFrb as e

Der fremkommer 16 poster - mængdeproduktet af b kryds e. 'b' for begyndelse af perioden og 'e' for enden af perioden.
Prøv nu i dataark visning at sortere efter b.dato og se hvor let det er at spotte de 3 linier der har data til periode forbrug.


Kendetegnede for ovenstående data, er at id angiver en datofølge - denne redundans gør forespørgslen meget nem:

SELECT e.dato,e.el,e.vand,e.varme,e.el-b.el as elFrb,e.vand-b.vand as vandFrb,e.varme-b.varme as varmeFrb
FROM EnergiFrb AS b, EnergiFrb AS e
WHERE e.id=b.id+1;

Hvis nu det ikke havde været tilfældet, som hvis der blev tilføjet poster med ældre dato kan 'WHERE delen' ændres til:
WHERE e.dato = (select min(dato) from EnergiFrb where dato > b.dato)
Avatar billede Slettet bruger
22. juli 2011 - 22:46 #3
Hvis man vil have første aflæsning med:

SELECT e.dato,e.el,e.vand,e.varme,e.el-b.el as elFrb,e.vand-b.vand as vandFrb,e.varme-b.varme as varmeFrb
FROM EnergiFrb AS b right join EnergiFrb AS e on  e.id = b.id+1


og hvis der ikke er id datofølge redundans:

SELECT e.dato, e.el, e.vand, e.varme, e.el-b.el AS elFrb, e.vand-b.vand AS vandFrb, e.varme-b.varme AS varmeFrb
FROM EnergiFrb AS b RIGHT JOIN EnergiFrb AS e ON e.dato > b.dato
where (e.dato = (select min(dato) from EnergiFrb where dato > b.dato)) or isnull(b.dato)
Avatar billede terry Ekspert
23. juli 2011 - 11:06 #4
larsgrau
Isnt this the same question which you still need to comment?
http://www.eksperten.dk/spm/942230
Avatar billede mugs Novice
25. juli 2011 - 23:02 #5
Dette spørgsmål er nok heller ikke så vigtigt!!!
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