It's not clear exactly what adodc1 is, but it looks like you have the dataset open as adodc1.Recordset and you are updating the record using another connection (con). Causing a record locking/concurrency issue.
If you are using adodc1.Recordset.Update, I have to assume that this recordset is updateable. In which case, do not use the separate connection, simply update the recordset which probably looks like:
Adodc1.Recordset.Filter = "ID = '" & IDval.Text & "'"
If Adodc1.Recordset.EOF Then
msgbox "Product ID " & IDval.Text & " not found"
Else
Adodc1.Recordset("QTY") = Adodc1.Recordset("QTY")-1
Adodc1.Recordset.Update
End If
Notes:
What happens if the IDval control is blank (syntax error on the filter)?
If ID is a number remove the single quote delimiters and use the Val() function (this deals with a blank control as it would then return zero [assuming that zero is not valid!])
If the above code does not work with your Adodc1 object, you will need to provide me the exact class (I have assumed that the Recordset member is an ADO recordset).