2016-03-24 3 views
0

Я не знаю, если проектирование базы данных является неправильным или мой подход к проблеме неправильно, но я работаю в инвентаризации/отгрузок PHP/MySQL программного обеспеченияMYSQL дизайн управление запасами

Допустим, у меня есть это стол для моего инвентаря

| auto_inc | id_pro | name | qty | unit_price | 
|   |  |   |  |   | 
| 1  | PA1 | Paper | 10 | 100  | 
| 2  | PA1 | Paper | 10 | 200  | 
| 3  | FO1 | Folder | 6 | 300  | 
| 4  | FO1 | Folder | 6 | 400  | 

и позволяет сказать, что у меня есть эта таблица для поставок

| auto_inc | where_to | id_pro | name | qty | cost | 
|   |   |  |   |  |   | 
| 1  | RGUA | CF1 | Paper | 12 | ???  | 
| 2  | SANV | PA1 | Folder | 7 | ???  | 

ПРОБЛЕМА:

1.- если мне нужно отправить 12 статей, как обновить первую строку до 0 и вторую строку до 8 в таблице инвентаря.

2.- Стоимость первого ряда в таблице отправлений должна быть 1400, как я могу получить этот номер для его хранения.

Я пытался реализовать метод ФИФО здесь, но я не знаю, как это сделать

ответ

1

Решение:

<?php 
    $username = "root"; 
    $password = ""; 
    $hostname = "localhost"; 
    $db = "inventory_db"; 

    //connection to the database 
    $mysqli = mysqli_connect($hostname, $username, $password, $db); 

    //Input variables 
    $code = "PA1"; 
    $name = "Paper"; 
    $qtyreq = 12; 
    $where_to = "ABCD"; 
    //Output variables 
    $totalcost = 0; 
    $qtyout = 0; 

    if ($result = $mysqli->query("SELECT `auto_inc`, `id_pro`, `name`, `qty`, `unit_price` FROM `inventory` where `id_pro` = '$code' order by unit_price asc")) 
    { 
     while ($row = mysqli_fetch_assoc($result)) 
     { 
      if($qtyreq > 0) 
      { 
       $batchout = 0; 
       $rem = max($row['qty']-$qtyreq,0); 
       if($rem == 0) 
        $batchout = $row['qty']; //This means there are no items of this cost remaining 
       else 
        $batchout = $qtyreq; //This means there are items remaining and therefore our next loop (within the while) will check for the next expensive item 

       $totalcost += ($batchout * $row['unit_price']); 
       $qtyreq -= $batchout; 
       $qtyout += $batchout; 
       $sql = "Update inventory set qty = (qty - $batchout) where auto_inc = ".$row["auto_inc"]; 
       echo $sql."</br>"; 
       $mysqli->query($sql); 
      } 
     } 
     $sql = "Insert into shipments (`where_to`, `id_pro`, `name`, `qty`, `cost`) values ('$where_to','$code','$name',$qtyout,$totalcost)"; 
     echo $sql; 
     $mysqli->query($sql); 
     $result->free(); 
    } 

    $mysqli->close(); 
?> 
+0

спасибо, я собираюсь дать ему попробовать! – anguswild

+1

С удовольствием, дайте мне знать, если у вас есть вопросы. –

+0

он отлично работает! У меня еще два вопроса, если все в порядке. Как я могу это сделать, если я хочу отправить более одного продукта, я думаю, что мне нужно будет добавить shipment_id для группировки груза, но я не знаю, как это сделать. с этой структурой можно отменить отгрузку и вернуть товар в инвентарь, или мне нужно изменить подход ?. – anguswild

1

Ваши проблемы просто решить, с запросов обновления, но я думаю, что нет ответа на ваш вопрос.

UPDATE inventory SET qty = 0 WHERE auto_inc = 1; 
UPDATE inventory SET qty = 8 WHERE auto_inc = 2; 
UPDATE shipments SET cost = 1400 WHERE auto_inc = 1; 

Если вы пишете это на PHP, вам нужно создать некоторые функции.

Чтобы определить цену, исходя из количества на складе. Заказывайте по цене за единицу, чтобы сначала получить самых дешевых (если это то, что вы хотите в своей бизнес-логике). Если вам не хватает на складе тех, у кого самая дешевая цена, найдите следующий. Храните те, которые вы отправляете.

Затем уточните цену в строке поставки с вычисленным.

Затем обновите запас в инвентаре.

Но если вы пишете немного более сложную систему, что, например, если отгрузка отменена? Если вы хотите вернуть отмененную отгрузку на складе, вам нужно работать с уникальным идентификатором для каждого продукта, а не с общим, например, «PA1». Если у вас есть уникальный идентификатор, вы можете поместить их обратно в свой инвентарь.

на основе бизнес-логики, это может быть довольно сложной системой :-)

+0

спасибо за входами, это действительно сложно для меня: S – anguswild

Смежные вопросы