| |
VB.NET - Ein- und UmsteigerZä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. | |
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. | |
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 | |
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? | |
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. | |
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 | |
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. | |
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. | |
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 | |
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 | |
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
| |
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. | |
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. | |
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." | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|