Access Query omzetten naar Dsum

Status
Niet open voor verdere reacties.

Vridtzs

Gebruiker
Lid geworden
6 jun 2017
Berichten
6
Beste mensen,

Ik loop al een poosje te steggelen. Ik heb een Query:


SELECT tblActivities.[Activity Date], Sum(tblActivities.[Completed TSS]) AS [SumOfCompleted TSS]
FROM tblActivities
GROUP BY tblActivities.[Activity Date];


Deze geeft de juiste resultaten, namelijk een totaal per dag gegroepeerd per dag. Deze gegevens wil ik updaten naar een andere tabel. Echter kan ik met deze gegevens geen Update Query maken omdat deze Query een Sum functie heeft.

Ik zat zelf te denken aan een update query en in het "Update to" vak een Dsum() met criteria. Dat zou moeten werken, alleen als ik de Dsum laat rekenen krijg ik niet de resulaten die ik wil. Op sommige "Activity Dates" voert hij geen sum uit.


DSum("[Completed TSS]";"tblActivities";"[Activity Date]=#" & [Activity Date] & "#")



Heeft iemand een idee wat ik fout doe, of een compleet andere oplossing voor mijn probleem. Alvast bedankt voor de moeite.
 
Ik zou niet weten waarom je een extra tabel nodig hebt, als je de data al kunt genereren m.b.v. een query. Je bent nu gegevens dubbel aan het opslaan vermoed ik. Het mooie van een db is nu juist dat je de gegevens dynamisch kunt berekenen. Dus op het moment dat je een snapshot (wat een query natuurlijk is) opslaat in een andere tabel, is bij de eerstvolgende mutatie die tabel al niet meer actueel; koppel je de query aan die tabel (eventueel in een andere query) dan zijn je gegevens wél actueel. Waarom je dat niet zou willen, is me dus eerlijk gezegd een raadsel.
Op basis van een totalen query kun je geen bijwerkquery maken, maar als je met die totalenquery eerst een (tijdelijke) tabel maakt, gaat het wel. Lijkt mij sneller en betrouwbaarder dan een DSUM, wat sowieso niet de beste oplossing is.
En waarom staat deze vraag niet in het Access forum? :)
 
Bedankt voor de snelle reactie. Ik heb nog nooit eerder gepost op fora. Ik ga opletten waar ik het plaats ;).

Ik zat teveel te denken in tabellen, ik ben nieuw met access. Ik heb het bovenstaande probleem opgelost met een query en dat werkt prima.

Nu wil ik in een record een berekening maken gebaseerd op de uitkomst van de vorige record. Een soort rollende berekening. Ik probeer dit te bereiken door een dLookup te gebruiken.

Dlookup("field1";"query name";"[Date] = #"& DateAdd("d";-1;[Date]) & "#")

De juiste antwoorden staan in mijn query alleen op verkeerde plaatsen, naar wat mij lijkt random.

Wat doe ik fout? Is dit wel mogelijk zo?
 
Ja, het is mogelijk. En het antwoord staat in het Access forum. Je hebt het dan over een <Lopend totaal> query. Ziet er ongeveer zo uit:
Code:
SELECT Period, Jaar, Maand, Verkoop, (SELECT [Verkoop] FROM [Blad1] AS [t1] WHERE [t1].[Jaar] < [Blad1].[Jaar] AND [t1].[Maand] = [Blad1].[Maand]) AS VorigeVerkoop,
1-([Verkoop]/[VorigeVerkoop]) AS [Maand % VJ] FROM Blad1;
Of een ander voorbeeldje op basis van meterstanden:
Code:
SELECT Meterstanden.Datum, Meterstanden.Water, (SELECT TOP 1 Water FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum ORDER BY T1.Datum DESC ) AS VorigWater, 
IIf([VorigWater] Is Null,0,[water]-[VorigWater]) AS [Verbruik Water], Meterstanden.Gas, 
(SELECT TOP 1 Gas FROM Meterstanden AS T1 WHERE T1.Datum < Meterstanden.Datum ORDER BY T1.Datum DESC ) AS VorigGas, 
IIf([VorigGas] Is Null,0,[Gas]-[VorigGas]) AS [Verbruik Gas] FROM Meterstanden
GROUP BY Meterstanden.Datum, Meterstanden.Water, Meterstanden.Gas
ORDER BY Meterstanden.Datum;
 
Dit is eigenlijk al te ingewikkeld voor mijn niveau kennis. Heeft u een link naar het forum bericht waar dit vandaan komt? Als ik zie hoe ze dit opbouwen kan ik het nadoen. Alvast bedankt.
 
Als ik zie hoe ze dit opbouwen kan ik het nadoen.
Ik citeer hier uit eigen werk, vrees ik :). Ik zal het voorbeeldje erbij doen; je moet dan eerst maar eens kijken naar de query qMeterstanden.
 

Bijlagen

  • Meterstanden.zip
    42,8 KB · Weergaven: 63
Ik ga dat bestand eens bekijken. Ik heb ondertussen het volgende gemaakt, ik krijg echter geen waardes.

SELECT tblCTLATL.Date, qryTotTss.[SumOfCompleted TSS], Round(Nz([CTLy]+([SumOfCompleted TSS]-[CTLy])/42),2) AS CTL, Round(Nz([ATLy]+([SumOfCompleted TSS]-[ATLy])/42),2) AS ATL, Round(Nz([CTL]-[ATL]),2) AS TSB,

(Select [CTL] FROM [qryCTLATL] as [T1] WHERE [T1].[Date] < [Date]) AS CTLy

FROM tblCTLATL LEFT JOIN qryTotTss ON tblCTLATL.Date = qryTotTss.[Activity Date]
ORDER BY tblCTLATL.Date;


Als ik dit nu zo bekijk heb ik een begin value nodig. Hij berekent namelijk CTL met de vorige CTLy, dus hij zit in een loop die 0 is.
 
Laatst bewerkt:
Lijkt mij wel handig als je een voorbeeldje post; dan kan ik eens kijken waar het aan schort.
 
De formule die ik nodig heb is een formule die elke dag berekend wordt.

CTL = CTLy + (TSS-CTLy)/42

CTLy = de CTL waarde van gisteren/yesterday

TSS voor de dag haal ik uit een andere tabel.


dus de kolommen in de query die ik heb zijn:

Date TSS CTL:(CTLy + (TSS-CTLy)/42) CTLy


Zoals ik de SQL hierboven heb, komt hij met niets.

SELECT tblCTLATL.Date, qryTotTss.[SumOfCompleted TSS], Round(Nz([CTLy]+([SumOfCompleted TSS]-[CTLy])/42),2) AS CTL, Round(Nz([ATLy]+([SumOfCompleted TSS]-[ATLy])/42),2) AS ATL, Round(Nz([CTL]-[ATL]),2) AS TSB, (Select [CTL] FROM [qryCTLATL] as [T1] WHERE [T1].[Date] < [Date]) AS CTLy
FROM tblCTLATL LEFT JOIN qryTotTss ON tblCTLATL.Date = qryTotTss.[Activity Date]
ORDER BY tblCTLATL.Date;

Als ik een de IIF statement gebruik, geeft hij een probleem met circular reference. Kun je hier wat mee?
 
Wat jij wilt gaat in Access nooit werken, puur omdat je in Access gegevens opslaat, en geen formules. Als je in jouw voorbeeldje in B2 een andere waarde typt, veranderen de resultaten in alle onderliggende rijen. Dat kan niet in een database, en is zelfs onwenselijk. Wil je dit soort waarden opslaan (en we hebben het dus over de resultaten, niet de formules) dan zul je daar een functie voor moeten gebruiken die de berekening maakt op basis van het laatste record en bij het aanmaken van een nieuw record dan het veld vult met die waarde. Op basis van de tabel, die ik in Access heb geïmporteerd, kun je overigens met een query dus wél de vorige waarden ophalen. Die query ziet er dan zo uit:
Code:
SELECT Sheet1.Date, Sheet1.CTL, Sheet1.TSS, (SELECT TOP 1 CTL FROM sHEET1 AS T1 WHERE T1.Date < Sheet1.Date ORDER BY T1.Date DESC ) AS Last_CTL, 
(SELECT TOP 1 TSS FROM sHEET1 AS T1 WHERE T1.Date < Sheet1.Date ORDER BY T1.Date DESC ) AS Last_TSS FROM Sheet1;
Maar dat is dus niet helemaal wat je bedoelt. De in de tabel opgeslagen waarden kun je overigens met een andere functie wel weer aanpassen met een Bijwerkquery die dan dus nieuwe waarden opslaat. Je zult denk ik iets anders moeten gaan denken als je met databases aan de slag wilt, want Excel is in sommige opzichten niet te vergelijken met een normale database.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan