Berekenen van brandstofkosten en verbruik

Status
Niet open voor verdere reacties.

AJKlijn

Gebruiker
Lid geworden
14 okt 2008
Berichten
35
Goedendag,

Ik heb een bestand gemaakt die ik wil gaan gebruiken voor het berekenen van mijn autokosten. De brandstof maakt daar een grootdeel van uit en die wil ik beter inzichtelijkhebben.
Dit voorbeeld bestand registreert op datum de tellerstand, getankte liters en de prijs. Dit wordt in de rapportage ook goed weergegeven. Echter blijf ik hangen op het berekenen van verbruik en afstand tussen twee tankbeurten. De boosdoener is de laatste tankbeurt, dan wordt dit tellerstand (max tellerstand) gebruikt maar heb je de vorige nodig.

Wie kan hier eens voor mij naar kijken en tips geven hoe dit te doen.

Invoer veldnamen: [Datum] [Liters] [Bedrag] [Tellerstand]
Uitvoer veldnamen: [Datum] [Liters] [Bedrag] [Tellerstand]
Berekend
Totaal Liters =Som[Liters]
Totaal Bedrag =Som[Bedrag]
Hoogste Tellerstand =Max[Tellerstand]
Verbruik =Som[Hoogste Tellerstand]/[Liters]
 
Waar is het bestand?
 
Daar heb je een lopend totaal query voor nodig. Ik heb een voorbeeldje op basis van meterstanden. Kun je hopelijk zelf wel ombouwen naar jouw situatie.
Code:
SELECT
     Datum
    , (SELECT TOP 1 Water FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum  ORDER BY T1.Datum DESC ) AS VorigWater
    , Water
    , IIf([VorigWater] Is Null,0,[water]-[VorigWater]) AS [Verbruik Water]
    , (SELECT TOP 1 Gas FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum ORDER BY T1.Datum DESC ) AS VorigGas
    , Gas
    , IIf([VorigGas] Is Null,0,[Gas]-[VorigGas]) AS [Verbruik Gas]
FROM
     Meterstanden
GROUP BY
     Datum, Water, Gas
ORDER BY
     Datum;
Hierin zie je twee velden die de vorige meterstand ophalen; één voor gas en één voor water. You get the picture :).
 
Daar heb je een lopend totaal query voor nodig. Ik heb een voorbeeldje op basis van meterstanden. Kun je hopelijk zelf wel ombouwen naar jouw situatie.
Code:
SELECT
     Datum
    , (SELECT TOP 1 Water FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum  ORDER BY T1.Datum DESC ) AS VorigWater
    , Water
    , IIf([VorigWater] Is Null,0,[water]-[VorigWater]) AS [Verbruik Water]
    , (SELECT TOP 1 Gas FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum ORDER BY T1.Datum DESC ) AS VorigGas
    , Gas
    , IIf([VorigGas] Is Null,0,[Gas]-[VorigGas]) AS [Verbruik Gas]
FROM
     Meterstanden
GROUP BY
     Datum, Water, Gas
ORDER BY
     Datum;
Hierin zie je twee velden die de vorige meterstand ophalen; één voor gas en één voor water. You get the picture :).

Ga ik uitproberen, dank.
 
Databases kun je niet uploaden i.v.m. de security settings. Je moet de db eerst comprimeren en dan zippen, dan heb je a) een veel kleiner bestand, en b) een bestand dat je wél kunt uploaden. Maar kijk eerst maar eens of je de query kunt aanpassen, of post anders een query met daarin alle velden uit je tabel, dan pas ik de query wel voor je aan. Gelijk databases uploaden is meestal niet nodig, en wordt alleen gevraagd door helpers die geen kennis van Access hebben.
 
Dit is wat ik tot nu toe heb kunnen realiseren.

SELECT Last(Tab_InvoerBrandstof.Datum) AS LaatsteVanDatum, Sum(Tab_InvoerBrandstof.Bedrag) AS SomVanBedrag, Last(Tab_InvoerBrandstof.Tellerstand) AS LaatsteVanTellerstand, Sum(Tab_InvoerBrandstof.Liters) AS SomVanLiters, Tab_InvoerBrandstof.Datum, Tab_InvoerBrandstof.Liters, Tab_InvoerBrandstof.Bedrag, Tab_InvoerBrandstof.tellerstand
FROM Tab_InvoerBrandstof
GROUP BY Tab_InvoerBrandstof.Datum, Tab_InvoerBrandstof.Liters, Tab_InvoerBrandstof.Bedrag, Tab_InvoerBrandstof.tellerstand
ORDER BY Last(Tab_InvoerBrandstof.Datum) DESC;
 
Dan kom ik, op basis van de tabel Tab_Invoerbrandstof, tot zoiets:
Code:
SELECT 
     Datum
    ,(SELECT TOP 1 Tellerstand FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum  ORDER BY T1.Datum DESC ) AS VorigTellerstand
    ,Tellerstand
    , IIf([VorigTellerstand] Is Null,0,[Tellerstand]-[VorigTellerstand]) AS [Verbruik Tellerstand]
    , (SELECT TOP 1 Liters FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigLiters
    , Liters
    , IIf([VorigLiters] Is Null,0,[Liters]-[VorigLiters]) AS [Verbruik Liters]
    , (SELECT TOP 1 Bedrag FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigBedrag
    , Bedrag
    , IIf([VorigBedrag] Is Null,0,[Bedrag]-[VorigBedrag]) AS [Kosten]
GROUP BY
     Datum, Tellerstand, Liters
ORDER BY
     Datum;
 
Dank je, ben er mee aan de slag gegaan maar loop toch tegen probleem aan.

SELECT
Datum
(SELECT TOP 1 Tellerstand FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigTellerstand
Tellerstand
IIf([VorigTellerstand] Is Null,0,[Tellerstand]-[VorigTellerstand]) AS [VerbruikTellerstand]
(SELECT TOP 1 Liters FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigLiters
Liters
IIf([VorigLiters] Is Null,0,[Liters]-[VorigLiters]) AS [VerbruikLiters]
(SELECT TOP 1 Bedrag FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigBedrag
Bedrag
IIf([VorigBedrag] Is Null,0,[Bedrag]-[VorigBedrag]) AS [Kosten]
GROUP BY
Datum, Tellerstand, Liters
ORDER BY
Datum;



Bij uitvoeren van deze Query wordt het woord Tellerstand geselecteerd en krijg ik onderstaande foutmelding.
De instructie SELECT bevat een gereserveerd woord of een argumentnaam die verkeerd is gespeld, ontbreekt, of een verkeerd leesteken heeft.
 
Vermoedelijk ontbreekt er een Group by veld. Zonder db blijft het uiteraard in de glazen bol kijken; ik verwacht dat je zélf ook wat kan oplossen als wij dat niet kunnen doen voor je :).
Code:
SELECT 
     Datum
    ,(SELECT TOP 1 Tellerstand FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum  ORDER BY T1.Datum DESC ) AS VorigTellerstand
    ,Tellerstand
    , IIf([VorigTellerstand] Is Null,0,[Tellerstand]-[VorigTellerstand]) AS [Verbruik Tellerstand]
    , (SELECT TOP 1 Liters FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigLiters
    , Liters
    , IIf([VorigLiters] Is Null,0,[Liters]-[VorigLiters]) AS [Verbruik Liters]
    , (SELECT TOP 1 Bedrag FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigBedrag
    , Bedrag
    , IIf([VorigBedrag] Is Null,0,[Bedrag]-[VorigBedrag]) AS [Kosten]
GROUP BY
     Datum, Tellerstand, Liters, Bedrag
ORDER BY
     Datum;
 
Hoi, dit gaat een stuk beter, krijg geen foutmeldingen. Moet het nu alleen nog op de juiste manier verwerken in de db.
Mocht ik nog ergens tegen aanlopen dan meld ik me weer.


Hartelijk dank
Dolf
 
Op basis van deze query kun je prima een rapport maken, lijkt mij. Als je maar één record wilt zien, kun je met Top 1 het eerste record in de (aflopende, dat moet je dan nog aanpassen (Order By Datum DESC)) query filteren. Of je filtert op het rapport. Dat zou ik doen.
 
Sorry voor de late reactie, er kwamen dringende zaken tussen, helaas.

Ik ben nog niet veel verder gekomen, maar heb nu mijn bestand bijgesloten.
 

Bijlagen

  • Brandstof.zip
    33,8 KB · Weergaven: 11
Een punt is sowieso dat je niet begint met een tellerstand van 0. Nu lijkt het alsof je de eerste 1201 kilometer op 20 liter hebt gereden.

De rest van wat hier stond is onzin.
 
Laatst bewerkt:
Mijn vorige bericht sloeg nergens op. In ieder geval waar het het sommeren van tellerstanden betreft.

Hierbij een hernieuwde poging waarbij onder andere de vorige tellerstand getoond wordt en het aantal gereden km's sinds de vorige tankbeurt berekend wordt. Hopelijk kan je hier (wel) iets mee.
 

Bijlagen

  • Brandstof v3.zip
    27,9 KB · Weergaven: 12
Ik ben nog niet veel verder gekomen, maar heb nu mijn bestand bijgesloten.
Volgens mij wás je er al, want je had de query helemaal perfect. (Query1 in jouw db). Enige foutje wat je hebt gemaakt: je hebt de velden uit die query ook in de tabel gezet, en dat is nergens voor nodig. De grap is juist dat je in de tabel alleen de nieuwe verbruiksgegevens opslaat, en dat je dan in de query de juiste verbruiksgegevens ziet. Dus in de tabel heb je alleen dit nodig:

Brandstof.jpg

En de query doet de rest:

Code:
SELECT Tab_InvoerBrandstof.Datum, (SELECT TOP 1 Tellerstand FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum  ORDER BY T1.Datum DESC ) AS VorigTellerstand,
Tab_InvoerBrandstof.Tellerstand, IIf([VorigTellerstand] Is Null,0,[Tellerstand]-[VorigTellerstand]) AS VerbruikTellerstand,
(SELECT TOP 1 Liters FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigLiters,
Tab_InvoerBrandstof.Liters, IIf([VorigLiters] Is Null,0,[Liters]-[VorigLiters]) AS VerbruikLiters,
(SELECT TOP 1 Bedrag FROM Tab_InvoerBrandstof AS T1 WHERE T1.Datum < Tab_InvoerBrandstof.Datum ORDER BY T1.Datum DESC ) AS VorigBedrag,
Tab_InvoerBrandstof.Bedrag, IIf([VorigBedrag] Is Null,0,[Bedrag]-[VorigBedrag]) AS Kosten
FROM Tab_InvoerBrandstof;

Die query heb je dus zélf al gemaakt.... Kortom: wat is je probleem nog? (ik ga met opzet voorbij aan de oplossing van xp, want die heeft m.i. overbodig werk gedaan :))

Query brandstof.jpg
 
Bedankt

Bedankt voor de reactie, hier ga ik wel verder meekomen. Het kwam in mijn orginele database niet zo naar voren. Dus daar moet iets niet goed zitten.
Ga ik uitzoeken en verwerken.

Dolf
 
Het kwam in mijn orginele database niet zo naar voren. Dus daar moet iets niet goed zitten.
Dan wellicht een overbodige tip: maak, als je gaat ontwikkelen, een kopie van je produktie database en anonimiseer daar eventueel de persoonsgegevens. Gebruik die kopie om te testen. Je opmerking laat in het midden of het verschil in de data zit, of in de structuur. Het eerste is een kwestie van de gegevens nalopen, het tweede een kwestie van de velden in de tabellen controleren.
 
Aangepast orgineel

Hallo,

Ik heb nog steeds geen goede output van de gegevens.
Heb persoonlijke gegevens uit de database verwijderd.
Gezipt bestand bijgevoegd.

Bij uitvoer van de code zoals opgegeven, krijg ik als output bij alle velden ?Naam fout.

Dolf
 

Bijlagen

  • Verbruikskosten.zip
    25,3 KB · Weergaven: 13
Ten opzichte van een eerder voorbeeld is er een stiekem extra factor bij gekomen. Er staan nu niet alleen brandstofkosten in de tabel. Voor het berekenen van de verbruikscijfers, moeten we die ander posten dus uitsluiten.

Ik kwam tot deze query:
SELECT
T_Kosten.Datum,
T_Kosten.Tellerstand,
T_Kosten.Bedrag,
T_Kosten.Liters,
DMax("Tellerstand","T_Kosten","Tellerstand<" & [Tellerstand] & " AND Post= 'Brandstof'") AS Vorige_Tellerstand,
[Tellerstand]-[Vorige_Tellerstand] AS Gereden,
Round([Gereden]/[Liters],2) AS Verbruik
FROM T_Kosten
WHERE (((T_Kosten.Post)="Brandstof"));

Volgens mij werkt dit alleen goed als je je tank steeds vol gooit.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan