Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 从主窗体运行VBA以验证子窗体中的合计_Ms Access_Vba_Ms Access 2002 - Fatal编程技术网

Ms access 从主窗体运行VBA以验证子窗体中的合计

Ms access 从主窗体运行VBA以验证子窗体中的合计,ms-access,vba,ms-access-2002,Ms Access,Vba,Ms Access 2002,我在MS Access 2002中有一个表单,在命令按钮后面有以下代码片段 'Requery subform to make sure total is calculated Me.fsubUpdateShipments.Requery DoEvents 'Confirm quantities have been entered If Form_fsubUpdateShipments.txtTotalShipmentQty.Value <= 0 Then MsgBox "Cann

我在MS Access 2002中有一个表单,在命令按钮后面有以下代码片段

'Requery subform to make sure total is calculated
Me.fsubUpdateShipments.Requery
DoEvents

'Confirm quantities have been entered
If Form_fsubUpdateShipments.txtTotalShipmentQty.Value <= 0 Then
    MsgBox "Cannot create shipment, no quantities have been entered", vbCritical
    Exit Sub
End If
“重新查询子窗体以确保已计算总计
Me.fsubUpdateShipments.Requery
多芬特
'确认已输入数量

如果Form_fsubUpdateShipments.txtotalshipmentqty.Value,我将完全跳过使用用户界面并查看表格。如果在主窗体命令按钮上运行此操作,则子窗体将失去焦点并保存其值。不需要再询问。只需在DSum的条件(第三个参数)中重新创建父子关系:

If DSum("QtyToShip", "ShipmentDetails", "ShipmentID = " & Me!ShipmentID) <= 0 Then
    MsgBox "Cannot create shipment, no quantities have been entered", vbCritical
    Exit Sub
End If

如果DSum(“QtyToShip”、“ShipmentDetails”、“ShipmentID=“&Me!ShipmentID”)有两个选项,其他人已经确定了这两个选项,但由于他们的建议不完整或不整洁(缓慢),我将发表这篇文章

A.您可以强制等待以延迟IF测试:

将其放在一个模块中:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...
Public Sub GoSleep(millisecondDelay as long)
    Sleep (millisecondDelay)
End Sub
Public Function GetDBValue(qry as string) as variant
    dim rst as new adodb.recordset
    rst.open qry, currentproject.connection, adOpenKeyset, adLockReadOnly
    if rst.eof then
        GetValue = null
    else
        GetValue = rst.fields(0)
    end if
end function

public Function IsNullSQL(basevalue as variant, replacementvalue as variant) as variant
    isNullSQL = iif(isnull(basevalue), replacementvalue, basevalue)
end function
以您的形式:

'Requery subform to make sure total is calculated
Me.fsubUpdateShipments.Requery
DoEvents

GoSleep 1000 '1 second delay. Or 2000, whatever is required really

'Confirm quantities have been entered
If Form_fsubUpdateShipments.txtTotalShipmentQty.Value <= 0 Then
   MsgBox "Cannot create shipment, no quantities have been entered", vbCritical
   Exit Sub
End If
''Requery subform to make sure total is calculated
'Me.fsubUpdateShipments.Requery
'DoEvents

'Confirm quantities have been entered
If IsNullSQL(GetValue("SELECT Sum(QtyToShip) FROM tbl WHERE ..."), -1) < 0 Then
    MsgBox "Cannot create shipment, no quantities have been entered.", vbCritical, "No Quantities to Ship"
    Exit Sub
End If

'If Form_fsubUpdateShipments.txtTotalShipmentQty.Value <= 0 Then
'    MsgBox "Cannot create shipment, no quantities have been entered", vbCritical
'    Exit Sub
'End If
以您的形式:

'Requery subform to make sure total is calculated
Me.fsubUpdateShipments.Requery
DoEvents

GoSleep 1000 '1 second delay. Or 2000, whatever is required really

'Confirm quantities have been entered
If Form_fsubUpdateShipments.txtTotalShipmentQty.Value <= 0 Then
   MsgBox "Cannot create shipment, no quantities have been entered", vbCritical
   Exit Sub
End If
''Requery subform to make sure total is calculated
'Me.fsubUpdateShipments.Requery
'DoEvents

'Confirm quantities have been entered
If IsNullSQL(GetValue("SELECT Sum(QtyToShip) FROM tbl WHERE ..."), -1) < 0 Then
    MsgBox "Cannot create shipment, no quantities have been entered.", vbCritical, "No Quantities to Ship"
    Exit Sub
End If

'If Form_fsubUpdateShipments.txtTotalShipmentQty.Value <= 0 Then
'    MsgBox "Cannot create shipment, no quantities have been entered", vbCritical
'    Exit Sub
'End If
“重新查询子窗体以确保已计算总数
'Me.fsubUpdateShipments.Requery
”“是吗
'确认已输入数量
如果IsNullSQL(GetValue(“从tbl中选择Sum(QtyToShip),其中…),-1)<0,则
MsgBox“无法创建装运,未输入任何数量”,vbCritical,“无需装运的数量”
出口接头
如果结束

'If Form_fsubUpdateShipments.txtotalshipmentqty.Value我认为这是这里唯一的解决方案。或者如果您决定将当前解决方案更改为在记录集激发事件上使用,这将允许您在激发
RecorodsetChangeCompleted
后立即继续执行If语句。@vba4如果我错了,请更正我,但没有错。@vba4应用程序。等待仅在Excel中工作?请查看有一个access应用程序,或者您可以添加对Excel对象模型的引用,并使用
应用程序。如果确实需要,请等待
to@Smandoli如果删除
.Requery
,我仍然会遇到同样的问题。我不知道为什么过去我把它放在那里,我可能没有它也能活下去,但如果用户在关注子窗体时单击主窗体上的命令按钮,我仍然会过早地遇到
If
语句。似乎pteranodons的答案是我能得到的最好答案。指出子表单数据的+1应该得到解决。(尽管为什么看起来不是这样是一个重要的问题。)这个解决方案应该很有效。至于“性能差”,这似乎不是一个可以注意到差异的情况。我建议您将
DSum()
的结果放在一个整数变量中,然后对其进行评估:
如果intTotalQty<1…
使用一个变量可能会发现一个缺陷,甚至可能会解决一个时间问题。这是一个在任何情况下都会对你有好处的习惯。使用睡眠功能只能是最后的选择。最好解决这个问题(我怀疑这个问题是可以解决的)。第二个答案最好作为一个单独的答题贴提供。我对彻底的编码表示赞赏,但是(a)
DSum()
更简单,实际上没有危险,(b)我不支持仅仅为了这个而强迫某人使用
ADO
。我接受你关于ADO的说法,但这正是我所使用的。但我不能同意。我永远记不起它的语法,如果涉及大量数据,它确实会影响性能。我必须同意@Smandoli的观点,如果我不清楚我的问题,我很抱歉,但是数据集通常很小,3-4条记录左右。强制一个任意的等待时间似乎会导致比需要更多的延迟,而且每个用户都有不同的PC规格,因此首先很难计算。DSum可能会对性能造成更大的影响,但它肯定更安全、更简洁。