在数据库中插入数据时,我试图进行验证。我的datagridview = dgvAddMRR上有一个combobox = cbox_status,一个qtyorder列和qtyreceived列。我正在尝试做的是,当cbox_status =接收到-缺少并且qtyorder列上的所有行= qtyreceived列上的所有行时,它应该通知将cbox_status更改为Received-Complete。但是,当cbox_status =已接收-已完成且qtyorder列上的某行= qtyreceived列上的某行而qtyorder列上的某行!=已接收qty列上的某行时,它应通知我将cbox_status更改为Received-Lacking。我在我的代码上的问题是,即使cbox_status = Received-完成,某些行qtyorder = qtyreceived和某些行qtyorder!= qtyreceived,它也会继续在数据库中插入数据,这是错误的,因为它应该通知我将cbox_status更改为Received - 不足。希望你能理解我的问题。请帮助我。
这是我的代码。 。
Private Sub btn_done_Click(sender As Object, e As EventArgs) Handles btn_done.Click
If tb_mrrno.Text = "" Or tb_pono.Text = "" Or tb_requestedby.Text = "" Or tb_intendedfor.Text = "" Or tb_purpose.Text = "" Or tb_suppliers.Text = "" Or tb_supplierdrno.Text = "" Or cbox_status.Text = "" Or dgvAddMRR.RowCount = 0 Then
MsgBox("Please fill all necessary fields including selecting an Item.", MessageBoxIcon.Exclamation)
Else
For Each row As DataGridViewRow In dgvAddMRR.Rows
Dim qtyorder As Double = row.Cells("qtyorder").Value.ToString
Dim qtyreceived As Double = row.Cells("qtyreceived").Value.ToString
Dim balance As Double = row.Cells("balance").Value.ToString
If qtyorder.ToString > qtyreceived.ToString And cbox_status.Text = "Received - Complete" Then
MsgBox("On Status, please select Received - Lacking to proceed.", MessageBoxIcon.Exclamation)
ElseIf (cbox_status.Text = "Received - Lacking") And (qtyorder.ToString = qtyreceived.ToString) Then
MsgBox("On Status, please select Received - Complete to proceed.", MessageBoxIcon.Exclamation)
End If
If qtyorder.ToString > qtyreceived.ToString And cbox_status.Text = "Received - Lacking" Then
InsertMRR_newave()
End If
If (cbox_status.Text = "Received - Complete") And (qtyorder.ToString = qtyreceived.ToString) Then
InsertMRR_newave()
End If
Next
End If
End Sub
答案 0 :(得分:0)
我认为问题可能在于使用>比较字符串。尝试另一种选择,也许是研究StrComp(https://www.educba.com/vba-string-comparison/)或InStr。
下面的链接是Microsoft对字符串如何与=,>,<运算符进行比较的说明。 https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/operators-and-expressions/comparison-operators
与>一起使用时,使用>可获得有趣的结果。 假设这些值已声明或转换为字符串...
“ 73” <“ 9”
'先前比较的结果为True。
希望这可以将您指向正确的位置。
答案 1 :(得分:0)
将第一个If语句中的每个Or更改为OrElse,因为它会在遇到True条件时立即短路该行,而不是评估每个条件。
您正在混合MessageBox和MsgBox。我将其更改为更具便携性的MessageBox。
您需要退出Sub,以便您的代码在MessageBox之后不会继续。继续执行代码将最终插入数据。
由于Option Strict会告诉您摆脱.ToString。您似乎没有使用余额。
为什么不只是在代码中重置组合框而不是让用户这样做。否则,您将需要更多的退出订阅。
我向InsertMRR_newave(row)添加了一个参数。如果您使用此方法逐行更新数据库,则将是必需的。
如果InsertMRR_newave通过.Update方法使用数据适配器,则在for循环之后才应调用它。
Private Sub btn_done_Click(sender As Object, e As EventArgs) Handles btn_done.Click
If tb_mrrno.Text = "" OrElse tb_pono.Text = "" OrElse tb_requestedby.Text = "" OrElse tb_intendedfor.Text = "" OrElse tb_purpose.Text = "" OrElse tb_suppliers.Text = "" OrElse tb_supplierdrno.Text = "" OrElse cbox_status.Text = "" OrElse dgvAddMRR.RowCount = 0 Then
MessageBox.Show("Please fill all necessary fields including selecting an Item.", "Missing Data", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
For Each row As DataGridViewRow In dgvAddMRR.Rows
Dim qtyorder As Double = CDbl(row.Cells("qtyorder").Value)
Dim qtyreceived As Double = CDbl(row.Cells("qtyreceived").Value)
'Dim balance As Double = CDbl(row.Cells("balance").Value)
If qtyorder > qtyrecieved Then
row.Cells(ComboBoxColumnName.Index).Value = "Received - Lacking"
Else
row.Cells(ComboBoxColumnName.Index).Value = "Received - Complete"
End If
InsertMRR_newave(row)
Next
End Sub