【问题标题】:Setting Max ID criteria in Ms Access SQL在 Ms Access SQL 中设置 Max ID 条件
【发布时间】:2017-08-21 15:13:45
【问题描述】:

此查询不会在开始时运行。有人可以帮忙看看有什么问题吗? 如果有任何其他方法可以实现这一点,请提出建议。

strSQL1 = "SELECT * FROM PharmSales WHERE HospitalNo='" & Me.txtRegNo & 
          "' And TDate = #" & Format(Me.txtTDate, "M\/dd\/yyyy") & 
          "# AND SalesItem1 = '" & Me.txtSalesItem1 & "' And
          PharmSalesID=
               (SELECT MAX(PharmSalesID) FROM PharmSales)"

    Set pr = db.OpenRecordset(strSQL1)

    With pr
    If Not .BOF And Not .EOF Then  'Ensure that the recordset contains records
    .MoveLast
    .MoveFirst
     If .Updatable Then  'To ensure record is not locked by another user
     .Edit  'Must start an update with the edit statement
     If IsNull(![TotalPaid]) = True And Me.txtGrand_TotalPay.Value >= Me.txtSalesAmt1.Value Then
     ![DispQty1] = Nz(![DispQty1] + Me.txtSalesQty1.Value, 0)
      .Update
           ElseIf IsNull(![TotalPaid]) = False And (Me.txtGrand_TotalPay.Value - Me.txtSalesAmt1.Value) >= (txtGrand_TotalFee - Me.txtGrand_TotalPay.Value + Me.txtSalesAmt1.Value) Then
     ![DispQty1] = Nz(![DispQty1] + Me.txtSalesQty1.Value, 0)
      .Update

     Else: MsgBox ("Insufficient balance!")
     End If
    End If
    End If

     pr.Close 
     Set pr = Nothing 
    Set db = Nothing
    End With

End Sub

【问题讨论】:

  • 为什么你的意思是不运行?有什么错误吗?也可以使用参数,否则你很容易受到 sql 注入攻击检查这里:stackoverflow.com/questions/10352211/…
  • 要考虑的要点:HospitalNo 和SalesItem1 都是文本,因为将它们包含在单引号中会将它们视为文本;仅当给定的 HospitalNo Date 和 SalesItem1 恰好与也具有 max(PharmsalesID) 的那些匹配时,这才会返回一些东西。
  • 你的标题也谈到了设置最大值;但是您的 SQL 根据现有的最大值进行选择。你到底想做什么!

标签: sql ms-access dao


【解决方案1】:

您的 SQL 检查多个条件,但您的子查询没有这些条件中的任何一个,因此它可能会选择不符合您的其他条件的记录,从而导致您的记录集始终为空。

您需要将这些条件添加到子查询,而不是主查询。 由于子查询只会返回一条记录,因此您不必将它们都添加到两者中。

strSQL1 = "SELECT * FROM PharmSales" & _ 
          " WHERE PharmSalesID=" & _ 
               " (SELECT MAX(PharmSalesID) FROM PharmSales" & _ 
               " WHERE HospitalNo='" & Me.txtRegNo & _
               "' And TDate = #" & Format(Me.txtTDate, "M\/dd\/yyyy") & _
               "# AND SalesItem1 = '" & Me.txtSalesItem1 & "')"

【讨论】:

  • 感谢上帝使用您提供解决方案。非常感谢您为我指明了正确的方向!
  • 先生,我不想再打扰您了。但是是否可以根据之前的记录 ID 创建 WHERE 条件?
  • 这不是一件容易的事。它可能需要另一个问题,但请尽量明确你想要什么。对于某个WHERE 条件,您是否想要一个低于Max() 的值?您是否只是在迭代某些内容,并且想要对之前的记录做一些事情?
  • 早上好,埃里克先生。不用再打扰你了,我其实是可以根据表达式中的后续条件来获取之前的记录值的。对于记录,它是一个比 max() 低 1 的值。再次感谢您。
猜你喜欢
  • 2017-02-14
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多