Mehrfache Zeitberechnung

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

  • Mehrfache Zeitberechnung

    Hallo Prog-Profis...
    ich habe mir ein kassenprogramm geschrieben.
    ziel ist es die gespielte zeit an einem billardtisch zu erfassen.
    nicht so schwer... doch es sind unterschiedliche preise zu bestimmten zeiten.

    ALSO:
    Preis für Billard von 16:00 Uhr bis 18:00 Uhr 3,50 €
    Preis für Billard von 18:00 Uhr bis 20:00 Uhr 4,50 €
    Preis für Billard von 20:00 Uhr bis 2:00 Uhr 5,50 €

    Spielzeit, z.B. von 16:30 bis 21:00
    oder
    Spielzeit, z.B. von 18:00 bis 21:25
    oder
    Spielzeit, z.B. von 16:00 bis 21:25

    Startzeit und Endzeit werden in mysql Datenbank gespeichert.
    der Stundenpreis wird aus einer Datenbank abgefragt.
    nun muss nur noch berechnet werden
    wenn startzeit < 18:00 und endzeit < 18:00
    wenn startzeit < 18:00 und endzeit < 20:00
    wenn startzeit < 20:00 und endzeit < 22:00 und endzeit > 20:00
    usw...

    hat jemand eine idee wie man das umsetzen kann?
    habe bisher die ganze kasse selber geschrieben... aber hier bin ich am ende.
    bekomme es einfach nicht hin...
    wäre suuuper nett, wenn mir da einer helfen könnte...
    danke schon mal vorab

  • #2
    also ich würde einfach die Anteile der zeiten in den jeweilig festgelegten Zeitclustern ausrechnen und dann mit dem Stundensatz versehen, heisst Du zerlegst die Zeitfenster in der Berechnungslogik

    Spielzeit, z.B. von 16:30 bis 21:00
    entspricht dann
    1,5 Std 3,50 €
    2 Std 4,50 €
    1 Std 5,50 €
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Zeiberechnung

      Hallo MelloPie,
      erst mal danke für die rasche antwort...

      so hab ich das auch versucht aber ich bin an den vielen möglichkeiten gescheiter die sich da ergeben...

      hättest du da ein beispiel ?

      denn alleine das zerlegen der zeitabschnitte ist ja schon recht aufwendig.

      hinzu kommt:
      mann kann 3 tische zusätzlich starten in einer tischabrechnung.
      Bs. tisch 8 wird gestartet und die kundenseite für den Tisch wird automatisch geöffnet.
      dann kann man auf der seite noch z.B. Tisch 9, 10 und 11 starten.
      alles wird dann am ende bei tisch 8 abgerechnet.

      bisher funktioniert das alles auch ganz prima, nur halt immer mit dem selben preis. (nur tisch 11 ist etwas teurer weil das Snooker ist.)
      wird aber alles berechnet.

      soll ich mal meine berechnung hier posten?
      falls jemand da durchsteigt. (anfänger-PHP)

      Kommentar


      • #4
        Du hast eine Tabelle prices(start, end, price). Desweiteren hast du eine Tabelle tables(id, name), in der die Tische abgelegt sind und eine Tabelle rents(id, tid, start, end). Was du wahrscheinlich noch nicht hast, ist eine Tabelle bills(id, rid).

        Wenn jetzt ein Kunde einen Tisch mietet, erzeugst du einen Eintrag in bills mit irgendeiner eindeutigen ID und einem Verweis auf einen Eintrag in rents. Den mußt du natürlich auch noch anlegen (es sei denn es wurde vorbestellt, aber das lassen wir mal außen vor). Der Eintrag in rents gibt an, welcher Tisch (tid) ab wann (start) gemietet wurde. rents.end bleibt erstmal leer.

        Jetzt wird ein weiterer Tisch vom selben Kunden, also auf die selbe Rechnung gemietet. Du schreibst einen neuen Eintrag in bills, und zwar mit der selben bills.id und einer rid, die auf den neuen Ausleihvorgang verweist.

        Wenn ein Kunde bezahlen möchte, mußt du nur seine Rechnungsnummer (bills.id) wissen. Damit ziehst du aus bills alle rid's, also alle "Ausleihen", die er hatte. Jetzt setzt du erstmal bei jeder dieser Ausleihen den end-Wert auf NOW().

        UPDATE rents SET end = NOW() WHERE id IN (SELECT rid FROM bills WHERE id = $id)

        Jetzt bestimmst du den minimalen start- und maximalen end-Wert aller dieser Ausleihen und ziehst dir aus prices alles, was in diesen Bereich fällt.

        SELECT * FROM prices
        WHERE end < (SELECT MIN(start) FROM rents WHERE id IN (SELECT rid FROM bills WHERE id = $id))
        OR start > (SELECT MAX(end) FROM rents WHERE id IN (SELECT rid FROM bills WHERE id = $id))

        Die Preisermittlung würde ich der Einfacheit halber in PHP machen. Dazu brauchst du noch die Ausleihen.

        SELECT * FROM rents WHERE id IN (SELECT rid FROM bills WHERE id = $id)

        Nun iterierst du über alle Ausleihen, zerlegst sie in Zeitspannen entsprechend der Preisbereiche, multiplizierst ein wenig und summierst am Ende. Fertig.

        Kommentar


        • #5
          Hallo onemorenerd...

          nun...
          das ist alles auch nicht so das Problem.
          ich habe ausschließlich ein Problem mit den Berechnungen wenn der Preis zu gewissen Zeitabschnitten unterschiedlich ist.

          ______________________________________________
          Tisch 1 wird angeklickt:
          in Tabelle abr wird die Tischnummer (1), Startzeit und pool eingetragen

          nun starte ich bei Tisch 1 auch noch Tisch 4:
          in Tabelle abr wird die Tischnummer (4), Startzeit und pool eingetragen
          bei Tisch 1 (ID 1) wird der Zusatz 4 eingetragen.
          (Damit beim abrechen erkannt wird das Tisch 4 nur unter der Abrechnung von Tisch 1 zu stoppen ist. Tisch 4 kann jetzt nicht auf der Abrechnungsseite von Tisch 4 gestoppt werden.)

          Alle Tische die von Tisch 1 aus nun geführt werden kann ich jederzeit stoppen und auch so oft ich will.
          Bezahlte Zwischenbeträge werden von der Endabrechnung abgezogen.
          ( kann ja sein das ein Gast schon eher gehen will und seinen Tischanteil schon bezahlt.)

          Bis hierher funktioniert das Programm einwandfrei !!

          ist aber jetzt der Preis zu gewissen Zeitabschnitten unterschiedlich,
          gerate ich an meine Grenzen.

          Lass uns mal die Zusatztische vergessen und nur von einem Tisch ausgehen.

          >>>Beispielberechnung<<<

          Alle Zeiten und Preise werden aus der sql-datenbank abgefragt,


          Tisch 1 läuft von 16:12 ($starttime) Uhr bis 21:33 ($endtime)
          Preis1 = 3,50 € 16:00 ($time_a) bis 18:00 ($time_b) Uhr
          Preis2 = 4,50 € 18:01 ($time_b) bis 20:00 ($time_c) Uhr
          Preis3 = 5,50 € 20:01 ($time_c) bis 2:00 ($time_d) Uhr
          $preis1=3,50/60; // Minutenpreis
          $preis2=4,50/60;
          $preis3=5,50/60;

          if ($startime > $time_a and $startime < $time_b and and $endtime > $time_b and $endtime > $time_c)
          {
          $zeit1 = $time_b - $starttime/60; //Zeit in Minuten
          $zeit2 = $time_c - $time_b / 60;
          $zeit3 = $endtime - $time_c / 60;
          $summe1 = $zeit1*$preis1;
          $summe2 = $zeit2*$preis2;
          $summe3 = $zeit3*$preis3;
          $endsumme = $summe1+$summe2+$summe3;
          }
          echo $endsumme;

          Doch wieviele Möglichkeiten gibt es da??

          Es kommt ja immer wieder zu doppelten Möglichleiten die in den nächsten Abfragen wieder ausgeschlossen werden müssen.

          Also wenn der Tisch nach 18:00 gestartet wird und nach 20:00 gestoppt
          oder vor 18:00 start und vor 20:00 stopp usw.....

          Kommentar


          • #6
            naja den gespielten zeitraum musst du eben zerschneiden und dann mit dem jeweiligen minutenpreis verrechnen.
            Wobei Dein Beispiel irreführen ist denn entweder ist time_b 18:00 oder 18:01

            Ich würde das ganze in ein array packen und dann durch eine Schleife gehen bei der ich prüfe ob die startzeit >= der Anfangszeit eines zeitclusters ist, wenn ja berechne ich die Anzahl der minuten, die meine mietdauer in dem jeweiligen zeitcluster hat und verrechne das mit dem minutenpreis...
            Beantworte nie Threads mit mehr als 15 followups...
            Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

            Kommentar


            • #7
              Original geschrieben von ostems
              nun starte ich bei Tisch 1 auch noch Tisch 4:
              in Tabelle abr wird die Tischnummer (4), Startzeit und pool eingetragen
              bei Tisch 1 (ID 1) wird der Zusatz 4 eingetragen.
              (Damit beim abrechen erkannt wird das Tisch 4 nur unter der Abrechnung von Tisch 1 zu stoppen ist. Tisch 4 kann jetzt nicht auf der Abrechnungsseite von Tisch 4 gestoppt werden.)
              Ich frage mich zwar, wie du Tisch 4 ansehen willst, dass er nicht direkt gestoppt/abgerechnet werden kann. Diese Info steckt nur in Tisch 1. Aber du wirst es ja wissen.

              Doch wieviele Möglichkeiten gibt es da??

              Es kommt ja immer wieder zu doppelten Möglichleiten die in den nächsten Abfragen wieder ausgeschlossen werden müssen.
              Willst du wirklich alle Möglichkeiten hart im Code fixieren? Schau noch mal ins Pflichtenheft ... da steht sicher drin, dass die Preise und Zeiten veränderlich sein sollen und damit ändern sich auch die Möglichkeiten. Kannst du also gar nicht hart kodieren.

              Mein Ansatz wäre wie folgt:
              Sortiere die Preis-Zeitspannen nach ihrer Startzeit.
              Iteriere über diese Liste.
              ... Iteriere über alle Ausleihen.
              ...... Wenn es eine Überdeckung von Ausleihe und Zeitspanne gibt,
              ......... addiere das Produkt von Überdeckung und Preis zur Gesamtsumme.

              Wo klemmts da bei dir? Kannst du die Überdeckung nicht berechnen?

              Kommentar


              • #8
                Original geschrieben von MelloPie
                Wobei Dein Beispiel irreführen ist denn entweder ist time_b 18:00 oder 18:01
                nur ein versehen... die zeiten sind Unterschiedlich benannt.



                Original geschrieben von onemorenerd
                Ich frage mich zwar, wie du Tisch 4 ansehen willst, dass er nicht direkt gestoppt/abgerechnet werden kann. Diese Info steckt nur in Tisch 1. Aber du wirst es ja wissen.
                Ich brauch nicht zu Tisch 4, bzw dort steht auch die startzeit...
                mann bekommt beim versuch den Zusatztisch zu stoppen eine Meldung das es nur unter Tisch 1 möglich ist.
                Dort werden auch die Zeiten angezeigt.

                Original geschrieben von onemorenerd
                Wo klemmts da bei dir? Kannst du die Überdeckung nicht berechnen?
                Die Anzahl der Möglichkeiten der Startzeiten :
                Die Abfragen dürfen ja nicht so geschrieben sein, dass eine weitere Abfrage sich mit den anderen überschneidet also z.B. Möglichkeit 4 hebt Möglichkeit 1 auf... oder so...

                schwer zu schreiben....

                Kommentar


                • #9
                  Original geschrieben von MelloPie


                  Ich würde das ganze in ein array packen und dann durch eine Schleife gehen bei der ich prüfe ob die startzeit >= der Anfangszeit eines zeitclusters ist, wenn ja berechne ich die Anzahl der minuten, die meine mietdauer in dem jeweiligen zeitcluster hat und verrechne das mit dem minutenpreis...

                  ich starre jetzt schon 10 minuten auf diesen Satz...
                  *grübel*

                  $start und $end Abfrage aus der Datenbank...

                  und nu?

                  Stelle ich mich ein wenig Dämlich an oder komm ich nur nicht drauf?

                  hättes Du Lust und Zeit für ein kleines Beispiel?

                  Muss evtl erklären das ich Anfänger bin was das Programmieren angeht.
                  Die Kasse ist mein erstet Objekt. Hat ein Jahr gedauert...

                  Wenn Du magst kannst Du sie dir ansehen. Habe sie Online gestellt .
                  Hier Klicken

                  Kommentar


                  • #10
                    Lösung?

                    Geht das auch kürzer?

                    PHP-Code:
                    include ("inc/opendb.inc.php"); // DB öffen

                    $actDate =date("H:i:s");
                    // Endzeit wird in die Datenbank geschreiben
                    $sql="Update abr SET    zeit2 = '$actDate' WHERE tischnr='$tischnr' ";
                    mysql_query($sql);
                    ////////////////////////////////////////////////////////////////////////////////////////////////////////


                    // Hier wird der Preis für die jeweilige Spielart abgefragt

                    $sql mysql_query("SELECT * FROM config");
                    $preisart mysql_fetch_array($sql);
                    $snooker1 =$preisart['snooker1'];         // Preis je Stunde
                    $snooker2 =$preisart['snooker2'];
                    $snooker3 =$preisart['snooker3'];
                    $pool1 =$preisart['billard1'];
                    $pool2 =$preisart['billard2'];
                    $pool3 =$preisart['billard3'];
                    $karam1 =$preisart['karam1'];
                    $karam2 =$preisart['karam2'];
                    $karam3 =$preisart['karam3'];
                    $internet1 =$preisart['pc1'];
                    $internet2 =$preisart['pc2'];
                    $internet3 =$preisart['pc3'];
                    $time3 =$preisart['zeit1'];           // Erste Zeitansetzung für Preiserhöhung
                    $time4 =$preisart['zeit2'];           // Zweite Zeitansetzung für Preiserhöhung



                    $tischnr=$_GET["tischnr"];
                    include (
                    "inc/opendb.inc.php");
                    // Abfrage der Startzeit, Endzeit, Spielart, anzahl Personen und was schon gezahlt wurde
                    $abfrage mysql_query("SELECT zeit1, zeit2, art, pers, bezahlt FROM abr WHERE tischnr='$tischnr'");
                    $time mysql_fetch_array($abfrage);
                    $time1 $time['zeit1'];            // Startzeit
                    $time2 $time['zeit2'];            // Stoppzeit
                    $bezahlt $time['bezahlt'];        // bereits gezahlter Betrag
                    $pp $time['pers'];                // Teilnehmer durch die der Gesamtbetrag aufgeteilt wird



                    // Nach Tischnummer die Spielart bestimmen  ( wegen Preisunterschied )  ////////////////////////////////

                    if ($tischnr 11)                          // Tisch 1 bis 10  (der Wert 11 wird noch in der Confic-Datei festgelegt
                    {
                    $art "pool";
                    }
                    if (
                    $tischnr 10 and $tischnr 13)        // Tisch 11 bis 12  (die Werte 10 u. 13 werden noch in der Confic-Datei festgelegt
                    {
                    $art "snooker";
                    }
                    if (
                    $tischnr 12)                          // PC 1 (13) bis 2 (14)  (der Wert 12 wird noch in der Confic-Datei festgelegt
                    {
                    $art "pc";
                    }                                           
                    // Die werte für Karambol folgen noch (werden noch nicht benötigt
                    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //  Spielart bestimmen und Berechnungspreis festlegen //////////////////////////////////////////////////////////////////////////
                    if ($art == "pool")
                    {
                    $wert_a $pool1/60;                            // Minutenpreis für Pool in Preiskategorie 1
                    $wert_b $pool2/60;                            // Minutenpreis für Pool in Preiskategorie 2
                    $wert_c $pool3/60;                            // Minutenpreis für Pool in Preiskategorie 3

                    }  else  {

                    if (
                    $art == "snooker")
                    {
                    $wert_a $snooker1/60;                          // Minutenpreis für Snooker in Preiskategorie 1
                    $wert_b $snooker2/60;                          // Minutenpreis für Snooker in Preiskategorie 2
                    $wert_c $snooker3/60;                          // Minutenpreis für Snooker in Preiskategorie 3

                    } else  {

                    if (
                    $art == "karam")
                    {
                    $wert_a $karam1/60;                            // Minutenpreis für Karambol in Preiskategorie 1
                    $wert_b $karam2/60;                            // Minutenpreis für Karambol in Preiskategorie 2
                    $wert_c $karam3/60;                            // Minutenpreis für Karambol in Preiskategorie 3

                    } else  {

                    $wert_a $internet1/60;                         // Minutenpreis für PC-Internet in Preiskategorie 1
                    $wert_b $internet2/60;                         // Minutenpreis für PC-Internet in Preiskategorie 2
                    $wert_c $internet3/60;                         // Minutenpreis für PC-Internet in Preiskategorie 3

                            
                    }
                    }
                            }


                    // aufsplitten der Zeiten  //////////////////////////////////////////////////////////////
                    list($std1$min1) = explode (":"$time1);      // Startzeit
                    list($std3$min3) = explode (":"$time3);      // bis erste Preissteigerung
                    list($std4$min4) = explode (":"$time4);      // bis zweite Preissteigerung
                    list($std2$min2) = explode (":"$time2);      // Endzeit

                    // Wenn vor 00:00 gestartet und nach 00:00 Uhr gesoppt wurde,
                    // ist die Endzeit kleiner als die Startzeit weil mit
                    //dem Zeitformat **** date("H:i:s");  gearbeitet wird
                    $zahl=0;
                    if (
                    $time['zeit1'] >= $time['zeit2'] )           // wenn Endzeit kleiner Startzeit
                                     
                    {
                    $zahl "1440";  }                               // 24 Stunden in Minuten

                    //////////////// Berechnungen der Start und Stoppzeitdifferenzen  /////////////////////////////////////

                    // Berechnung 1 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    // Stopp vor erste Preissteigerung    ****************************************************************
                    if ( $time2 $time3)
                      {
                    $differ2 =  abs ($std2*60 $min2);
                    $differ1 =  abs ($std1*60 $min1);
                    $diffmin abs (($std2*60 $min2) - ($std1*60 $min1))*$wert_a;
                    $lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
                    $lauf $lauf1/60;
                    $summe $diffmin ;
                      }
                    // Berechnung 1 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                    // Berechnung 2 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    // Start und Stopp vor zweite Preissteigerung  ********************************************************
                    if ( $time1 $time4 and $time1 $time3 and $time2 $time4)
                       {
                    $differ1 =  abs ($std1*60 $min1);
                    $differ2 =  abs ($std2*60 $min2);
                    $diffmin abs (($std2*60 $min2) - ($std1*60 $min1))*$wert_b;
                    $lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
                    $lauf $lauf1/60;
                    $summe $diffmin ;
                       }
                    // Berechnung 2 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                    // Berechnung 3 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    // Start und Stopp nach zweite Preissteigerung   ******************************************************
                    if ($time1 "00:00:00" and $time1 "08:00:00" or $time1 $time4)
                       {
                    $differ2 =  abs ($std2*60 $min2);
                    $differ1 =  abs ($std1*60 $min1);
                    $diffmin abs (($std2*60+$zahl $min2) - ($std1*60 $min1))*$wert_c;
                    $lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
                    $lauf $lauf1/60;
                    $summe $diffmin ;
                    }
                    // Berechnung 3 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                    // Berechnung 4 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    // Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
                    if ( $time1 $time3  and $time1 $time4 and $time2 $time4)
                       {
                    $differ2 =  abs ($std2*60 $min2);
                    $differ1 =  abs ($std1*60 $min1);
                    $differ3 =  abs ($std3*60 $min3);
                    $differ4 =  abs ($std4*60 $min4);

                    $diffmin_x abs (($std4*60 $min4) - ($std1*60 $min1))*$wert_b;
                    $diffmin_y abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert_c;
                    $lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
                    $lauf $lauf1/60;
                    $summe $diffmin_x+$diffmin_y ;
                         }
                    // Berechnung 4 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                    // Berechnung 5 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    // Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
                    if ( $time1 $time3  and  $time2 $time4 or $time1 $time3  and  $time2 "08:00:00")
                       {
                    $differ2 =  abs ($std2*60 $min2);
                    $differ1 =  abs ($std1*60 $min1);
                    $differ3 =  abs ($std3*60 $min3);
                    $differ4 =  abs ($std4*60 $min4);

                    $diffmin_x abs (($std3*60 $min3) - ($std1*60 $min1))*$wert_a;
                    $diffmin_y abs (($std4*60 $min4) - ($std3*60 $min3))*$wert_b;
                    $diffmin_z abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert_c;

                    $lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));
                    $lauf $lauf1/60;
                    $summe $diffmin_x+$diffmin_y+$diffmin_z ;
                        }
                    // Berechnung 5 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                    // Berechnung 6 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    // Wenn alle Preis gleich sind wird Preisklasse 3 gewählt
                    if ($time3 == $time4)
                       {
                    //$diffmin = abs (($std2*60 + $min2) - ($std1*60 + $min1))*$wert;
                    $differ2 =  abs ($std2*60 $min2);
                    $differ1 =  abs ($std1*60 $min1);
                    $diffmin abs (($std2*60 $min2) - ($std1*60 $min1))*$wert_c;
                    $lauf1 abs (($std2*60+$zahl $min2) - ($std1*60 $min1));
                    $lauf $lauf1/60;
                    $summe $diffmin ;

                       }
                    // Berechnung fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                    //Ende der Preisberechnung ***************************************************************************


                    //  Noch die Prozente und den bezahlten Betrag abrechnen /////////////////////////////////////////////
                    if ($prozente <> "") { $abzug1 $summe/100;  $abzug=$abzug1*$prozente;
                    $summe $summe-$abzug;
                    }
                    // Endsumme wurde ermittelt //////////////////////////////////////////////////////////////////////////


                    // Der errechnete Preis für die jeweilige Spielart wird in die Datenbbank geschrieben
                    $sql="Update abr SET    spiel = '$summe' WHERE tischnr='$tischnr' ";
                    $r_update=mysql_query($sql);

                    // ende der Berechnung 
                    Steigt da Jemand durch?
                    Zuletzt geändert von ostems; 25.10.2008, 20:39.

                    Kommentar


                    • #11
                      Anscheinend tippt der Programmierer sehr gerne. Vieles ist mehrfach geschrieben, warum auch immer. Vielleicht weils nach "mehr" aussieht.

                      Ich hab mal ein Großteil zusammengefasst und einige Kommentare hinzugefügt. Vieles gibts noch zu tun, aber nicht von mir.

                      PHP-Code:
                      <?php

                      require 'inc/opendb.inc.php';

                      $sql "UPDATE abr SET zeit2 = NOW() WHERE tischnr = '$tischnr'";
                      // NOW() reicht, wenn die Spalte das richtige Datenformat hat (TIME).
                      // Woher kommt eigentlich $tischnr?

                      mysql_query($sql);


                      $sql mysql_query("SELECT * FROM config");
                      $preisart mysql_fetch_array($sql);
                      // Seh ich das richtig, dass in dieser Tabell nur eine einzige Zeile steht?
                      // Wozu dann überhaupt eine eigene Tabelle? Pure verschwendung.

                      // unnötige Variablenzuweisungen hab ich hier rausgenommen.

                      $time3 $preisart['zeit1'];           // Erste Zeitansetzung für Preiserhöhung
                      $time4 $preisart['zeit2'];           // Zweite Zeitansetzung für Preiserhöhung

                      // $time3? $time4? Was sind das für komische Variablennamen? Und wo ist $time1 und $time2?

                      $tischnr $_GET['tischnr'];
                      // Ahh hier ist $tischnr. Sollte das nicht oben sein? Und wo bleibt das mysql_real_escape()
                      // oder der Integer-Cast?

                      // include ('inc/opendb.inc.php');
                      // Moment mal, das hatten wir doch schon mal. Also auskommentiert.

                      // Abfrage der Startzeit, Endzeit, Spielart, anzahl Personen und was schon gezahlt wurde
                      $abfrage mysql_query("SELECT zeit1, zeit2, art, pers, bezahlt FROM abr WHERE tischnr = '$tischnr'");

                      // zeit1 und zeit2 sind natürlich suuuper namen für Startzeit und Endzeit. Da weiß jeder SOFORT
                      // was gemeint ist. Oder? Na immerhin ist es gnädigerweise kommentiert.

                      $time mysql_fetch_array($abfrage);
                      $time1 $time['zeit1'];            // Startzeit
                      $time2 $time['zeit2'];            // Stoppzeit
                      $bezahlt $time['bezahlt'];        // bereits gezahlter Betrag
                      $pp $time['pers'];                // Teilnehmer durch die der Gesamtbetrag aufgeteilt wird

                      // pp? person p.....?


                      // Nach Tischnummer die Spielart bestimmen  ( wegen Preisunterschied )

                      if ($tischnr 11) {                          // Tisch 1 bis 10  (der Wert 11 wird noch in der Confic-Datei festgelegt
                          
                      $art 'billiard';
                      } elseif (
                      $tischnr 10 and $tischnr 13) {  // Tisch 11 bis 12  (die Werte 10 u. 13 werden noch in der Confic-Datei festgelegt
                          
                      $art 'snooker';
                      } elseif (
                      $tischnr 12) {                    // PC 1 (13) bis 2 (14)  (der Wert 12 wird noch in der Confic-Datei festgelegt
                          
                      $art 'pc';
                      }                                             
                      // Die werte für Karambol folgen noch (werden noch nicht benötigt

                      $wert = array();
                      for (
                      $i 1$i <= 3$i++)
                          
                      $wert[$i] = $preisart[$art $i] / 60;

                      // Wieder mal ein Haufen Tipparbeit gespart. Was man mit For-Schleifen und Arrays alles bewirken kann...


                      // aufsplitten der Zeiten
                      for ($i 1$i <= 4$i++) {
                          list(${
                      'std' $i}, ${'min' $i}) = explode(':', ${'time' $i});

                      // Eigentlich sollten das Arrays sein statt lustige durchnummerierte Variablen, aber mir
                      // ist das jetzt zu anstrengend alles zu ändern.

                      // Wenn vor 00:00 gestartet und nach 00:00 Uhr gesoppt wurde,
                      // ist die Endzeit kleiner als die Startzeit weil mit
                      // dem Zeitformat **** date("H:i:s");  gearbeitet wird
                      $zahl=0;
                      if (
                      $time['zeit1'] >= $time['zeit2'] )           // wenn Endzeit kleiner Startzeit
                          
                      $zahl 1440;                                // 24 Stunden in Minuten

                      // Na juhu, die Variable $zahl enthält zu aller erstaunen eine Zahl. Aber welche und wofür?
                      // Das erfahrt man nur, wenn man die Kommentare absucht. Zum Glück sind nicht alle Leute
                      // so einfallsreich bei der Namensgebung, sonst würde ein Großteil der Menschen "Baby"
                      // oder "Kind" heißen.

                      //////////////// Berechnungen der Start und Stoppzeitdifferenzen  /////////////////////////////////////

                      // Die berechneten Variablen $differ1 und $differ2 werden _nirgendwo_ verwendet. Wozu dann berechnen?
                      // Ich lösch sie mal einfach raus.

                      // Berechnung 1 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      // Stopp vor erste Preissteigerung    ****************************************************************

                      // Kuhl. Ich hätte da außer /////, >>>>> und ***** noch ein paar Vorschläge:
                      // ----------------
                      // ################
                      // ::::::::::::::::
                      // ++++++++++++++++
                      // ~~~~~~~~~~~~~~~~
                      // So, Ende der Zeichenstunde.

                      $lauf1 abs (($std2*60 $min2) - ($std1*60 $min1));

                      if ( 
                      $time2 $time3) {
                          
                      $summe abs (($std2*60 $min2) - ($std1*60 $min1))*$wert[1];
                      }
                      // Berechnung 1 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                      // Berechnung 2 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      // Start und Stopp vor zweite Preissteigerung  ********************************************************
                      if ( $time1 $time4 and $time1 $time3 and $time2 $time4) {
                          
                      $summe abs (($std2*60 $min2) - ($std1*60 $min1))*$wert[2];
                      }
                      // Berechnung 2 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                      // Berechnung 3 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      // Start und Stopp nach zweite Preissteigerung   ******************************************************
                      if ($time1 "00:00:00" and $time1 "08:00:00" or $time1 $time4) {
                          
                      $summe abs (($std2*60+$zahl $min2) - ($std1*60 $min1))*$wert[3];
                      }
                      // Berechnung 3 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                      // Berechnung 4 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      // Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
                      if ( $time1 $time3  and $time1 $time4 and $time2 $time4) {
                          
                      $summe  abs (($std4*60 $min4) - ($std1*60 $min1))*$wert_b;
                          
                      $summe += abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert[3];

                      // Berechnung 4 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                      // Berechnung 5 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      // Start nach erste Preissteigerung und Stopp nach zweite Preissteigerung *****************************
                      if ( $time1 $time3  and  $time2 $time4 or $time1 $time3  and  $time2 "08:00:00") {
                          
                      $summe  abs (($std3*60 $min3) - ($std1*60 $min1))*$wert[1];
                          
                      $summe += abs (($std4*60 $min4) - ($std3*60 $min3))*$wert[2];
                          
                      $summe += abs (($std2*60+$zahl $min2) - ($std4*60 $min4))*$wert[3];
                      }
                      // Berechnung 5 fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                      // Berechnung 6 : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      // Wenn alle Preis gleich sind wird Preisklasse 3 gewählt
                      if ($time3 == $time4) {
                          
                      $summe abs (($std2*60 $min2) - ($std1*60 $min1))*$wert[3];
                          
                      $lauf1 abs (($std2*60+$zahl $min2) - ($std1*60 $min1));
                      }
                      // Berechnung fertig <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                      // Ich bin jetzt auch völlig fertig.


                      $lauf $lauf1 60;
                      // Wieder mal so einfallsreiche Variablennamen.


                      //Ende der Preisberechnung ***************************************************************************

                      // Ist die Berechnung jetzt endgültig beendet, oder kommt noch ein Ende?


                      //  Noch die Prozente und den bezahlten Betrag abrechnen /////////////////////////////////////////////
                      if ($prozente != '') {
                          
                      $abzug1 $summe 100;
                          
                      $abzug $abzug1 $prozente;
                          
                      $summe $summe $abzug;
                      }
                      // Endsumme wurde ermittelt //////////////////////////////////////////////////////////////////////////

                      // Wo kommt den $prozente plötzlich her?

                      // Der errechnete Preis für die jeweilige Spielart wird in die Datenbbank geschrieben
                      $sql "UPDATE abr SET spiel = '$summe' WHERE tischnr = '$tischnr'";
                      $r_update mysql_query($sql);

                      // ende der Berechnung

                      // Das war wohl das letzte Ende. Oder?

                      ?>
                      Zuletzt geändert von h3ll; 25.10.2008, 22:24.

                      Kommentar


                      • #12
                        Hall0 h3ll...

                        zunächst einmal danke für das Beispiel es als array zu schreiben

                        Anscheinend tippt der Programmierer sehr gerne. Vieles ist mehrfach geschrieben, warum auch immer.
                        Hatte ich nicht geschrieben das ich noch Anfänger bin??

                        $time3? $time4? Was sind das für komische Variablennamen?
                        Und wo ist $time1 und $time2?
                        $time3 und 4 sind für mich variablen die ich wiedererkenne!
                        und was soll die frage, wo $time1 u. 2 sind?
                        stehen doch drin!

                        // unnötige Variablenzuweisungen hab ich hier rausgenommen.
                        hätte nicht gedacht das dafür nur eine variable reicht.
                        Dachte es müssen alle werte mit rangezogen werden...
                        schönes ding...

                        // Ahh hier ist $tischnr. Sollte das nicht oben sein?
                        Und wo bleibt das mysql_real_escape()
                        Im Originalscript ist oben noch einiges mehr drin. u.a. auch die $prozente=$POST["prozente"];
                        Es geht mir nur um die Berechnung des hier aufgeführten

                        Die Zeichenstunde habe ich auch nur hier,
                        weil ich dachte es wäre besser zu erkennen was alles berechnet werde muss.
                        ich fand es dann eher Überschaubar.

                        // Na juhu, die Variable $zahl enthält zu aller erstaunen eine Zahl. Aber welche und wofür?
                        Bitte ein Beispiel die erkennen läßt worum es sich handelt!
                        ich nehme alle Tips gerne an.

                        und wie berechne ich die differenz der startzeit und endzeit wenn die endzeit kleiner ist als die startzeit.


                        Aber ziehe das ganze bitte nicht mehr in Lächerliche.
                        Damit ist mir nicht geholfen.
                        Ich brauche Hilfe, habe venünftig darum gebeten und Besserwisserei kann ich nicht gebrauchen.
                        Danke

                        Das Du etwas davon verstehst, das merke ich schon...

                        Ach ja... differ1 sowie differ2 hatte ich vergessen zu löschen... die waren vorher von belang aber nun wie du ja auch bemerkt hast, nicht mehr nötig.

                        Zudem ist das mit der von Dir geschriebenen Variable
                        auch nur um die Art zu ermitteln und um die Zeit zu splitten...
                        Die Berechnung, um die hier geht hast du völlig außen vor gelassen...


                        um es nocheinmal auf den Punkt zu bringen...

                        $time1 ist die startzeit
                        $time3 ist die erste zeit wo auch der preis das erste mal steigt (18:00)
                        $time4 ist die zweite zeit wo auch der preis das zweite mal steigt (20:00)
                        $time2 ist die gestoppte endzeit


                        gehen wir davon aus das die

                        Möglichkeit 1:
                        startzeit vor 18:00 ist
                        und die endzeit vor 18:00 Uhr

                        Möglichkeit 2:
                        startzeit nach 18:00 ist
                        und die endzeit vor 20:00 Uhr

                        Möglichkeit 3:
                        startzeit nach 20:00 ist
                        und die endzeit nach 20:00 Uhr oder auch nach 0:00 Uhr

                        Möglichkeit 4:
                        startzeit vor 18:00 ist
                        und die endzeit vor 20:00 Uhr

                        Möglichkeit 5:
                        startzeit vor 18:00 ist
                        und die endzeit nach 20:00 Uhr oder auch nach 0:00 Uhr

                        Möglichkeit 6:
                        startzeit vor 20:00 ist
                        und die endzeit nach 20:00 Uhr oder auch nach 0:00 Uhr

                        noch was vergessen?


                        egal ob nun billard, snooker oder pc.
                        bitte denke aber daran, das zeitformat ist $actDate =date("H:i:s");
                        Zuletzt geändert von ostems; 26.10.2008, 01:11.

                        Kommentar


                        • #13
                          $time1 ist die startzeit
                          Und warum heißt sie dann nicht zB. $start_time statt $time1?

                          $time2 ist die gestoppte endzeit
                          Wie wärs mit $end_time?


                          Im folgenden Beispiel nehme ich übrigens an, dass in $prices alle Preise nach Startzeit chronologisch
                          angeführt sind. Ganz oben der Standardpreis, wenn man so will.

                          PHP-Code:
                          <?php

                          function time_to_hours($time) {
                              list(
                          $h$m$s) = explode(':'$time);
                              return 
                          $h $m 60 $s 3600;
                          }


                          // Das sind Beispielwerte. 'value' ist der Preis pro Stunde,
                          // 'time' ist die Uhrzeit, ab wann der Preis gilt.

                          $prices = array(
                              array(
                          'value' => 10.0'time' => '00:00:00'),
                              array(
                          'value' => 15.0'time' => '18:00:00'),
                              array(
                          'value' => 20.0'time' => '22:00:00')
                          );

                          $start_time time_to_hours('17:30:00');
                          $end_time time_to_hours('01:00:00');
                          if (
                          $end_time $start_time)
                              
                          $end_time += 24.0;

                          $sum 0.0;

                          for (
                          $i_cnt 0$i_max count($prices) - 1$i_cnt <= $i_max$i_cnt++) {
                              
                          $current_time time_to_hours($prices[$i_cnt]['time']);
                              
                          $next_time $i_max $i_cnt time_to_hours($prices[$i_cnt 1]['time']) : 48.0;

                              if (
                          $start_time $next_time && $end_time >= $current_time) {
                                  
                          $diff_time  $end_time $next_time $end_time $next_time;
                                  
                          $diff_time -= $start_time $current_time $start_time $current_time;

                                  
                          $sum += $prices[$i_cnt]['value'] * $diff_time;
                              }
                          }

                          echo 
                          $sum;
                          // 125

                          ?>
                          Zuletzt geändert von h3ll; 26.10.2008, 03:14.

                          Kommentar


                          • #14
                            Ich wusste das du mehr kannst als mich nur mekern...

                            Danke Danke... das ist prächtig und ich bin mehr als begeistert...
                            meine kenntnisse reichen für solche sachen halt noch nicht aus...

                            doch ein problem gibt es immer noch *duck*


                            $prices = array(
                            array('value' => 5.50, 'time' => '00:00:00'),
                            array('value' => 3.50, 'time' => '08:00:00'), // hab ich noch dazwischen gesetzt
                            array('value' => 4.50, 'time' => '18:00:00'),
                            array('value' => 5.50, 'time' => '20:00:00')
                            );

                            $start_time = time_to_hours($time1); mit meinen Variablen bestückt
                            $end_time = time_to_hours($time2);

                            funktioniert super

                            doch in dieser form nicht:

                            $time3 = "18:00:00"; // sind aus der Datenbank
                            $time4 = "20:00:00";
                            $time5 = "00:00:00";
                            $time6 = "08:00:00";
                            $wert_a ="3.50"; // sind aus der Datenbank
                            $wert_b ="4.50";
                            $wert_c ="5.50";

                            $prices = array(
                            array('value' => $wert_c, 'time' => $time5),
                            array('value' => $wert_a, 'time' => $time6),
                            array('value' => $wert_b, 'time' => $time3),
                            array('value' => $wert_c, 'time' => $time4)
                            );
                            $start_time = time_to_hours($time1); mit meinen Variablen bestückt
                            $end_time = time_to_hours($time2);

                            Was mag das script daran nicht?
                            habe mit array´s noch nicht so meine erfahrungen.

                            Kommentar


                            • #15
                              Original geschrieben von ostems
                              Was mag das script daran nicht?
                              habe mit array´s noch nicht so meine erfahrungen.
                              Debuggen. Lass dir alle Variablen ausgeben und überprüfe, welche nicht stimmen können. Arrays kannst du mit print_r() ausgeben.

                              Kommentar

                              Lädt...
                              X