collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 34
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13797
  • stats Beiträge insgesamt: 63470
  • stats Themen insgesamt: 8600
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: Spalte Differenz in Abfrage  (Gelesen 182 mal)

Offline scmko

  • Newbie
  • Beiträge: 3
Spalte Differenz in Abfrage
« am: Oktober 13, 2017, 10:02:44 »
Hallo zusammen,

ich bin leider seit Tagen am Verzweifeln und hoffe Ihr könnt mir helfen. Leider brachte auch die Forensuche keine Abhilfe.

Ich versuche derzeit eine "Energiedatenbank" aufzubauen und scheitere daran in einer Abfrage die Spalte Verbrauch berechnen zu lassen. Im Datensatz befindet sich jeweils u.a. das Ablesedatum, die Zählernummer, der Zählerstand und die Kundennummer. Eine Kundennummer kann auch mehrere unterschiedliche Zählernummern haben.

Natürlich könnte ich jetzt in jeden Datensatz den alten Zählerstand pro Kunden- und Zählernummer händisch eingeben und anhand beider Felder den Verbrauch berechnen, aber den Aufwand wollte ich (bisher) eigentlich vermeiden. Also müsste jeweils die Differenz zwischen dem Zählerstand des letzten Datums, mit dem Stand des vorherigen Datums berechnet werden.
Ich habe schon ganz viele SQL-Anweisungen dazu gelesen, aber dazu reichen meine Kenntnisse/Fähigkeiten nicht aus (SQL ist fast ein Buch mit sieben Siegeln).

Folgenden Ansatz habe ich zuletzt verfolgt:

In einem Modul:
Function fnDifferenz(lngZählernummer As Long, dblAblesewert As Double, _
                      datAbleseDatum As Date) As Double
     Dim strSQL As String
     
     strSQL = "SELECT Zählerstand " & _
                "FROM EDB_Strom " & _
               "WHERE Ablesedatum=(SELECT Max(Ablesedatum) " & _
                                    "FROM EDB_Strom " & _
                                   "WHERE Ablesedatum<" & _
                                  Format(datAbleseDatum, "\#yyyy-mm-dd\# ") & _
                                     "AND Zählernummer=" & lngZählernummer & ") " & _
                 "AND Zählernummer=" & lngZählernummer
    With CurrentDb.OpenRecordset(strSQL)
         If Not .EOF Then
             fnDifferenz = dblAblesewert - !Zählerstand
           Else
             fnDifferenz = dblAblesewert
         End If
     End With
 End Function

Dazu in meiner Abfrage in der Differenz-Spalte:

Verbrauch: Wenn(Nz([Zählerstand];0)<>0;fnDifferenz(Nz([Zählernummer];0);[Zählerstand];[Ablesedatum]);Null)
Das generiert allerdings den Laufzeitfehler 3464 Datentypkonflikt in Kriterienausdruck.
Ich vermute mal, es liegt daran, dass im Code die Variable lngZählernummer als "Zahl" definiert ist, aber in meiner Datenbank ist sie "kurzer Text", da die Nummer auch Buchstaben beinhalten kann. Ich bekomme es aber leider nicht hin, die SQL-Anweisung in Bezug auf die Zählernummer so umzuschreiben.

Vielen Dank schon Mal für jeglichen Ansatz!

Gruß Sandra

P.s.: Ich hoffe ich habe an alle relevanten Angaben gedacht? Es ist mein erster Post in einem Forum.  :-[
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 850
Re: Spalte Differenz in Abfrage
« Antwort #1 am: Oktober 13, 2017, 11:46:12 »
Eine mögliche Umsetzung.
'Umlaute sind nicht das Nonplusultra in Objektnamen
Function StromVerbrauch(lngZählernummer As Long, dblAblesewert As Double, _
                        datAbleseDatum As Date) As Double
   Const TMP_QRY As String = _
         "SELECT TOP 1 Zählerstand FROM EDB_Strom" & vbCrLf & _
         "WHERE  Zählernummer = [@Zählernummer] AND" & vbCrLf & _
         "       Ablesedatum  < [@Ablesedatum]" & vbCrLf & _
         "ORDER BY Ablesedatum DESC;"

   StromVerbrauch = dblAblesewert

   With CurrentDb.CreateQueryDef(vbNullString, TMP_QRY)
      .Parameters("@Zählernummer") = lngZählernummer
      .Parameters("@Ablesedatum") = datAbleseDatum
      With .OpenRecordset(dbOpenSnapshot)
         If Not .EOF Then
            StromVerbrauch = StromVerbrauch - !Zählerstand
         End If
         .Close
      End With
   End With

End Function
PS: die Abfrage freut sich, wenn Zählernummer und das Ablesedatum indiziert sind.

PPS: Fremdschlüsselfelder mit referentieller Integrität sind bereits mit Index ausgestattet.
Grüße von der (⌒▽⌒)
 
Folgende Mitglieder bedankten sich: scmko

Offline scmko

  • Newbie
  • Beiträge: 3
Re: Spalte Differenz in Abfrage
« Antwort #2 am: Oktober 13, 2017, 12:30:49 »
Erstmal herzlichen Dank für Deinen Vorschlag Lachtaube.

Der Laufzeitfehler ist damit weg, aber ich bekomme leider noch immer bei den meisten Datensätzen als Ergebnis einen #Fehler.
Soweit ich es überblicke, ist das der Fall, wenn die Zählernummer alphanumerisch ist; sei`s mit Buchstaben oder z.B. Bindestrichen.

Ist es, so wie ich bereits vermutet hatte, ein Problem, da die Variable lngZählernummer als Long definiert ist und nicht als String?
Wie müsste die Anweisung aussehen, wenn die Variable als String deklariert ist?

Zitat
'Umlaute sind nicht das Nonplusultra in Objektnamen
Danke für den Hinweis. Eigentlich müsste mir das auch bewusst gewesen sein, aber ich schätze ich bin manchmal etwas zu betriebsblind. *schäm*

Gruß Sandra
 

Offline scmko

  • Newbie
  • Beiträge: 3
Re: Spalte Differenz in Abfrage
« Antwort #3 am: Oktober 13, 2017, 12:45:45 »
Hallo nochmal,

Zitat
Ist es, so wie ich bereits vermutet hatte, ein Problem, da die Variable lngZählernummer als Long definiert ist und nicht als String?
Wie müsste die Anweisung aussehen, wenn die Variable als String deklariert ist?

Die Frage hat sich erledigt. Es klappt jetzt, nachdem ich feststellte, dass die Anweisung gar nicht mehr geändert werden musste, wenn ich die Variable lngZählernummer (nun umbenannt in strZählernummer  ;) ) als String deklariere!

Es funktioniert nun alles wie gewünscht!
Ein ganz herzliches Dankeschön an Lachtaube für die Unterstützung!

Gruß Sandra