vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Erichbru
Datum: 29.12.22 11:18

Hallo zusammen,

möchte fragen wie ich ein geeignetes Datenmodell für das obige Projekt erstellen könnte
möchte meine Zählerstände wie Strom, Wasser und Gas in eine Datenbank speichern (erfassen) und auswerten Woche, Monat etc.

habe einen [Stromzähler]
drei [Wasserzähler]
einen [Gaszähler]

wer kann da etwas unterstützen in den Tabellenerstellungen, Berechnungen, Formular Eingaben etc.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Manfred X
Datum: 29.12.22 13:36

Hallo!

Was ist das für eine Frage?
Es gibt hier hunderte Beispiele für die Verwendung einer Datatable
(Erstellung von Spalten, Füllen von Datenzeilen, Berechnungen in den Zeilen).
Auch für Datenbank-Zugriffe und Updates gibt es Beispiele.
Das Framework bietet entsprechende Methoden.
Zunächst musst Du entscheiden, welche Datenbank Du nutzen willst.
Kleinere Datenmengen können direkt und einfach in einer XML-Datei gespeichert werden.

Spalten (Datentyp):
Ablesedatum (Date, muss gefüllt sein)
Strom-Stand (kwh) (Integer)
Wasser1 (m³) (Integer oder Double)
Wasser2
Wasser3
Gas (m³) (Integer oder Double)

Eventuell eine zweite Tabelle, die die aktuellen Strom-, Wasser- und Gaspreise in der
entsprechenden Maßangabe (kwh, m³) enthält.

Die Eingabe der Daten geschieht relativ einfach durch ein gebundenes Datagridview.
Alternativ kann man auch ein Eingabeformular erstellen (einige Hinweis-Labels und
Textboxen mit Datenbindung an die entsprechenden Spalten).

Noch einfacher wäre die Erstellung einer entsprechenden Excel-Tabelle mit programmierten Formeln.

Beitrag wurde zuletzt am 29.12.22 um 13:45:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Einfaches Beispiel 
Autor: Manfred X
Datum: 29.12.22 15:11

Public Class frmVerbrauchserfassung
 
    Dim WithEvents btnCreate As New Button With
    {.Parent = Me, .Text = "Create Table", .Width = 100, .Left = 10, .Top = 10}
    Dim WithEvents btnLoad As New Button With
    {.Parent = Me, .Text = "Load Table", .Width = 100, .Left = 110, .Top = 10}
    Dim WithEvents btnSave As New Button With
    {.Parent = Me, .Text = "Save Table", .Width = 100, .Left = 210, .Top = 10}
 
    Dim WithEvents btnSumme As New Button With
        {.Parent = Me, .Text = "Verbrauch", .Width = 100, .Left = 320, .Top = _
          10}
 
    Dim dt As DataTable
    Dim bs As New BindingSource
    Dim WithEvents dgv As New DataGridView With {.Parent = Me, .Top = 50, .Left _
      = 10, .DataSource = bs,
        .SelectionMode = DataGridViewSelectionMode.FullRowSelect}
 
 
    Private Sub frmVerbrauchserfassung_Load(sender As Object, e As EventArgs) _
      Handles MyBase.Load
        Me.MinimumSize = New Size(450, 300)
        Me.FormBorderStyle = FormBorderStyle.Sizable
    End Sub
 
 
    Private Sub frmVerbrauchserfassung_Resize(sender As Object, e As EventArgs) _
      Handles Me.Resize
        dgv.Width = Me.ClientRectangle.Width - 20
        dgv.Height = Me.ClientRectangle.Height - 100
    End Sub
 
 
    Private Sub btnCreate_Click(sender As Object, e As EventArgs) Handles _
      btnCreate.Click
 
        bs.DataSource = Nothing
 
        dt = New DataTable
        dt.TableName = "Verbrauchserfassung"
        With dt.Columns
            .Add("Ablesedatum", GetType(Date))
            .Add("Strom", GetType(Double))
            .Add("Wasser", GetType(Double))
            .Add("Gas", GetType(Double))
        End With
 
        bs.DataSource = dt
    End Sub
 
 
    Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles _
      btnLoad.Click
 
        bs.DataSource = Nothing
        dt = Nothing
        dt = New DataTable
 
        Using ofd As New OpenFileDialog
            ofd.Filter = "Verbrauchstabelle XML|*.xml"
            ofd.CheckFileExists = True
            If ofd.ShowDialog = DialogResult.Cancel Then Exit Sub
 
            dt.ReadXml(ofd.FileName)
            bs.DataSource = dt
        End Using
    End Sub
 
 
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles _
      btnSave.Click
        If dt Is Nothing Then Exit Sub
 
        Using sfd As New SaveFileDialog
            sfd.Filter = "Verbrauchstabelle XML|*.xml"
            sfd.CheckPathExists = True
            If sfd.ShowDialog = DialogResult.Cancel Then Exit Sub
 
            dt.WriteXml(sfd.FileName, XmlWriteMode.WriteSchema)
        End Using
 
    End Sub
 
 
    Private Sub dgv_DataError(sender As Object, e As _
      DataGridViewDataErrorEventArgs) Handles dgv.DataError
 
        MsgBox(e.Exception.Message)
    End Sub
 
 
    Private Sub btnSumme_Click(sender As Object, e As EventArgs) Handles _
      btnSumme.Click
 
        If dt Is Nothing Then Exit Sub
        Dim wasser1, strom1, gas1, vl As Double, rc As Integer
        Dim wasser, strom, gas As Double
        Try
            For i As Integer = 0 To dgv.Rows.Count - 1
                Dim row As DataGridViewRow = dgv.Rows(i)
                If row.Selected Then
                    rc += 1
                    If strom1 = 0 Then
                        If Double.TryParse(row.Cells("Strom").Value.ToString, _
                          vl) Then
                            strom1 = vl
                        End If
                    End If
                    If wasser1 = 0 Then
                        If Double.TryParse(row.Cells("Wasser").Value.ToString, _
                          vl) Then
                            wasser1 = vl
                        End If
                    End If
                    If gas1 = 0 Then
                        If Double.TryParse(row.Cells("Gas").Value.ToString, vl) _
                          Then
                            gas1 = vl
                        End If
                    End If
 
                    If Double.TryParse(row.Cells("Wasser").Value.ToString, vl) _
                      Then
                        wasser = vl
                    End If
                    If Double.TryParse(row.Cells("Gas").Value.ToString, vl) Then
                        gas = vl
                    End If
                    If Double.TryParse(row.Cells("Strom").Value.ToString, vl) _
                      Then
                        strom = vl
                    End If
                End If
            Next i
        Catch ex As Exception
            MsgBox(ex.Message)
            Exit Sub
        End Try
 
        If rc < 2 Then
            MsgBox("Es müssen mindestens zwei Zeilen (Start/Ende der Periode)" & _
              "gewählt werden")
        Else
            MsgBox("Verbrauch gemäß gewählter Zeilen (" & rc.ToString & "):" & _
              vbCrLf &
                "Strom: " & (strom - strom1).ToString & vbCrLf &
                "Gas:" & (gas - gas1).ToString & vbCrLf &
                "Wasser: " & (wasser - wasser1).ToString)
        End If
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einfaches Beispiel 
Autor: Erichbru
Datum: 30.12.22 18:03

Hallo
zunächst mal Danke für das kleine Beispiel. Und ja richtig "was ist das für eine Frage" hätte es anders formulieren müssen Sorry.

mittlerweile habe ich mir ein Dataset gebastelt und eine Datatable mit den "Zählern" erstellt
die 2 Datatable ist die Erfassungstabelle sieht halt so aus:



Eingabe erfolgt über ein Formular so sieht das aktuell aus:



dein Beispiel sieht so aus: nur in meiner Variante bekomme ich damit keine Statistik / Auswertung hin



in meiner Version habe ich nun die Fragezeichen wie ich da den Verbrauch auswerten kann?
wie bekomme ich das je Strom, Gas, Wasser hin ?

ich hoffe habe mich nicht schon wieder falsch ausgedrückt!
würde mich freuen über deine Antworten oder muss ich meine Struktur ändern?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einfaches Beispiel 
Autor: Manfred X
Datum: 30.12.22 18:24

Hallo!

Mir leuchtet einiges an Deiner Struktur nicht ein.
Hast Du mehrere Strom-Zähler ode Gas-Zähler? Hast Du mehrere Wohnungen, die protokolliert werden sollen?

Du hast keine korrekte Tabellenverknüpfung.
In der Tabelle Zählerverwaltung und der Tabelle Zählerstände stehen gleiche Spalten (z.B. Zählernummer).
Statt dessen muss zwischen den Tabellen eine Verküpfung (Schlüssel, Datarelation) definiert werden.

Ich kenne Deine Auswertungsziele nicht.
Soll jeder Zähler eine eigene Tabelle für Zählerstände erhalten?

Es macht keinen Sinn, die Stände unterschiedlicher Zähler in der gleichen Tabellen-Spalte abzulegen.

Entweder Du machst das so wie ich es gezeigt habe (alle Zählerstände jeweils in die Spalten einer Tabelle)
oder Du legst für jeden Zähler eine eigene Tabelle für die Zählerstände und das zugehörige Datum an.

Falls Du eine relationale Datenbank-Anwendung schreiben willst, solltest Du Dich zunächst mit Fragen der
Normalisierung einer Datenstruktur befassen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einfaches Beispiel 
Autor: Erichbru
Datum: 30.12.22 18:44

zu deiner Frage: Hast Du mehrere Strom-Zähler ode Gas-Zähler? Hast Du mehrere Wohnungen, die protokolliert werden sollen?

Ja, wird wahrscheinlich so kommen das ich hier die Zähler der Nachbarn verwalten soll. Steht aber noch nicht fest.

ich möchte eine Statistik in Wieviele Tagen wieviel Strom, Gas, Wasser verbraucht wurde
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einfaches Beispiel 
Autor: Manfred X
Datum: 30.12.22 19:13

Wenn noch nicht feststeht, was genau Du an Daten verwalten willst,
kannst Du keine Datenbank erstellen.
Nachträgliches Umstrukturieren funktioniert nicht. Das Design muss stimmen.

Der einfachste Weg wäre ein Dataset, das zu jeder Wohnung eine Tabelle
enthält die etwa so aufgebaut ist, wie in meinem Beispiel (eine Zählerstandstabelle
für jeden Zähler, die Spaltenbezeichnung könnte jeweils die Zählernummer enthalten).
Die Tabellenbezeichnungen ergeben sich aus der Wohnungs-Adresse oder dem Namen des Bewohners.

Eventuell noch eine Tabelle mit den Zählern, die sich auf das gesamte Haus und nicht
auf einzelne Wohnungen beziehen.

Dieses Vorgehen wäre einfach und übersichtlich zu gestalten und anzuwenden.

Beitrag wurde zuletzt am 30.12.22 um 19:39:45 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einfaches Beispiel 
Autor: Erichbru
Datum: 05.01.23 11:36

Hallo Manfred,

mittlerweile habe ich mir ein Dataset mit 3 Tabellen erstellt

1 Tabelle Strom
1 Tabelle Gas
1 Tabelle Wasser (die 3 Spalten für je einen Zähler bekommen hat)

sieht so aus:


Detailform so:


Meine Berechnungen dazu, im BindingsourceListchange sieht richtig aus, aber macht man das so oder wie ?

den Code dazu sende ich nach, ist zu groß für diese Nachricht

auch wenn das schlechter code ist, freue mich über deine Kommentare oder Hilfe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Erichbru
Datum: 05.01.23 11:37

hier noch der Code: aus dem BindingsourceListChange Ereignis

 Private Sub BS_Wasser_ListChanged(sender As Object, e As EventArgs) Handles _
   BS_Wasser.ListChanged
        If BS_ZaehlerWasser_Liste.Count > 0 Then
            'Wasser W22007880
            Dim minStandW22007880 = (From drv In HB.Wasser Where drv.RowState _
              <> DataRowState.Deleted Select drv.W22007880).Min
            Dim maxStandW22007880 = (From drv In HB.Wasser Where drv.RowState _
            <> DataRowState.Deleted Select drv.W22007880).Max
 
            ZaehlerstandW22007880_start.Text = minStandW22007880
            ZaehlerstandW22007880_ende.Text = maxStandW22007880
            'Wasser W22007881
            Dim minStandW22007881 = (From drv In HB.Wasser Where drv.RowState _
              <> DataRowState.Deleted Select drv.W22007881).Min
            Dim maxStandW22007881 = (From drv In HB.Wasser Where drv.RowState _
            <> DataRowState.Deleted Select drv.W22007881).Max
 
            ZaehlerstandW22007881_start.Text = minStandW22007881
            ZaehlerstandW22007881_ende.Text = maxStandW22007881
            'Wasser W22007885
            Dim minStandW22007885 = (From drv In HB.Wasser Where drv.RowState _
              <> DataRowState.Deleted Select drv.W22007885).Min
            Dim maxStandW22007885 = (From drv In HB.Wasser Where drv.RowState _
            <> DataRowState.Deleted Select drv.W22007885).Max
 
            ZaehlerstandW22007885_start.Text = minStandW22007885
            ZaehlerstandW22007885_ende.Text = maxStandW22007885
            'kleinste Datum, grösste Datum ermitteln
            Dim minDatum = (From drv In HB.Wasser Where drv.RowState <> _
              DataRowState.Deleted Select drv.Ablesedatum).Min
            Dim maxDatum = (From drv In HB.Wasser Where drv.RowState <> _
            DataRowState.Deleted Select drv.Ablesedatum).Max
            'Anzeigen in Label
            lbl_Ablesedatum_W22007880_Max.Text = maxDatum.ToShortDateString
            lbl_Ablesedatum_W22007880_Min.Text = minDatum.ToShortDateString
            'Verbrauch berechnen
            Wasser1Verbrauch.Text = CDbl(ZaehlerstandW22007880_ende.Text) - _
              CDbl(ZaehlerstandW22007880_start.Text)
            Wasser2Verbrauch.Text = CDbl(ZaehlerstandW22007881_ende.Text) - _
            CDbl(ZaehlerstandW22007881_start.Text)
            Wasser3Verbrauch.Text = CDbl(ZaehlerstandW22007885_ende.Text) - _
            CDbl(ZaehlerstandW22007885_start.Text)
            '------------------------------------------------------------------
            ' --------
            Dim diff As TimeSpan = Date.Now.Subtract(maxDatum)
            Label_letzteEingabe.Text = String.Concat("letzte Eingabe vor: " & _
              diff.Days & " Tagen").ToString
            '------------------------------------------------------------------
            ' --------
            'Berechnung Verbrauch pro Tag in m³
            Dim x As Double = DateDiff(DateInterval.Day, minDatum, maxDatum)
            ResultLabelWVT1.Text = x
            RGWInfoboxZaehlerstand.Caption = String.Concat("Zaehlerstand vom: " _
              & minDatum).ToString
 
            Dim VBKubikW1 As Double = Double.Parse(Wasser1Verbrauch.Text) / x
            Dim VBKubikW2 As Double = Double.Parse(Wasser2Verbrauch.Text) / x
            Dim VBKubikW3 As Double = Double.Parse(Wasser3Verbrauch.Text) / x
 
            ResultLabelW1.Text = String.Format("{0:0.00} m³", VBKubikW1) & "" & _
              "pro Tag"   'Double.Parse(Wasser1Verbrauch.Text) / x
            ResultLabelW2.Text = String.Format("{0:0.00} m³", VBKubikW2) & "" & _
            "pro Tag"
            ResultLabelW3.Text = String.Format("{0:0.00} m³", VBKubikW3) & "" & _
            "pro Tag"
            '------------------------------------------------------------------
            ' --------
            'Berechnung Verbrauch pro Tag in Liter
            Dim VBKubiLW1 As Double = VBKubikW1 * 1000
            Dim VBKubiLW2 As Double = VBKubikW2 * 1000
            Dim VBKubiLW3 As Double = VBKubikW3 * 1000
 
            ResultLabelWT1.Text = String.Format("{0:0.00} Liter", VBKubiLW1) & _
              " pro Tag"
            ResultLabelWT2.Text = String.Format("{0:0.00} Liter", VBKubiLW2) & _
            " pro Tag"
            ResultLabelWT3.Text = String.Format("{0:0.00} Liter", VBKubiLW3) & _
            " pro Tag"
        Else
            lbl_Ablesedatum_W22007880_Max.Text = "keine Daten"
            lbl_Ablesedatum_W22007880_Min.Text = "keine Daten"
            ZaehlerstandW22007880_start.Text = String.Empty
            ZaehlerstandW22007880_ende.Text = String.Empty
            ZaehlerstandW22007881_start.Text = String.Empty
            ZaehlerstandW22007881_ende.Text = String.Empty
            ZaehlerstandW22007885_start.Text = String.Empty
            ZaehlerstandW22007885_ende.Text = String.Empty
 
            RGWInfoboxZaehlerstand.Caption = String.Concat("Noch keine" & _
              "Zaehlerstaende erfasst").ToString
        End If
 
 
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Manfred X
Datum: 06.01.23 06:16

Hallo!

Verbrauch in bestimmten Zeiträumen ermitteln:
Wenn die Ablesungen nicht regelmäßig und hinreichend oft erfolgen,
muss der Verbrauch aus den vorhandenen Daten durch Interpolation
der Zählerstände/Ablesetage ermittelt werden.

Public Class frmConsum
 
    Dim dt As New DataTable
    Dim bs As New BindingSource
    Dim dgv As New DataGridView With
        {.Parent = Me, .Size = New Size(400, 300), .DataSource = bs}
 
 
    Private Sub frmVerbrauch_Load(sender As Object, _
        e As EventArgs) Handles MyBase.Load
 
        'Testdaten
        dt.Columns.Add("Datum", GetType(Date))
        dt.Columns.Add("Stand", GetType(Double))
 
        With dt.Rows
            .Add(New Date(2022, 1, 1), 20)
            .Add(New Date(2022, 3, 15), 382)
            .Add(New Date(2022, 3, 26), 476)
            .Add(New Date(2022, 4, 6), 589)
            .Add(New Date(2022, 4, 23), 745)
            .Add(New Date(2022, 5, 5), 830)
            .Add(New Date(2022, 5, 15), 934)
            .Add(New Date(2022, 7, 4), 1011)
            .Add(New Date(2022, 12, 31), 2123)
        End With
 
        'Datenbindung
        bs.datasource = dt
 
        'Beispiel Verbrauch im April 2022
        Dim c1 As Double = _
              GetConsum(bs, New Date(2022, 4, 1), New Date(2022, 4, 30), _
              "Datum", "Stand")
 
        'Beispiel Gesamtverbrauch 2022
        Dim c3 As Double = _
             GetConsum(bs, New Date(2022, 1, 1), New Date(2022, 12, 31), _
             "Datum", "Stand")
 
        'Beispiel für die Ermittlung der interpolierten Verbräuche pro Monat
        Dim c(12) As Double, csum As Double
        For i As Integer = 1 To 12
            If i < 12 Then
                c(i) = _ 
                GetConsum(bs, New Date(2022, i, 1), New Date(2022, i + 1, 1), _
                "Datum", "Stand")
            Else
                c(i) = _
                GetConsum(bs, New Date(2022, i, 1), New Date(2022, i, 31), _
                "Datum", "Stand")
            End If
            csum += c(i)
        Next i
 
    End Sub
 
 
    Private Function GetConsum(bs As BindingSource, 
                         Start_Date As Date, End_date As Date,
                         Date_Column As String, Count_Column As String) As _
                           Double
 
        'ansteigendes Sortieren ist erforderlich
        bs.Sort = Date_Column & "  ASC"
 
        If (End_date - Start_Date).Days < 1 Then Return -1
 
        Dim start_interpol, end_interpol, first_value, last_value As Double
        Dim found_Start As Boolean = False, found_end As Boolean = False
        Dim consum As Double = -1
 
        For i As Integer = 0 To bs.Count - 2
 
            'Daten einer Zeilenpaarung in Variablen eintragen
            Dim d1 As Date = CDate(bs(i).row(Date_Column)).Date
            Dim d2 As Date = CDate(bs(i + 1).row(Date_Column)).Date
            Dim c1 As Double = CDbl(bs(i).row(Count_Column))
            Dim c2 As Double = CDbl(bs(i + 1).row(Count_Column))
 
            'aktuelles Ableseintervall in Tagen
            Dim interval_days As Integer = (d2 - d1).TotalDays
 
            'Mehrere Ablesungen zu einem Datum sind unplausibel 
            If interval_days < 1 Then Return -1
 
            'Sonderfall: Keine Ablesung ist innerhalb des Intervalls erfolgt
            If d1 <= Start_Date And d2 >= End_date Then
                Return (c2 - c1) * (End_date - Start_Date).TotalDays / _
                  interval_days
            End If
 
            If d1 = Start_Date Then
                'Am ersten Tag des gewünschten Intervalls ist abgelesen worden
                start_interpol = 0 : first_value = c1 : found_Start = True
            ElseIf d1 < Start_Date And d2 > Start_Date Then
                'Stand am ersten Tag des gewünschten Intervalls linear 
                ' interpolieren
                start_interpol = (c2 - c1) * (d2 - Start_Date).TotalDays / _
                  interval_days
                first_value = c2 'erster Stand im Intervall
                found_Start = True
            End If
 
            If d1 = End_date Then
                'Am letzten Tag des gewünschten Intervalls ist abgelesen worden
                end_interpol = 0 : last_value = c1 : found_end = True
            ElseIf d2 = End_date Then
                end_interpol = 0 : last_value = c2 : found_end = True
            ElseIf d1 < End_date And d2 > End_date Then
                'Stand am letzten Tag des gewünschten Intervalls linear 
                ' interpolieren
                end_interpol = (c2 - c1) * (End_date - d1).TotalDays / _
                  interval_days
                last_value = c1 'letzter Stand im Intervall
                found_end = True
            End If
 
            If found_Start And found_end Then
                'Verbrauch im Intervall ggf. incl. Interpolation am Anfang und 
                ' Ende
                Return start_interpol + end_interpol + (last_value - _
                  first_value)
            End If
        Next i
 
        'Keine Daten 
        Return -1
    End Function
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Erichbru
Datum: 07.01.23 11:59

Danke für das Beispiel,

ich habe es noch nicht ganz verstanden.
Bekomme diesen Fehler!



was mach ich noch falsch?

    Private Sub WV_grossesBad()
        Dim startdate As Date = CDate(tbstart.Text).ToShortDateString
        Dim endedate As Date = CDate(tbende.Text).ToShortDateString
        'Zaehler 22007880
        Dim NL As String = Environment.NewLine
        Dim Titel As String = "Statusmeldung"
 
        Dim C1 As Double = GetConsum(BS_Wasser, startdate, endedate, _
          "Ablesedatum", "W22007880")
 
        Dim Meldung As String = String.Concat(NL, "Wasserverbrauch: ", NL, _
                                                  C1)
        MessageBox.Show(Meldung, Titel, MessageBoxButtons.OK, _
          MessageBoxIcon.Information)
    End Sub
merkwürdig beim 2 al hat er es dann gemacht (Ergebnis ist das gleiche wie bei mir) verstehe es aber noch nicht

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Manfred X
Datum: 07.01.23 18:41

Hallo!

Durch die Methode "ToShortDateString" versuchst Du,
eine Zeichenfolge auf eine Date-Variable zuzuweisen.
Lass diese Methode weg und setze "Option Strict On"
an den Anfang Deines Formulars.

Seien tboStartDate, tboEndDate zwei Textboxen,
sähe der Code für die Verarbeitung der Benutzereingabe
etwa so aus:
   If Not Date.TryParse(tbostartdate.Text, start_date) Or
      Not Date.TryParse(tboEnddate.Text, end_date) Or
       (end_date - start_date).TotalDays < 2 Then
 
       MsgBox("Ungeeignete Eingabe des Zeitintervalls")
   Else
            'Verarbeitung des Intervalls:
            'start_date und End_date enthalten einen
            'Zeitraum
            'Der muss allerdings innerhalb des Ablesezeitraums
            'der Zählerstände liegen. Das könnte man noch prüfen.            
   End If
Es gibt allerdings im Visual Studio geeignete Eingabecontrols
für Date-Werte.

Beitrag wurde zuletzt am 07.01.23 um 18:42:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Erichbru
Datum: 09.01.23 16:52

Hallo Manfred,

Danke ich melde mich noch mal baue gerade ein wenig um.

die TextBoxen bezogen sich nicht auf mein Eingabe Form, habe ich aber an der Stelle mit eingebaut

den Wasserverbrauch berechne ich so, mit deiner Funktion.



 Private Sub Wasserverbrauch()
        If BS_ZaehlerWasser_Liste.Count > 0 Then
            'firstdate, lastdate ermitteln
            Dim firstdate = (From drv In HB.Wasser Where drv.RowState <> _
              DataRowState.Deleted Select drv.Ablesedatum).Min
            Dim lastdate = (From drv In HB.Wasser Where drv.RowState <> _
            DataRowState.Deleted Select drv.Ablesedatum).Max
            'Zaehler 22007880
            Dim NL As String = Environment.NewLine
 
            Dim C1 As Double = GetConsum(BS_Wasser, firstdate, lastdate, _
              "Ablesedatum", "W22007880")
            Dim C2 As Double = GetConsum(BS_Wasser, firstdate, lastdate, _
            "Ablesedatum", "W22007881")
            Dim C3 As Double = GetConsum(BS_Wasser, firstdate, lastdate, _
            "Ablesedatum", "W22007885")
 
            Dim CWVgesamt As Double = C1 + C2 + C3
 
            Dim VBLiter As Double = Math.Round(CWVgesamt * 1000, 2)
 
            Dim Meldungstext As String = "Status:"
 
            Meldungstext = Meldungstext & NL & _
              "----------------------------------------------------"
            Meldungstext = Meldungstext & NL & _
            "----------------------------------------------------"
            Meldungstext = Meldungstext & NL & Format(Now, "dd.MM.yyyy" & _
            "HH:mm:ss")
            Meldungstext = Meldungstext & NL & _
            "----------------------------------------------------"
            Meldungstext = Meldungstext & NL & _
            "-----------------------------------------------------------------" & _
            "-------------------------"
            Meldungstext = Meldungstext & NL & "Wasserverbrauch gesamt m³:   " _
            & "( " & CWVgesamt & " ) " & "[ " & VBLiter & " Liter " & "]"
            Meldungstext = Meldungstext & NL & _
            "-----------------------------------------------------------------" & _
            "-------------------------"
            Meldungstext = Meldungstext & NL & "im Ablesezeitraum: " & _
            firstdate.ToShortDateString & " <> " & lastdate.ToShortDateString
            Meldungstext = Meldungstext & NL & _
            "-----------------------------------------------------------------" & _
            "-------------------------"
            Meldungstext = Meldungstext & NL & "Zählernummer-22007880 [WV]:    " & _
            "                    " & "( " & C1 & " m³)"
            Meldungstext = Meldungstext & NL & "Zählernummer-22007881 [WV]:    " & _
            "                    " & "( " & C2 & " m³)"
            Meldungstext = Meldungstext & NL & "Zählernummer-22007885 [WV]:    " & _
            "                    " & "( " & C3 & " m³)"
            Meldungstext = Meldungstext & NL & _
            "-----------------------------------------------------------------" & _
            "-------------------------"
            Meldungstext = Meldungstext & NL & "Wasserverbrauch pro Tag" & _
            "[Liter]:   " & "( " & " ) "
            Meldungstext = Meldungstext & NL & _
            "-----------------------------------------------------------------" & _
            "-------------------------"
            Meldungstext = Meldungstext & NL & _
            "-----------------------------------------------------------------" & _
            "-------------------------"
 
            MessageBox.Show(Meldungstext, "Auswertung:")
        Else
            Meldung_Wassertabelle()
        End If
    End Sub
für deine Kommentare schon jetzt Danke. Die Liter pro Tag weiß noch nicht wie ich da ran gehe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Manfred X
Datum: 09.01.23 22:31

Die Routine "GetConsum" berücksichtigt nur das Datum, nicht die Uhrzeit
der Ablesung.
Falls Uhrzeiten wichtig sind, weil mehrmals täglich abgelesen wird,
muss die Date-Methode beim Lesen von d1,d2 entfernt werden und überall
wo die Methode totaldays verwendet wird, muss statt dessen die Methode
totalminutes benutzt werden.
Die Methode Interval_Days würden zu Interval_Minutes.

Deine Meldeausgabe ist ziemlich umständlich und unübersichtlich.

Meldung = "Erfassungszeitraum: " &
           firstdate.ToShortDateString & " bis " &
           lastdate.ToShortDateString & vbCrLf & vbCrLf
 
   'Dann eine Schleife über ein Stringarray das die Zähler-Nummern enthält
   'und ein Array, das die ermittelten Verbräuche enthält.
 
   Dim counters(2) As Double 'counters(0)="Zählernummer-22007880" usw  
   Dim consums(2) As Double 'Array mit den Verbräuchen c1, c2, c3
   Dim csum As Double
 
   For i = 0 To counters.Length - 1
       Meldung &= "Zählernummer " & counters(i) &
       " Verbrauch: " & consums(i).ToString("0.00") & " m³" & vbCrLf
       csum += consums(i) 'Summe der Verbräuche
   Next i
 
   Meldung &= vbCrLf & "Mittlerer täglicher Verbrauch: "
   Meldung &= (csum * 1000 / (lastdate - firstdate).TotalDays).ToString("0.00") _
     & " L."
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Erichbru
Datum: 10.01.23 10:46

Hallo Manfred,

Danke

Ja, meine Meldeausgabe ist ziemlich umständlich und unübersichtlich

 'Hiermit habe ich noch ein Problem, in der Umsetzung wie man das macht?
 Dim counters(2) As Double 'counters(0)="Zählernummer-22007880" usw  
 Dim consums(2) As Double 'Array mit den Verbräuchen c1, c2, c3
kannst du mir das mit Array mal erklären?

derzeit sieht es so aus (kein Daten Inhalt)



https://ibb.co/pdh47KW
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Manfred X
Datum: 10.01.23 11:41

   'Die Nummern der Zähler in ein Array schreiben
   Dim counters(2) As Integer
 
   counters(0) = 22007880
   counters(1) = 22007881
   counters(2) = 22007885
 
   'Die Verbräuche gemäß der drei Wasser-Zähler in ein Array schreiben:
   Dim consums(2) As Double
   For i As Integer = 0 To counters.Length - 1
       consums(i) = GetConsum(BS_Wasser, firstdate, lastdate,
              "Ablesedatum", "W" & counters(i).ToString)
   Next i
 
   'Schleife für  Meldung
   For i = 0 To counters.Length - 1
       Meldung &= "Zählernummer W" & counters(i).ToString &
        " Verbrauch: " & consums(i).ToString("0.00") & " m³" & vbCrLf
       csum += consums(i) 'Summe der Verbräuche
   Next i
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Erichbru
Datum: 10.01.23 11:56

ist es so richtig verstanden?

  If BS_ZaehlerWasser_Liste.Count > 0 Then
            'firstdate, lastdate ermitteln
            Dim firstdate = (From drv In HB.Wasser Where drv.RowState <> _
              DataRowState.Deleted Select drv.Ablesedatum).Min
            Dim lastdate = (From drv In HB.Wasser Where drv.RowState <> _
            DataRowState.Deleted Select drv.Ablesedatum).Max
            'Verbräuche ermitteln
            Dim C1 As Double = GetConsum(BS_Wasser, firstdate, lastdate, _
              "Ablesedatum", "W22007880")
            Dim C2 As Double = GetConsum(BS_Wasser, firstdate, lastdate, _
            "Ablesedatum", "W22007881")
            Dim C3 As Double = GetConsum(BS_Wasser, firstdate, lastdate, _
            "Ablesedatum", "W22007885")
 
 
            Dim Meldung As String = "Status:"
 
            Meldung = "Erfassungszeitraum: " & firstdate.ToShortDateString & "" & _
              "bis " & lastdate.ToShortDateString & vbCrLf & vbCrLf
 
            'Dann eine Schleife über ein Stringarray das die Zähler-Nummern 
            ' enthält
            'und ein Array, das die ermittelten Verbräuche enthält.
 
            Dim counters(2) As Double  'counters(0)="Zählernummer-22007880" usw 
            Dim consums(2) As Double  'Array mit den Verbräuchen c1, c2, c3
 
            counters = {22007880, 22007881, 22007885}
            consums = {C1, C2, C3}
 
            Dim csum As Double
 
            For i = 0 To counters.Length - 1
                Meldung &= "Zählernummer " & counters(i) & " Verbrauch: " & _
                  consums(i).ToString("0.00") & " m³" & vbCrLf
                csum += consums(i) 'Summe der Verbräuche
            Next i
 
            Meldung &= vbCrLf & "Mittlerer täglicher Verbrauch: "
            Meldung &= (csum * 1000 / (lastdate - _
              firstdate).TotalDays).ToString("0.00") & " L."
 
 
            MessageBox.Show(Meldung, "Auswertung:")
 
        Else
            Meldung_Wassertabelle()
        End If

www google bilder de
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Verbrauchsermittlung in einem Zeitraum / Zählerstands-Interpolation 
Autor: Erichbru
Datum: 10.01.23 12:01

OK Verstanden, du warst jetzt schneller meine Variante habe ich verworfen.

Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Erichbru
Datum: 20.04.23 16:46

Hallo Manfred X,

wichtige Rückfrage Bitte

warum passt das nicht mehr ? habe die Spalte Ablesedatum umgestellt auf DateTime ist das der Grund ?




   If BS_Stromdetails_Liste.Count > 0 Then
            'firstdate, lastdate ermitteln
            Dim firstdate = (From drv In HBDatenbankDS.tblStrom Where _
              drv.RowState <> DataRowState.Deleted Select drv.Ablesedatum).Min
            Dim lastdate = (From drv In HBDatenbankDS.tblStrom Where _
            drv.RowState <> DataRowState.Deleted Select drv.Ablesedatum).Max
 
            Dim C1 As Double = GetConsum(BS_Strom, firstdate, lastdate, _
              "Ablesedatum", "S1258882")
 
            Dim Meldung As String = "Status:"
            Dim x As Double = DateDiff(DateInterval.Day, firstdate, lastdate)
 
            Meldung = "Zeitraum: " & firstdate & " bis " & lastdate & " ~ ( " & _
              x.ToString & " ) Tage" & vbCrLf & vbCrLf
 
            'Die Nummern der Zähler in ein Array schreiben
            Dim counters(2) As Integer
 
            counters(0) = 1258882
 
            'Den Verbrauch gemäß des Strom-Zähler in ein Array schreiben:
            Dim consums(2) As Double
            Dim csum As Double
 
            For i As Integer = 0 To counters.Length - 3
                consums(i) = GetConsum(BS_Strom, firstdate, lastdate,
                       "Ablesedatum", "S" & counters(i).ToString)
            Next i
 
            'Schleife für  Meldung
            For i = 0 To counters.Length - 3
                Meldung &= "Zähler " & counters(i).ToString &
                 " Stromverbrauch: " & consums(i).ToString("0.00") & " kwh" & _
                   vbCrLf
                csum += consums(i) 'Summe der Verbräuche
            Next i
 
            Meldung &= vbCrLf & "Mittlerer täglicher Verbrauch: "
            Meldung &= (csum * 1 / (lastdate - firstdate).TotalDays).ToString( _
              "0.00") & " kwh"
 
            MessageBox.Show(Meldung, "Auswertung:")
Else
 
        End If
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Manfred X
Datum: 20.04.23 21:17

Hallo!

Die GetConsum-Methode muss vermutlich angepasst werden.

Die Konvertierung in CDATE sollte entfallen, wenn row(Date_Column) bereits einen
Datetime-Wert liefert.
Hier sollte im Code die Anpassung erfolgen.
'Daten einer Zeilenpaarung in Variablen eintragen
Dim d1 As Date = CDate(bs(i).row(Date_Column)).Date
Dim d2 As Date = CDate(bs(i + 1).row(Date_Column)).Date
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zählerstände Strom, Wasser, Gas erfassen Auswerten 
Autor: Erichbru
Datum: 27.03.24 10:55

Hallo ManfredX,

habe da noch eine Rückfrage möchte die Auswertung ergänzen. ähnlich wie im Bild rechts

also:

'in einem Label anzeigen
'innerhalb x Tagen x kwh pro Tag verbraucht.
'x EUR Gesamtkosten.
'x EUR pro Tag

benötigt man noch eine Tabelle bspw. Kosten ?
wie kann man die Tage ermitteln von der Erstablesung zur 2ten Ablesung
usw.

so ermittelt man erste und letzte Ablesung
 'firstdate, lastdate ermitteln
            Dim firstdate = (From drv In ArchivDB.AblesedatenStrom Where _
              drv.RowState <> DataRowState.Deleted Select drv.Ablesedatum).Min
            Dim lastdate = (From drv In ArchivDB.AblesedatenStrom Where _
            drv.RowState <> DataRowState.Deleted Select drv.Ablesedatum).Max
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel