Hallo liebe Forenmitglieder,
ich habe folgendes Problem und möchte mich vorweg schonmal für jegliche Hilfe bedanken!
Ich habe einen Stromzähler für eine Solaranlage und benötige eine Auswertung für den erzeugten Strom.
Der Zählerstand wird monatlich in eine Tabelle per Formular geschrieben. Jetzt benötige ich die Differenz zum Zählerstands des jeweiligen Vormonats. Wie realisiere ich das in Access?
Ich hoffe, dass ich mich verständlich ausgedrückt habe :-) Dankeschön
http://www.donkarl.com?FAQ3.11 (http://www.donkarl.com?FAQ3.11)
sollte helfen
Guten Morgen und vielen Dank für die schnelle Hilfe!
Ich werde daraus leider nicht schlau - sorry!
Also, ich habe in einer Tabelle "Stromverbrauch" mit den Feldern:
- s_erzeugung (hier werden die monatlichen Zählerstände erfasst, die die Solaranlage erzeugt)
- s_einspeisung (hier werden die Zählerstände erfasst, die an den Stromversorger abgegeben werden)
- s_stromversorger (hier werden die Zählerstände des Stromversorgers angezeigt, da man Strom zukaufen muss, wenn die Solaranlage nicht produtziert)
Die Daten sind immer fortlaufend und werden nicht jeden Monat auf 0 gesetzt.
Und jetzt muss für das Feld für jeden einzelnen Zähler die Differenz gezogen werden zum jeweiligen Vormonat.
Es wäre lieb, wenn ihr mir als Access-Neuling weiterhelfen könntet.
Vielen, vielen Dank!
Hallo,
die FAQ 3.11 beschreibt das genau. Was verstehst Du daran nicht ?
Wie wird der Maonat erfasst, als Datum (wie es sein sollte) oder als Monat und Jahr (jeweils Zahlen) ?
Hi, danke für die Antwort, ich gucke mir das nochmal ganz in Ruhe an, aber ich verstehe das ehrlich gesagt so, als ob eine fortlaufende Nummer, wie bei der ID erzeugt wird (aber ich lese nochmal nach, wahrscheinlich ist irgendwo ein Denkfehler!)
Der Monat bzw. Tag wird jeweils im Datumsfeld mit dem 01.01. (Januar), 01.02. (Februar), etc, erfasst.
Danke nochmal.
Hallo,
hast Du den Link in der FAQ ganz unten nicht gesehen ?
Hier ist er noch mal:
https://support.microsoft.com/de-de/help/290136/how-to-create-a-running-totals-query-in-microsoft-access (https://support.microsoft.com/de-de/help/290136/how-to-create-a-running-totals-query-in-microsoft-access)
Hier ist ein DBFiddle (https://dbfiddle.uk/?rdbms=postgres_10&fiddle=5cd62507d88e67854a1257a128135dc6) mit Kommentaren, wo Unterschiede zu Access berücksichtigt werden müssen.
Zitat von: MzKlMu am Mai 22, 2018, 10:56:48
Hallo,
hast Du den Link in der FAQ ganz unten nicht gesehen ?
Hi MzKlMu,
dankeschön, aber die habe ich bereits offen und bringt mich leider auch ncht weiter :-[
Da steht immer, es sei ein Syntaxfehler vorhanden. Zudem ist in der Entwurfsansicht der Afrage gar kein Feld "Summe", obwohl das Summenfeld aktiviert ist. Aber ich komme gar nicht aus dem "Feld", da dort der Fehler auftaucht.
Danke euch beiden, den Link von Lachtaube schaue ich mir gleich mal an!
Dankeschön!
danke nochmal für den Link, aber im SQL-Code sieht es doch auch so aus, als seien die Daten fix angegeben und im zweiten Codefeld steht, dass dieses nicht für Abfagen zu verwenden ist und im dritten ist mir nicht klar, wo dieser Code reingehört.
Ich bin einfach überfordert und muss mich entschuldigen und bitte zu verstehen, dass der ein oder andere auch mal klein angefangen hat :-)
Danke und Gruß
Fabian
Zuerst wird eine View (Auswahlbbfrage) mit drei fiktiven Datensätzen angelegt und angezeigt, die Dich nicht interessieren muss. Sie sollte jedoch drei Zählerstände ausgeben.
Der mittlere Bereich ist derjenige, der für Dich von Interesse sein sollte. Weil PostgreSQL eine andere Syntax für Spitzenwerte verwendet, habe ich jeweils einen Kommentar in der ersten Unterabfrage hinzugefügt, was statt dessen in Access einzusetzen ist. Bei den folgenden zwei Unterabfragen ist analog zu verfahren. Kommentare, das ist der Text beginnend mit -- muss in der SQL-Ansicht einer Access-Abfrage natürlich weggelassen werden und statt daten, wirst Du auch den richtigen Tabellennamen einsetzen müssen. Ggf. muss der Zeitraum des Ablesens noch angepasst werden (Datumsfeld?). Jede Unterabfrage fragt dieselbe Tabelle noch einmal ab und nimmt hier beispielhaft das Jahr multipliziert mit 100 plus der Monatszahl als Kriterium für die äußere Hauptabfrage und jeweils die innere Unterabfrage. Top 1, bzw. Limit 1 im Beispiel reduziert die Anzahl der Datensätze auf genau einen. Eine absteigende Sortierung sorgt dafür, dass nur der jüngste Datensatz berücksichtigt wird. Und das Kriterium bewirkt, dass die zu betrachtenden Datensätze älter als der aktuelle Datensatz sein muss. Die Werte spiegeln immer die Differenz des aktuellen zum vorherigen Datensatz wider. Für den ersten Datensatz ließe sich noch die Null durch 0 ersetzen, falls das wünschenswert ist.
Der letzte (rein informative) Abschnitt zeigt, wie man in einer Datenbank mit modernem SQL-Dialekt (Stand 2008!) das gleiche Ergebnis hervorbringen kann.
Wenn Dir die Umsetzung nicht gelingt, poste bitte in einem Code-Abschnitt (Text markieren und dann den Knopf mit der Raute # in der Antwort drücken) hier eine handvoll Datensätze (einfach aus der Tabelle kopieren) und nenne uns den Tabellennamen.
Hallo Lachtaube,
ich habe versucht, Deinen Code in meiner Abfrage umzusetzen, aber da kommt ein Fehler. Meine Tabelle zur Abfrage ist so aufgebaut:
ID Datum Zaehlerstand
3 01.05.2018 8378,00
4 01.06.2018 8492,00
5 01.07.2018 8607,00
6 01.08.2018 8738,00
7 01.09.2018 8849,00
8 01.10.2018 8979,00
9 01.11.2018 9132,00
10 01.12.2018 9268,00
11 01.01.2019 9430,00
12 01.02.2019 9594,00
13 01.03.2019 9730,00
14 01.04.2019 9877,00
1 01.05.2019 9997,00
2 01.07.2019 10301,00
Der Tabellenname ist TabVerbrStrom
Ich habe es so verändert:
SELECT TabVerbrStrom.Datum, TabVerbrStrom.Zaehlerstand,
Zaehlerstand - ( select Zaehlerstand
from TabVerbrStrom as d1
where d1.Datum * 100 < d0.Datum * 100
order by Datum * 100 desc
limit 1
) as Zaehlerstand_diff,
from TabVerbrStrom as d0
order by 1, 2;
Irgendwo habe ich einen Denkfehler.
Gruß Henry
Hallo,
vermutlich:
ZitatSELECT TabVerbrStrom.Datum, TabVerbrStrom.Zaehlerstand,
Zaehlerstand - ( SELECT Top 1 Zaehlerstand
FROM TabVerbrStrom AS d1
WHERE d1.Datum < d0.Datum
ORDER BY Datum DESC
) AS Zaehlerstand_diff,
FROM TabVerbrStrom AS d0
ORDER BY 1, 2;
Hallo,
danke für die Hilfe, aber es klemmt noch ein wenig, siehe Anhang.
MfG Henry
Hallo,
füg noch die Alias-Qualifizierer hinzu:
ZitatSELECT d0.Datum, d0.Zaehlerstand,
d0.Zaehlerstand - ( SELECT Top 1 d1.Zaehlerstand
FROM TabVerbrStrom AS d1
WHERE d1.Datum < d0.Datum
ORDER BY d1.Datum DESC
) AS Zaehlerstand_diff,
FROM TabVerbrStrom AS d0
ORDER BY 1, 2;
Hallo,
Danke erst einmal. Ergebniss: gleiche Fehlermeldung.
Gruß Henry
Hallo,
jaa, man sollte richtig lesen:
das Komma (rot) bei
) AS Zaehlerstand_diff,
FROM TabVerbrStrom AS d0
ist zu entfernen
Hallo,
super :), jetzt funktioniert es und ich kann die anderen Abfragen auch so anpassen. Vielen Dank.
MfG Henry
Sorry,
ich habe mich zu früh gefreut. Für die Tabelle TabVerbrKalt konnte ich auch eine funktionierende Abfrage erstellen. Beim Versuch, das auch für die Tabelle TabVerbrWarm zu machen, kommt die Fehlermeldung: Höchstens ein Datensatz kann von dieser Unterabfrage zurückgegeben werden.
Beide Tabellen habe identische Struktur.
Für meinen beschränkten Horizont nicht nachvollziehbar.
MfG Henry
Hallo,
dann zeigt mal den SQL-String der Abfrage, die nicht geht...
In der Annahme, dass der Zählerstand analog mit dem Datum wächst, könnte dies funktionieren:
SELECT Max(d1.Zaehlerstand )
FROM TabVerbrStrom AS d1
WHERE d1.Datum < d0.Datum
Hallo,
für Tabelle "TabVerbrWarm" ist folgender Code:SELECT d0.Datum, d0.Zaehlerstand, d0.Zaehlerstand-(SELECT Top 1 d1.Zaehlerstand FROM TabVerbrWarm AS d1 WHERE d1.Datum < d0.Datum ORDER BY d1.Datum DESC ) AS Verbrauch
FROM TabVerbrWarm AS d0
ORDER BY 1, 2;
.
Für Tabelle "TabVerbrKalt" ist dieser Code funktionierend: SELECT d0.Datum, d0.Zaehlerstand, d0.Zaehlerstand-(SELECT Top 1 d1.Zaehlerstand FROM TabVerbrKalt AS d1 WHERE d1.Datum < d0.Datum ORDER BY d1.Datum DESC ) AS Verbrauch
FROM TabVerbrKalt AS d0
ORDER BY 1, 2;
.
Ich bin ratlos.
MfG Henry
Hallo,
es gibt also 3 Tabellen, die gleichartig aufgebaut sind?
Sind sie das wirklich? (--> prüfen!, auch Datentypen)
Das allerdings verstößt gegen Normalisierungregeln (was hier jedoch nicht das ursprüngliche Thema ist).
Was genau funktioniert denn nicht? Gibt es irgendwelche Fehlerhinweise? Oder stimmen nur die berechneten Wert nicht?
Bitte mal ein paar (authetische) Datenbeispiele.
Hallo,
vielen Dank für die Bemühungen. Ich glaube, ich werde mich erst einmal hinsetzen und mir die Regeln der Normalisierung und die Grundlagen eines sauberen Datanbankaufbaus zu Gemüte führen. Danach werde ich dann nochmals versuchen, eine Datenbank für mich zu Hause aufzubauen ( Verbräuche für Strom, Wasser und Heizung ), welche dann etwas komfortabler zu händeln ist als meine bisherigen Excel-Tabellen.
Ich bitte um Entschuldigung, dass ich Deine Zeit in Anspruch genommen habe, aber da ich nun selbst genug Zeit habe, das Leben zu genießen, kann ich mir auch noch etwas Wissen aneignen.
Dennoch kann es sicher sein, dass ich mich hier im Forum zurückmelden werde.
MfG Henry
Also wenn man mal von dem Fehler in der Normalisierung absieht, würde ich eine Abfrage machen, die immer bei Datum "x.y" Den Wert für "x.y-1" holt und daraus die Differenz berechnet... Aber natürlich drauf achten, dass wenn Y = 1 Wert 0 geholt wird. Oder habe ich das 01.01 falsch verstand und da steht doch noch eine Jahreszahl dahinter, dann wäre natürlich für Datum "x.y.z" Wenn Y= 1 dann "x.1.z-1" sonst "x.y-1.z"
Dann bindest du diese Abfrage in deine mit ein und hast eine Spalte für die Differenzen.