tobmes
Goto Top

Kleines Lagerprogramm coden

HI Experten,

ich bin gerade dabei mir aus interesse mal PHP und Javascritp anzuschauen. Ich habe jetzt schon einiges (auch dank dieses Forums hinbekommen). Hier mal mein Problem. Ich habe eine Eingabemaske erstellt. In dieser Maske kann ich einen Artikel auswählen und einen Lagerort, beide werden per Dropdown-Menü ausgewählt (beide beziehen ihre Daten aus einer MySQL Tabelle). Es gibt dann noch ein Eingabefeld in welches man eine Menge eingeben kann. Mit einem Klick auf den Speichern Button wird alles in die Datenbank geschrieben. Soweit so Gut.

Jetzt habe ich mir gedacht, das es ja nicht schlecht wäre, wenn man dort auch den Bestand des Artikels ändern kann. Ich habe mir dazu "einfach" gedacht, das man ja nur prüfen muss, ob der Eintrag (bestimmter Artikel an bestimmten Lagerort) schon existriert, ist das der Fall, dann wird nur der Bestand geändert, existiert der Eintrag nicht, dann wird er erstellt.

Dazu wolte ich das ON DUPLICATE KEY UPDATE verwenden. Doof ist jetzt nur, das mein Primärschlüssel eine ID ist und das dort ja nur nach dem Primärschlüssel gesucht wird. Würde Artikel A an Lagerort A1 und ich wollte jetzt diesen Artikel auch nochmal an Lagerort B1 lagern, dann würde das ja garnicht gehen.

Jetzt meine Frage, gibt es da einen guten Workaround für dieses Problem?

Hier auch mal die involvierten Codeschnipsel. BIn auch offen für sonstige Verbesserungsvorschläge.

protected function storeData($artikel, $menge, $lagerort, $kommentar)
    {
        //$sql = "INSERT INTO testLager(artikel,menge,lagerort,kommentar) VALUES('$artikel','$menge','$lagerort','$kommentar');"; 
        $sql = "INSERT INTO testLager(artikel,menge,lagerort,kommentar) VALUES ('$artikel','$menge','$lagerort','$kommentar')  
        ON DUPLICATE KEY UPDATE menge=menge+'$menge', kommentar='$kommentar';";   
        if (!$sql) {
            throw new Exception('Fehler bei Speichern in Datenbank'.$sql);  
        }
        mysqli_query($this->db, $sql);


    }

Hier wird das Dropdown für den Lagerort befüllt
protected function getViewData()
    {
        $sql = 'SELECT lagerort FROM lagerort ORDER BY lagerort;';  
        $recordset = $this->db->query($sql);
        if (!$recordset) {
            throw new Exception('Fehler bei der Datenbank Abfrage'.$sql);  
        }
        $lagerortArray = array();
        $i = 0;
        while ($lagerort = $recordset->fetch_assoc()) {
            $lagerortArray[$i] = $lagerort['lagerort'];  
            ++$i;
        }
        $recordset->free();

        return $lagerortArray;
    }

Hier wird das Dropdown für den Artikel befüllt
protected function getArticleData()
    {
        $sql = 'SELECT material FROM material ORDER BY material;';  
        $recordset = $this->db->query($sql);
        if (!$recordset) {
            throw new Exception('Fehler bei der Datenbank Abfrage'.$sql);  
        }
        $itemArray = array();
        $i = 0;
        while ($item = $recordset->fetch_assoc()) {
            $itemArray[$i] = $item['material'];  
            ++$i;
        }
        $recordset->free();

        return $itemArray;
    }

Hier wird die HTML-Seite gebaut
protected function generateView()
    {
        $lagerort = $this->getViewData();
        $item = $this->getArticleData();
        $this->generatePageHeader('Lager');  
        $this->generateMenu();

        echo <<< showHTML
  <h1> Drumcafe Lager </h1>
  <small>Mit * gekennzeichnete Felder sind Pflicht</small>
  <form method="POST" action="lager.php" onsubmit="return checkIsSet();">  
  <label class="mobile">  
  Artikel*<br/>
  <!--<input type="text" name="artikel"/>--> 
  <select name="artikel" size="1">  
  <option value="1" selected>Auswählen ...</option>  
showHTML;
        foreach ($item as $key => $value) {
            $value = htmlspecialchars($value);
            echo <<< showHTML
    <option>$value</option>
showHTML;
        }
        echo <<< showHTML
  </select>
  </label>
  <label class="mobile">  
  Menge*<br/>
  <input type="text" name="menge" size="10"/>  
  </label>
  <label class="mobile">  
  Lagerort*<br/>
  <!--<input type="text" name="lagerort"/>--> 
  <select name="lagerort" size="1">  
  <option value="1" selected>Auswählen ...</option>  
showHTML;
        foreach ($lagerort as $key => $value) {
            $value = htmlspecialchars($value);
            echo <<< showHTML

            <option>$value</option>
showHTML;
        }
        echo <<< showHTML
  </select>
  </label>
  <label class="mobile">  
  Kommentar<br/>
  <input type="text" name="kommentar"/>  
  </label>
  <!--<input type="submit" class="submit submit1" name="speichern" value="einlagern"/>--> 
  <button type="submit" class="submit submit1" name="speichern">einlagern</button>  
  <button type="submit" class="submit submit2" name="auslagern">Auslagern</button>  
  <!--<input type="submit" class="submit submit2" name="auslagern" value="auslagern"/>--> 
  </form>
showHTML;
        $this->showStockData();
        $this->generatePageFooter();
    }

Danke euch schon mal für die Hilfe

Content-ID: 310375

Url: https://administrator.de/contentid/310375

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

wiesi200
wiesi200 20.07.2016 um 18:10:21 Uhr
Goto Top
Hallo,

Mal so als kleiner Gedanken Anreiz.
Ich kenn das mit Lagerbeständen eher so das man eine Tabelle mit Buchungsposten hat. Sprich alle zu und Abgänge und summiert das dann für den Lagerbestand auf.
Somit hast du auch gleich eine Saubere Historie.
tobmes
tobmes 20.07.2016 um 18:34:28 Uhr
Goto Top
Hi wiesi200,
Danke für deine schnelle Antwort. Klingt nach einer guten Idee. Ich stehe da gerade nur irgendwie auf dem Schlauch. Man würde also nochmal eine extra Tabelle generieren? Da stopfe ich dann als fremd-schlüssel den priämar-schlüssel von lagerort und artikel rein? Wie Rechne ich dort dann? Könntest du mir evtl. ein kleines Beispiel zur Verfügung stellen?

Gruß
tobmes
wiesi200
wiesi200 20.07.2016 aktualisiert um 19:17:36 Uhr
Goto Top
Also im Endeffekt reden wir aktuell von 3 Tabellen

Artikel
Artikelnummer als Primärschlüssel
Beschreibung und was du sonst noch alles drinnen stehen haben willst.

Lagerort
Lagerort Code als Primärschlüssel

Artikelposten
Laufende Nummer als Primärschlüssel
Artikelnummer
Lagerortcode
Menge
Datum / Uhrzeit
Benutzer
eftl Vorgangsnummer und was du sonst noch erfassen willst

Bei jeder Artikelbewegung erstellst du einen neuen Posten der die Artikelbewegung ins Plus oder Minus dokumentiert.

Das sollte dir dann bei der Artikelabfrage helfen
http://stackoverflow.com/questions/15040414/select-sum-and-inner-join

Fall's es noch Probleme kann ich noch nach einem konkreteren Beispiel schauen.


Das Ganze ist natürlich noch ausbaufähig.

Edit: Bei den Buchungen solltest du dann auch noch gleich kontrollieren ob einen negativen Lagerbestand erzeugst und das verhindern.