【问题标题】:Subtract inventory from multiple lots从多个批次中减去库存
【发布时间】:2022-01-22 20:27:05
【问题描述】:

我在这里查看了很多帖子,但找不到解决我的问题的方法。我正在尝试为一家小商店开发不同批次的相同产品的库存跟踪。我正在为数据库使用 PHP 和 MySQL。我尝试了以下帖子中的信息但没有成功:

How to minus from several MySQL fields a certain value?

Keep subtracting value in loop getting mysql result php

PHP with Loop Calculation

Keep the remaining value after subtract in php while loop

还有一些其他的,但我没有打开它们,但它们都有相同的想法。这是一家小型家庭经营的商店,我们正在使用 PHPRunner 来开发跟踪。我有下表:

库存:

id product lot produced sold remaining
1 ABC 20 165 0 165
2 ABC 29 290 0 290
3 def 37 320 0 320
4 ABC 63 145 0 145
5 xyz 77 900 0 900

现在,当有人订购 500 件产品 ABC 时,我需要遍历表并从行中减去 500,因此需要更新受影响的每一行的代码

id product lot produced sold remaining
1 ABC 20 165 165 0
2 ABC 29 290 290 0
3 def 37 320 0 320
4 ABC 63 145 45 100
5 xyz 77 900 0 900

销售量(已售出)将来自一个表格,其中产品编号与金额一起选择。上周我一直在绞尽脑汁,尝试了很多方法来让它发挥作用,但无济于事。当我需要它时,循环遍历产品 ABC 的每一行,从每一行中减去最大金额,直到销售量为零,然后用每批的销售量和剩余金额更新每一行。

谢谢

【问题讨论】:

  • 我有以下 3 张桌子 - 你只给我们看了一张?
  • 我很抱歉。打字的时候宝宝醒了。其他 2 个表用于记录销售和单个交易。我可以获得其他 2 个正常工作所需的数据,但我无法创建一个数组并使用该数组从每一行中减去,直到销售额为零。
  • 欢迎,为了改善您在 SO 上的体验,请take the tour 并阅读how to askOn Topic question,然后查看Question Check listperfect question 以及如何创建@987654332 @
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: php mysql phprunner


【解决方案1】:

这是一个关于如何分配库存的非常简单的示例。显然,您将更新表格行,而不仅仅是一个数组。

<?php

function dump($var) { echo '<code><pre>' . print_r($var, true) . '</pre></code>'; }

// query for inventory for product ABC
$inventory = [
    ['id' => 1, 'product' => 'ABC', 'lot' => 20, 'produced' => 165, 'sold' => 0, 'remaining' => 165],
    ['id' => 2, 'product' => 'ABC', 'lot' => 29, 'produced' => 290, 'sold' => 0, 'remaining' => 290],
    ['id' => 4, 'product' => 'ABC', 'lot' => 63, 'produced' => 145, 'sold' => 0, 'remaining' => 145]
];

dump($inventory);

$num_to_allocate = 500;

// iterate over inventory and allocate
foreach ($inventory AS &$lot) {

    // check to see if there is enough to satisfy order amount
    if ($lot['remaining'] >= $num_to_allocate) {
        $lot['sold'] = $lot['sold'] + $num_to_allocate;
        $lot['remaining'] = $lot['remaining'] - $num_to_allocate;
        $num_to_allocate = 0;
    } else {
        // allocate everything available
        $num_to_allocate = $num_to_allocate - $lot['remaining'];
        $lot['sold'] = $lot['produced'];
        $lot['remaining'] = 0;
    }
    $sql = "UPDATE inventory SET sold = {$lot['sold']}, remaining = {$lot['remaining']} WHERE id = {$lot['id']}"; echo $sql . "\n\n";
    dump($inventory);

    // we have already allocated required stock so no need to continue
    if ($num_to_allocate === 0) {
        break;
    }
}

此过程以及已售和剩余摘要的存储是多余的,因为实时查询库存头寸是微不足道的。实时股票头寸始终可用 -

/* This is a very simplistic example but hopefully you get the point */
WITH inventory (id, product, lot, produced) AS (
    SELECT 1, 'ABC', 20, 165 UNION ALL
    SELECT 2, 'ABC', 29, 290 UNION ALL
    SELECT 3, 'def', 37, 320 UNION ALL
    SELECT 4, 'ABC', 63, 145 UNION ALL
    SELECT 5, 'xyz', 77, 900
), order_line_items (order_id, product, quantity) AS (
    SELECT 1, 'ABC', 500
)
SELECT (SELECT SUM(produced) FROM inventory WHERE product = 'ABC') - (SELECT SUM(quantity) FROM order_line_items WHERE product = 'ABC');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多