Ankündigung

Einklappen
Keine Ankündigung bisher.

Hilfestellung für den Aufbau/Struktur für Energiekostenübersicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfestellung für den Aufbau/Struktur für Energiekostenübersicht

    Hallo zusammen,

    ich bin der Neue aus NRW und vielleicht kann mir jemand mit Gedankenanstößen helfen.
    Ich möchte für mich eine Energieverbrauch-Übersicht erstellen.

    Erstmal nur für meinen Strom- und Gaszähler.

    Ich habe zwei Tabellen in meiner DB angelegt.
    1. für die Zähler (Strom und Gas)
    2. für die Abgelesenen Werte.
    im Array sieht die zweite Tabelle so aus:
    PHP-Code:
    Array  (     [0] => Array         (             [id] => 5             [zaehler_id] => (ist der GAS-Zähler)             [zaehlerstand] => 8530.07             [ablesung] => 2017-01-31 00:00:00         )      [1] => Array         (             [id] => 6             [zaehler_id] => (ist der Strom-Zähler)             [zaehlerstand] => 52265             [ablesung] => 2017-01-31 00:00:00         ) ....... 
    Jetzt möchte ich mir natürlich von den eingegebenen Werten jeweils die Differenz pro Jahr pro Zähler anzeigen lassen.

    zur Zeit lese ich alles in ein Array ein. Kann dies aber nicht nach meinen Wünschen ausgegeben lassen.


    Bin ich auf dem richtigen weg oder sollte ich pro Zähler eine Tabelle nehmen.
    Oder sollte ich es ganz anders angehen?
    Bin noch Anfänger.

    Hoffe es meldet sich jemand.


    Danke vorab.

  • #2
    Wird es denn noch mehr oder bleibt es bei 2 Zählern und einer Ablesung im Jahr?

    Kommentar


    • #3
      Die Datenbankstruktur ist gut, schön Zähler von Ableseständen getrennt.

      Du könntest die Werte nach dem Ablesedatum aufsteigend sortiert aus der Datenbank geben lassen und anschließend über das obige Array iterieren. Die Differenz berechnest du dann mit dem vorherigen Element (zwischenspeichern) und dem aktuellen.
      "Software is like Sex, it's best if it's free." - Linus Torvalds

      Kommentar


      • #4
        Wow, danke euch erstmal.

        protestix
        Ich würde zwar gerne die Zähleranzahl flexibel halten aber im großen und ganzen werden es wohl eh nicht mehr.
        Ablesen reicht ja auch erstmal einmal im Jahr. Wenn das dann läuft würde ich aber auch gern es mit einer Monats- und Jahresübersicht gestallten.
        Deshalb brauche ich eure Hilfestellung bei einer "flexiblen" Planung/Struktur.

        @JaMa
        ich hole die Daten aufsteigend sortiert aus der DB mit
        PHP-Code:
        $query sprintf("SELECT * FROM Zaehlerstand ORDER BY ablesung ASC"); 
        und dann fülle ich mein Array
        PHP-Code:
        while ($row mysqli_fetch_assoc($result)) {
             
        $results[] = $row;

        Ich hänge an dem Punkt mit dem Zwischenspeichern.
        Da muß ich ja erstmal den Zähler-Type (Strom oder Gas) und dann das Jahr aus dem Array Filter, richtig?

        Kommentar


        • #5
          Zitat von Zwenny Beitrag anzeigen
          @JaMa
          ich hole die Daten aufsteigend sortiert aus der DB mit
          PHP-Code:
          $query sprintf("SELECT * FROM Zaehlerstand ORDER BY ablesung ASC"); 
          und dann fülle ich mein Array
          PHP-Code:
          while ($row mysqli_fetch_assoc($result)) {
          $results[] = $row;

          Ich hänge an dem Punkt mit dem Zwischenspeichern.
          Da muß ich ja erstmal den Zähler-Type (Strom oder Gas) und dann das Jahr aus dem Array Filter, richtig?
          Du kannst die Werte direkt in der while Schleife verarbeiten und musst diese nicht extra in das $results Array einfügen. Spart Speicher.
          PHP-Code:
          $previous = [];
          while (
          $row mysqli_fetch_assoc($result)) {
              if (!
          array_key_exists($row['ZaehlerIndex'], $previous)) {
                  
          $previous[$row['ZaehlerIndex']] = 0;
              }
              
          printf("Difference: %d"$row['value'] - $previous[$row['ZaehlerIndex']]);
              
          $previous[$result['ZaehlerIndex']] = $row['value'];

          Das wäre in etwa was ich meine. Geht sicherlich auch effizienter, eventuell auch auch direkt auf der Datenbank, aber ist so ziemlich der einfachste Ansatz.
          "Software is like Sex, it's best if it's free." - Linus Torvalds

          Kommentar


          • #6
            So JaMa,

            nach vielen gescheiterten Versuchen kommen immer wieder Fragen auf.
            Verstehe ich das so richtig?
            PHP-Code:
            $previous = [];
            // erzeugt ein Array

            while ($row mysqli_fetch_assoc($result)) {                    
            // füllt alle Daten aus DB Tabelle Zaehlerstand ins Array $row

              
            if (!array_key_exists($row['ZaehlerIndex'], $previous)) {
              
            // Key->($row['ZaehlerIndex']) im Array->($previous) suchen.

                
            $previous[$row['ZaehlerIndex']] = 0;
                
            // Wenn nichts überein stimmt setze den Wert auf 0

                
            }

                
            printf("Difference: %d"$row['value'] - $previous[$row['ZaehlerIndex']]);
                
            // Schreibe die Differenz zwischen dem Wert und dem vorherigen Wert.
                // Erste Runde sollte der vorherige Wert 0 sein, oder?

                
            $previous[$result['ZaehlerIndex']] = $row['value'];
                
            // Setze den vorherigen Wert = aktuellen Wert,
                // damit beim nächsten durchlauf mit diesem weiter
                // gerechnet werden kann. 

            Kommentar


            • #7
              Normalerweise schreibt man Kommentare immer über den zu erklärenden Bereich und nicht darunter

              Die Zuweisung in der While-Bedingung ($row = mysqli_...) lädt die Zeile in die $row (oder falls alle Zeilen abgearbeitet sind false, worauf die Bedingung für while nicht mehr gegeben ist), führt dann den Anweisungsblock aus und lädt dann die nächste Zeile usw.
              Nicht alles aufeinmal.

              Der Teil in der If-Bedingung ist einfach die Initialisierung des Arrays, ansonsten würdest du bei der Berechnung auf einen nicht vorhandenen Index zugreifen.

              Ansonsten hast du ja schon verstanden was passiert. Es werden einfach die Ableseintervalldifferenzen gebildet (davon ausgehend, dass die Werte in gleichen Zeitabständen pro Zähler vorliegen).
              "Software is like Sex, it's best if it's free." - Linus Torvalds

              Kommentar


              • #8
                Ok Danke. Das hab ich glaub ich verstanden.
                Ich zerbreche mir nur echt den Kopf, woher $previous einen Wert bekommt.
                $previous ist bei mir immer null.
                Und keine Fehlermeldung bekomme ich nur, wenn ich die letzte Zeile so ändere:
                PHP-Code:
                $previous[$row['zaehlerstand']] = $row['zaehlerstand']; 
                er rechnet aber nicht. Wie auch.
                Wenn ich mir die Werte in der Schleife ausgeben lasse:
                PHP-Code:
                previous0 Difference52265
                previous
                0 Difference55165
                previous
                0 Difference57579
                previous
                0 Difference8530
                previous
                0 Difference9623
                previous
                0 Difference10686

                Array (    
                [
                52265] => 52265    
                [55165.8] => 55165.8    
                [57579.4] => 57579.4    
                [8530.07] => 8530.07    
                [9623.23] => 9623.23    
                [10686.88] => 10686.88 

                Kommentar


                • #9
                  PHP-Code:
                  $previous[$row['zaehlerstand']] = $row['zaehlerstand']; 
                  Das kann so auch nicht stimmen. Du musst als Key bei $previous immer die Zähler-ID aus der DB bzw. die Zähler Nummer nutzen und nicht den Zählerstand.

                  $row['ZaehlerIndex'] musst du in deinem Fall eben durch deinen Spaltennamen für die Zähler-ID ersetzen.
                  "Software is like Sex, it's best if it's free." - Linus Torvalds

                  Kommentar


                  • #10
                    Ich danke Dir. Auch für deine Geduld
                    Ich teste weiter und würde mich ggf. wieder melden.

                    Kommentar


                    • #11
                      Guten Abend zusammen,

                      ich brauch mal wieder Hilfe.

                      Ich lese aus meiner DB meine Zählerstände aus und errechne jeweils die Differenz als Verbrauch.
                      Dadurch hab ich ja einen Anfangswert (beim ersten Durchgang) und nichts zum errechnen für meine Differenz.
                      Dadurch bekomme ich ja bei dem ersten Datensatz den kompletten Zählerstand als Verbrauch angezeigt.
                      Ist ja auch nicht verkehrt, sieht aber nicht schön aus.

                      Wie könnte ich das elegant lösen?
                      PHP-Code:
                      <?php
                      // erzeugt ein Array
                      $previous = [];
                      $monat = [];

                      // füllt alle Daten aus DB Tabelle Zaehlerstand ins Array $row
                      while ($row $stmt->fetch(PDO::FETCH_ASSOC)) {

                        
                      // Datum formatieren
                        
                      $datum date("d.m.Y"strtotime($row["time"]));

                        
                      // erzeugt aus jedem einzelnen Element eines Arrays ($row) eine Variable.
                        
                      extract($row);

                        
                      // Key->($row['ZaehlerIndex']) im Array->($previous) suchen.
                        
                      if (!array_key_exists($zaehler_id$previous)) {

                            
                      // Wenn nichts übereinstimmt setze den Wert auf 0
                            
                      $previous[$zaehler_id] = 0;
                        }

                        
                      // Hier wird der Verbrauch errechnet
                        
                      $verbrauch $zaehlerstand $previous[$zaehler_id];

                        
                      // Hier wird m3 in kWh errechnet
                        
                      $umrechnung_gas number_format($verbrauch $row['brennwert'] * $row['zustandszahl'], 2',''.');

                        
                      // Hier wird der der Wert für die nächste Runde an den Merker gesetzt
                        
                      $previous[$zaehler_id] = $zaehlerstand;
                      ?>
                              <tr>
                                <td><?php echo $row['type']; ?></td>
                                <td><?php echo $datum?></td>
                                <td><?php echo $row['zaehlerstand'] . " " $row['einheit']; ?></td>
                                <td><?php echo $verbrauch " " $row['einheit']; ?></td>
                                <td><?php echo $umrechnung_gas " kWh"?></td>
                              </tr>
                      <?php
                      }
                      ?>


                      Danke vorab.

                      Kommentar

                      Lädt...
                      X