SQL,如果满足条件 - 更新,如果不满足,从 DB

时间:2021-03-22 21:16:13

标签: mysql sql excel vba adodb

我正在尝试为 Prestashop 创建一个 excel 存储管理界面,我想避免订单超过库存数量。

我想实现这一点:当我在 excel 中创建 100 件订单时,我会将查询发送到数据库并从可用数量中减去这个数字。如果数量少于订单,则返回当前数量,我可以在 VBA 中进行处理。

如果我发送 2 个查询,这将是可能的,首先检查数量是否 > 订单,然后运行更新,但是该产品可能会从不同的接口发生一些订单,并且数量可能会在 2 个查询之间发生变化.

我正在寻找如何实现这一点的一般建议或 VBA 代码或 SQL 查询中的特定升级/更改。

  • 有没有办法在一个查询中做到这一点?
  • 如果没有,我如何在 SQL SELECT 和后续 UPDATE 之间锁定此数据库列?

我当前的查询 (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

0 个答案:

没有答案