2017-04-16 14 views
0

私は、テーブルは次のようになります:更新次の行更新された行の現在の場合は0

HarvestID | CheckIn | Actual | Status 
1   | Date | 100 | Process 
2   | Date | 200 | Process 
3   | Date | 400 | Process 

と私の問題は、私はその後、更新ID「1」を数量=「350」に設定した場合、次の行を更新する方法であります& '2'から0、ID '3' Qty = '350'

これは、 'A' Qtyの合計とストアドプロシージャを使用して新しいテーブルを作成せずにこれを行う方法ですか?

すでに私は何をしようとすると、次のとおりです。

cmdTemp = New MySqlCommand("SELECT * FROM tb_harvest ORDER BY CheckIn ASC LIMIT 1", cn) 
    sqlrd = cmdTemp.ExecuteReader 
    While sqlrd.Read 
     harvestid = sqlrd("HarvestID") 
     qtyTemp1 = sqlrd("Actual") - Qty : qtyTemp2 = sqlrd("Actual") 
    End While 
    sqlrd.Close() 
    If qtyTemp1 < 0 Then 
     cmdTemp = New MySqlCommand("UPDATE tb_harvest SET Actual=0 WHERE HarvestID=" & harvestid & "; " & _ 
            "UPDATE tb_harvest SET Actual=Actual+" & qtyTemp1 & " WHERE HarvestID=" & harvestid + 1, cn) 
     cmdTemp.ExecuteNonQuery() 
    Else 
     cmdTemp = New MySqlCommand("UPDATE tb_harvest SET Actual=Actual-" & qtyTemp2 & " WHERE HarvestID=" & harvestid, cn) 
     cmdTemp.ExecuteNonQuery() 
    End If 

答えて

0

あなたは変数でこれを行うことができます。

set @qty = 350; 

update tb_harvest 
    set actual = (case when @qty <= 0 then 0 
         when @qty >= actual 
         then if(@qty := @qty - actual, 0, 0) 
         when (@tmp := actual - @qty), 
         then if(@qty := 0, @tmp, @tmp) 
         else actual -- should never happen 
        end) 
    order by harvestid; 
+0

このコードは大きな感謝を仕事です! @GordonLinoff VB.netでそれを使用しようとすると、qtyまたはtmpが定義されていないと言うエラーが返され、その解決方法 – Shiroze

関連する問題