Avatar billede hugopedersen Nybegynder
09. december 2006 - 12:04 Der er 21 kommentarer og
2 løsninger

Beregne brændstofforbrug

Jeg har en tabel der indeholder felterne: Køretøj, dato, km stand, liter, snit periode, snit total
Der indtaster jeg som det nok kan gættes, nogle data hver gang jeg fylder brændstof på en bil (køretøj er fordi der er flere biler)
Hvordan laver jeg nemmest en funktion der løber tabellen igennem og beregner snit periode og snit total.
Jeg har det lavet i et regneark, men af forskellige årsager er jeg nødt il at kunne lave det i Access også.
Avatar billede mugs Novice
09. december 2006 - 12:08 #1
I Access kan du lave en forespørgsel der i Vis > Totaler kan give dig beregninger.
Avatar billede hugopedersen Nybegynder
09. december 2006 - 12:12 #2
Det er desværre ikke så simpelt.
Så vidt jeg kan se skal jeg have lavet en funktion der løber tabellen igennem og læser 2 records ad gangen ind og laver beregningerne. Der skal jo bruges tal fra 2 records for at beregne antal km mellem aktuelle tankning og sidste tankning for at kunne beregne snit pr. liter
Avatar billede terry Ekspert
09. december 2006 - 13:17 #3
In a query it should be possible to make a sub select which finds the previous records kM and subtracts it from the current records KM then devide that with the ltrs.
Avatar billede terry Ekspert
09. december 2006 - 13:18 #4
Unless it is more complicated than that it shouldnt be necessary to make a function
Avatar billede Slettet bruger
11. december 2006 - 23:32 #5
Hvis du nu kalder din tabel: tblBrændstofForbrug

Så lav en forespørgsel, som du kalder Snit total:

SELECT tblBrændstofForbrug.Køretøj, (Max([Km stand])-Min([km stand]))/(Sum([liter])-First([liter])) AS [Snit total]
FROM tblBrændstofForbrug
GROUP BY tblBrændstofForbrug.Køretøj
ORDER BY tblBrændstofForbrug.Køretøj;

Så en forespørgsel, som du kalder Snit periode:

SELECT tblBrændstofForbrug.Køretøj, (Max([Km stand])-Min([km stand]))/(Sum([liter])-First([liter])) AS [Snit periode]
FROM tblBrændstofForbrug
WHERE (((tblBrændstofForbrug.Dato) Between [Dato fra:] And [Dato til:]))
GROUP BY tblBrændstofForbrug.Køretøj
ORDER BY tblBrændstofForbrug.Køretøj;

og til sidst en forespørgsel, den kunne hedde Snit:

SELECT [Snit Periode].Køretøj, [Snit Periode].[Snit periode], [Snit total].[Snit total]
FROM [Snit Periode] INNER JOIN [Snit total] ON [Snit Periode].Køretøj = [Snit total].Køretøj;

Jeg er sikker på, at det kan skrives i en forespørgsel, men det her skulle virke!~)
Avatar billede Slettet bruger
11. december 2006 - 23:34 #6
Ja, for egentlig vil man normalt ikke sætte disse to beregninger, som felter i en tabel...
Avatar billede kjulius Novice
12. december 2006 - 01:39 #7
Tja, det nemmeste er nok at lave lidt kode, som gennemløber tabellen og opdaterer den, for som du jo selv er inde på, så er SQL i sig selv ikke en ørn til beregninger, som baserer sig på to på hinanden følgende rækker. Så mit forslag ville være en kode som ligner denne:

Public Sub Beregnforbrug()
Dim rs As Recordset
Dim NuvKøretøj As String
Dim TidlKilometerstand as Long
Dim TidlLiterantal as Integer
Dim SumKilometer as Integer
Dim SumLiterAntal as Integer
Dim FørsteMåling As Boolean : FørsteMåling = True
Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblBrændstofForbrug ORDER BY Køretøj, dato")
Do While not rs.EOF
  If FørsteMåling = True Then
    NuvKøretøj = rs.Fields("Køretøj")
    TidlKilometerstand = rs.Fields("Kilometerstand")
    TidlLiterantal = rs.Fields("Liter")
    SumKilometer = 0
    SumLiterantal = 0
    rs.Fields("SnitPeriode") = Null
    rs.Fields("SnitTotal") = Null
    FørsteMåling = False
  Else
    rs.Fields("SnitPeriode") = (rs.Fields("Kilometerstand") - TidlKilometerstand) / TidlLiterAntal
    SumKilometer = SumKilometer + (rs.Fields("Kilometerstand") - TidlKilometerstand)
    SumLiterantal = SumLiterAntal + TidlLiterantal
    rs.Fields("SnitTotal") = SumKilometer / SumLiterantal
  End If
  rs.Update
  rs.MoveNext
  If not rs.EOF And rs.Fields("Køretøj") <> NuvKøretøj Then
    FørsteMåling = True
  End If
Loop
End Sub


Der er ikke tale om aftestet kode, så ingen garanti, men du kan forhåbentlig få en idé om, hvad jeg mener... :-)
Avatar billede kjulius Novice
12. december 2006 - 01:43 #8
Hov, der mangler i hvert fald en rs.Close lige før End Sub
Avatar billede hugopedersen Nybegynder
12. december 2006 - 06:58 #9
Indtil videre siger jeg tak for indlæg - på grund af arbejdssituation går der lige lidt inden jeg får tid til at teste, men jeg vender tilbage hurtigst muligt.
Avatar billede hugopedersen Nybegynder
13. december 2006 - 14:10 #10
kjulius> jeg har brugt dit forslag som oplæg til en funktion der gør det jeg gerne vil have den til (ser det i hvert fald ud til :-) ) så smid lige et svar så du kan få point
Avatar billede hugopedersen Nybegynder
13. december 2006 - 14:16 #11
spg> du har ret i at man 'normalt' ikke gemmer beregninger i en tabel, men nogen gange kan det være hensigtsmæssigt at gøre det, f.eks. af hastighedsmæssige årsager.
Her er der tale om at skulle vise nogle tal i en subform og det går simpelthen for langsomt at bregne hver gang der flyttes en record så jeg vil hellere have lidt ventetid første gang formen åbnes og så undgå brok når der bladres.

Men tak for dit bud som sandsynligvis vil kunne gøre det også, men jeg holder mig i dette tilfælde altså til funktionen.
Avatar billede terry Ekspert
13. december 2006 - 14:22 #12
SELECT tblHugo.Køretøj, tblHugo.dato, tblHugo.km, tblHugo.liter, ([km]-CLng(nz((SELECT max(km) from tblHugo H WHERE H.[køretøj] = [tblHugo].[Køretøj] and h.dato < [tblHugo].[dato]),0)))/[liter] AS AvgPer, ([km]-CLng(nz((SELECT max(km) from tblHugo H WHERE H.[køretøj] = [tblHugo].[Køretøj] and h.dato < [tblHugo].[dato]),0))) AS KmPeriod, ([km]-(SELECT min(km) from tblHugo H WHERE H.[køretøj] = [tblHugo].[Køretøj]))/(SELECT sum(liter) from tblHugo H WHERE H.[køretøj] = [tblHugo].[Køretøj] and h.dato <= [tblHugo].[dato]) AS AvgTot, (SELECT sum(liter) from tblHugo H WHERE H.[køretøj] = [tblHugo].[Køretøj] and h.dato <= [tblHugo].[dato]) AS tLtrs
FROM tblHugo;
Avatar billede terry Ekspert
13. december 2006 - 14:23 #13
TblHugo

ID    Køretøj    dato    km    liter
1    1    01/01/2006    1000    0
2    1    20/01/2006    1500    49
3    2    01/01/2006    2000    0
4    1    22/01/2006    2000    51
5    2    10/01/2006    2650    55
Avatar billede terry Ekspert
13. december 2006 - 14:26 #14
I am assuming that for each vehicle the first entry is where you start (tank full)

you should also add a criteria in liters to remove those

>0
Avatar billede hugopedersen Nybegynder
13. december 2006 - 14:30 #15
Have you got the table and the query in a file then I would love to se it

mail  snabela  hugopedersen  punktum  dk
Avatar billede terry Ekspert
13. december 2006 - 14:32 #16
On the way
Avatar billede hugopedersen Nybegynder
13. december 2006 - 14:35 #17
Will have a look and return later
Avatar billede hugopedersen Nybegynder
13. december 2006 - 15:56 #18
Haven't recieved anything yet (have you recieved something from me?)
Avatar billede terry Ekspert
13. december 2006 - 16:06 #19
Yes I've received your dB and also resemt mine.
Avatar billede hugopedersen Nybegynder
13. december 2006 - 16:08 #20
Just got the notice from Outlook that your mail has arrived
Avatar billede kjulius Novice
15. december 2006 - 01:57 #21
Jeg er godt klar over, at min lille funktion også kan laves i en forespørgsel, men SQL er bare ikke optimeret til at beregne ud fra data i to på hinanden følgende rækker. Men selvfølgelig kan det gøres hvis hver række kan identificeres via en unik værdi, og jeg har da også før givet eksempler på, hvordan det kan gøres . Eksempelvis her:

http://www.eksperten.dk/spm/710456

Men som sagt, hvis det gælder om at opdatere en tabel, er en opdateringsrutine som bruger ADO/DAO efter min mening bedre.
Avatar billede kjulius Novice
15. december 2006 - 02:04 #22
Det spørgsmål jeg referer til er godt nok vedr. MySQL, men det ændrer ikke noget i den grundlæggende funktionalitet i SQL forespørgslen, selv om syntaxen kan være lidt forskellig i de to databaser.
Avatar billede hugopedersen Nybegynder
17. december 2006 - 15:59 #23
Terry fik lidt for sin query som ser ud til at gøre det også, men da jeg brugte funtionsoplæget, så får den størstedelen
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