我正在尝试为 Prestashop 创建一个 excel 存储管理界面,我想避免订单超过库存数量。
我想实现这一点:当我在 excel 中创建 100 件订单时,我会将查询发送到数据库并从可用数量中减去这个数字。如果数量少于订单,则返回当前数量,我可以在 VBA 中进行处理。
如果我发送 2 个查询,这将是可能的,首先检查数量是否 > 订单,然后运行更新,但是该产品可能会从不同的接口发生一些订单,并且数量可能会在 2 个查询之间发生变化.
我正在寻找如何实现这一点的一般建议或 VBA 代码或 SQL 查询中的特定升级/更改。
我当前的查询 (SQL_Update):
UPDATE ps_stock_available
SET quantity =
CASE
WHEN id_product IN (SELECT id_product from ps_product
WHERE reference=?)
THEN quantity -?
WHEN id_product IN (SELECT id_product from ps_product
WHERE reference=?)
THEN quantity -?
END
WHERE
id_product IN (SELECT id_product from ps_product
WHERE reference IN ( ?,?))
此查询将在 VBA 中生成,然后发送到服务器,以便查询可能包含更多项目(存储在 CPL_arr 中)。我正在执行这样的查询:
With Cm
.ActiveConnection = conn
.CommandText = SQL_Update
.CommandType = adCmdText
'### fill 1st part of the SQL query (reference and quantity) ###
For i = 1 To CPL_arr_size
.Parameters.Append .CreateParameter("prm", adVarChar, adParamInput, 255, CPL_arr(i, 1))
.Parameters.Append .CreateParameter("prm", adVarChar, adParamInput, 255, CPL_arr(i, 2))
Next i
'### fill 2nd part of the SQL query (reference)
For i = 1 To CPL_arr_size
.Parameters.Append .CreateParameter("prm", adVarChar, adParamInput, 255, CPL_arr(i, 1))
Next i
.Execute
End With
编辑:
参考基本上是产品代码
CPL_arr 是从 Excel 文件中的一列填充的。 CPL_arr_size 是该列中填充的行数。
GET_CPL_arr_size = wsDodat.Range(Cells(firstRow, 8), Cells(lastRow, 8)).Cells.SpecialCells(xlCellTypeConstants).Count
此数组包含引用和订购的商品数量(例如:CPL_arr(VP16A,10))
For i = firstRow To lastRow
If (wsDodat.Cells(i, 1) <> vbNullString) And (wsDodat.Cells(i, 8) <> vbNullString) Then
j = j + 1
temp_CPL_arr(j, 1) = wsDodat.Cells(i, 1).Value
temp_CPL_arr(j, 2) = wsDodat.Cells(i, 8).Value
End If
If j = CPL_arr_size Then
i = lastRow
End If
Next i
编辑 2:
我想我已经弄清楚了 SQL 部分(只有 1 个产品的概念),thx @Parfait 用于存储过程的草稿,老实说,我不知道为什么 SELECT 部分仅在订单大于数量,但它可以工作。现在我还需要弄清楚如何将存储过程的返回值保存到excel中的变量中。
PROCEDURE `Test`(
IN `Order` INT)
BEGIN
UPDATE ps_stock_available
SET quantity =
case
when id_product IN (SELECT id_product from ps_product WHERE reference='VP16A') AND (quantity > Order) then quantity-Order
END
WHERE id_product IN (SELECT id_product from ps_product WHERE reference IN ('VP16A'));
SELECT ps_stock_available.quantity
FROM ps_product
INNER JOIN ps_stock_available ON ps_product.id_product =ps_stock_available.id_product
WHERE (ps_product.reference='VP16A') AND (ps_stock_available.quantity < 10000);
END