繁体   English   中英

SQL / ACCESS函数无法按预期工作

SQL/ACCESS Function Not Working As Intended

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

Public Function GetPendingChangeOrders(strJ As String) As Double

strSQL = "SELECT DISTINCT Sum(jcdetail.cost) AS SumOfcost " & 
                    "FROM jcchangeorder INNER JOIN jcdetail ON (jcchangeorder.ordernum = jcdetail.ponum) AND (jcchangeorder.jobnum =jcdetail.jobnum) " & 
                    "GROUP BY jcdetail.jobnum, jcdetail.type, jcchangeorder.type, IIf(DLookUp(""type"",""jcchangeorderstep"",""jobnum = '"" & [jcchangeorder].[jobnum] & ""' and ordernum = '"" & [ordernum] & ""' and Type = 20"")=20,-1,0) " & _
                    "HAVING (((jcdetail.jobnum)='" & strJ & "') AND ((jcdetail.type)=19) AND ((jcchangeorder.type)<>2) AND ((IIf(DLookUp(""type"",""jcchangeorderstep"",""jobnum = '"" & [jcchangeorder].[jobnum] & ""' and ordernum = '"" & [ordernum] & ""' and Type = 20"")=20,-1,0))=0));"


Set rs = dbs.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly, dbReadOnly)

 If Not rs.EOF Then
    dblResult = Nz(rs.Fields(0), 0)
    rs.Close
    Set rs = Nothing
    GetPendingChangeOrders = dblResult
Else
    GetPendingChangeOrders = 0
End If
End Function

因此,我迷上了一些带有VBA / SQL语句的MS-Access数据库。 我实际上是一个初学者,但是我设法弄清楚了一些事情,并使自己熟悉了我们用于打印作业报告的数据库。 一些调用函数设置错误,并且从错误的表中提取,我基本上需要一些帮助,以确定应该采取哪种方式解决此问题。

当前,如果我们运行该报表,并调用“ GetPendingChangeOrders ”,它将执行它应该执行的操作,但是当我们查看待处理的内容时。 即使“ JCCHANGEORDERSTEP”表中的状态为21(DENIED),它也会显示结果。 我包括了它的图像。

JCCHANGEORDER与JCCHANGEORDERSTEP(JOBNUM,ORDERNUM,TYPE)的列相同,但JCCHANGEORDER中的类型只有1的类型,我认为这很活跃。

JCCHANGEORDERSTEP包含1个已发起(待定),20个(已批准),21个(已拒绝)。 它从报告的结果中筛选出20而不是21。因此,我只需要一些帮助,并解释了为什么仅将21加到混合中就不起作用。

感谢您的时间。

EDIT-1添加的IMGS IMGUR访问图片

2 个回复

您的HAVING和GROUP BY子句中的查询部分是给您带来问题的:

IIf(DLookUp("type",
            "jcchangeorderstep",
            "jobnum = ' [jcchangeorder].[jobnum] ' and 
              ordernum = ' [ordernum] ' and
              Type = 20")=20,-1,0))=0);

令人费解,很难阅读。 而是说,“如果此作业和订单在JCCHANGEORDERSTEP中以20类型出现, 则将其排除。” 因此,这就是您需要解决的问题。

整个查询可能应该以多种方式固定。 但是我认为这可能使您到达需要的地方。

strSQL = "SELECT DISTINCT Sum(jcdetail.cost) AS SumOfcost " & _
           "FROM jcchangeorder " & _
                "INNER JOIN jcdetail " & _
                         "ON (jcchangeorder.ordernum = jcdetail.ponum) " & _
                        "AND (jcchangeorder.jobnum =jcdetail.jobnum) " & _
          "GROUP BY jcdetail.jobnum, " & _
                   "jcdetail.type, " & _
                   "jcchangeorder.type, " & _
                   "DLookUp(""type"",""jcchangeorderstep"",""jobnum = '"" & [jcchangeorder].[jobnum] & ""' and ordernum = '"" & [ordernum] & ""' and Type = 1"") " & _
         "HAVING (jcdetail.jobnum='" & strJ & "' AND " & _
                 "jcdetail.type=19 AND " & _
                 "jcchangeorder.type <> 2) AND  " & _
                 "DLookUp(""type"",""jcchangeorderstep"",""jobnum = '"" & [jcchangeorder].[jobnum] & ""' and ordernum = '"" & [ordernum] & ""' and Type = 1"")=1;"

我所做的更改为条件为“如果此作业和订单出现在JCCHANGEORDERSTEP中且类型为1,则包括它。” 如果没有实际看到您的数据并亲自测试代码,我不能保证这会起作用。 可能会有一些错别字,所以我已经解释了我要做什么,因此您可以修复它们。

另外,花一些时间来完成堆栈溢出之旅。 如果您与之合作,那么这个社区将是一个很大的帮助。

尝试这个:
在与OP讨论了预期的结果之后,看来这将是一个更好的解决方案。 它给出了具有PENDING变更单步骤的所有变更单的总和。

strSQL = _
"SELECT SUM(JCD.cost) AS sumofcost " & _
  "FROM jcchangeorder JCCO  " & _
       "INNER JOIN jcdetail JCD  " & _
               "ON JCCO.ordernum = jcd.ponum  " & _
              "AND JCCO.jobnum = jcd.jobnum  " & _
       "INNER JOIN (SELECT JCCOS.ponum,  " & _
                          "JCCOS.jobnum  " & _
                     "FROM jcchangeorderstep JCCOS  " & _
                    "GROUP BY JCCOS.ponum,  " & _
                             "JCCOS.jobnum  " & _
                   "HAVING Count(*) = 1  " & _
                      "AND First(JCCOS.type) = 1) JCSELECT  " & _
               "ON JCCO.ordernum = JCSELECT.ponum  " & _
                  "AND JCCO.jobnum = JCSELECT.jobnum  " & _
 "GROUP BY JCD.jobnum,  " & _
          "JCD.type,  " & _
          "JCCO.type "
"HAVING JCD.jobnum='" & strJ & "' AND " & _
       "JCD.type=19 AND " & _
       "JCCO.type <> 2;"

JCCO,JCCOS和JCD是SQL别名。 SQL理解它们。 JCSELECT是一个别名子查询。 JCSELECT创建一组仅包含PENDING步骤的所有作业/订单。

看了您的图像并研究了现有的SQL代码之后,我认为以下SQL查询可能更合适并且更易读:

select sum(d.cost) as sumofcost 
from 
    (
        jcchangeorder o inner join jcdetail d
        on o.ordernum = d.ponum and o.jobnum = d.jobnum
    ) inner join
    (
        select distinct s.jobnum, s.ordernum 
        from jcchangeorderstep s 
        where s.type = 1
    ) q
    on o.jobnum = q.jobnum and o.ordernum = q.ordernum
where
    o.jobnum = ?job and d.type = 19 and o.type <> 2

在这里, jcchangeorderstep.type = 1jcdetail记录的包含是由表之间的inner join jcchangeorderstep.type = 1处理的,而不是由每个记录的单独dlookup处理的。

您可以通过以下方式在函数中实现此目的:

Public Function GetPendingChangeOrders(strJ As String) As Double
    Dim strS As String
    strS = strS & "select sum(d.cost) "
    strS = strS & "from "
    strS = strS & "    ( "
    strS = strS & "        jcchangeorder o inner join jcdetail d "
    strS = strS & "        on o.ordernum = d.ponum and o.jobnum = d.jobnum "
    strS = strS & "    ) inner join "
    strS = strS & "    ( "
    strS = strS & "        select distinct s.jobnum, s.ordernum "
    strS = strS & "        from jcchangeorderstep s "
    strS = strS & "        where s.type = 1 "
    strS = strS & "    ) q "
    strS = strS & "    on o.jobnum = q.jobnum and o.ordernum = q.ordernum "
    strS = strS & "where "
    strS = strS & "    o.jobnum = ?job and d.type = 19 and o.type <> 2 "

    Dim rst As DAO.Recordset
    With CurrentDb.CreateQueryDef("", strS)
        .Parameters(0) = strJ
        Set rst = .OpenRecordset
        If Not rst.EOF Then
            rst.MoveFirst
            GetPendingChangeOrders = Nz(rst.Fields(0), 0)
        End If
        rst.Close
    End With
End Function

编辑:

在后续评论之后,以下内容似乎更符合您的要求:

select sum(d.cost) 
from  
    jcchangeorder o inner join jcdetail d 
    on o.ordernum = d.ponum and o.jobnum = d.jobnum
where
    o.jobnum = jobparam and
    d.type = 19 and
    o.type <> 2 and
    not exists 
    (
        select 1 from jcchangeorderstep s 
        where s.jobnum = o.jobnum and s.ordernum = o.ordernum and s.type <> 1
    )

这可以通过以下方式在您的VBA功能中实现:

Public Function GetPendingChangeOrders(strJ As String) As Double
    Dim strS As String
    strS = strS & "select sum(d.cost) "
    strS = strS & "from  "
    strS = strS & "    jcchangeorder o inner join jcdetail d "
    strS = strS & "    on o.ordernum = d.ponum and o.jobnum = d.jobnum "
    strS = strS & "where "
    strS = strS & "    o.jobnum = jobparam and "
    strS = strS & "    d.type = 19 and "
    strS = strS & "    o.type <> 2 and "
    strS = strS & "    not exists "
    strS = strS & "    ( "
    strS = strS & "        select 1 from jcchangeorderstep s "
    strS = strS & "        where s.jobnum = o.jobnum and s.ordernum = o.ordernum and s.type <> 1 "
    strS = strS & "    ) "

    Dim rst As DAO.Recordset
    With CurrentDb.CreateQueryDef("", strS)
        .Parameters("jobparam") = strJ
        Set rst = .OpenRecordset
        If Not rst.EOF Then
            rst.MoveFirst
            GetPendingChangeOrders = Nz(rst.Fields(0), 0)
        End If
        rst.Close
    End With
End Function
2 动态SQL无法按预期工作

我正在尝试动态找不到任何Parentsku产品,但是我无法调试该错误。 我正在尝试将结果插入到全局临时表中,但无法正常工作 以下是我收到的错误消息: ...

3 intersectsLine()函数无法按预期工作

我正在尝试检查一条线是否与一组矩形相交。 这是我的代码: 如您所见,起点(36,63)在rectangle1内,但显然,此线段不与其起点所在的矩形相交。 但是,它与存储端点(5,12)的矩形相交。 知道为什么吗? 如何获取交叉点检测? ...

4 insertElement() 函数无法按预期工作

我的 insertElement() 函数在我的程序中遇到了问题。 我原本打算 insertElement 做的是从原型中获取索引并将所有值向右移动,包括该索引上的值,向右移动一次。 所以,如果我有我的数组 {1, 2, 3, 4} 并且我想在索引“2”处插入值“10”,结果数组将是 {1, 2, ...

5 scrollspy函数无法按预期工作

嗨,我正在使用scrollspy.js并将其用作教程。 我试图按照教程更改代码。 在这里检查我的代码 。 我不知道为什么它不能按预期工作。 请给我您的宝贵建议。 提前致谢。 抱歉,我没有在下面粘贴整个代码,但在上面的Codepen链接中。 ...

6 addClass函数无法按预期工作

jQuery toggle其他效果, hide可以工作,但是addClass函数在这里不起作用。 displyanone类可以在外部工作,但不能在jQuery函数内部工作。 怎么了 $(document).on('click', '#menu', function() { i ...

7 parseFloat函数无法按预期工作

我需要验证文本框条目。 如果在绑定过程中用户在此字段中输入字符,则entityframework会失败,因此只能允许整数。 这是问题: 当用户在此字段中输入10-d时, parseFloat将返回true因为它将10作为数字,而忽略其余值。 而IMO则应引发NAN错误,因为输入文 ...

8 AddField函数无法按预期工作

我有以下代码块,该代码块遍历每个表的字段并分别添加当前表的字段,以创建多个表框。 上面的代码创建了表格框,但是每次都少一个字段(缺少最后一个字段)。 如果将For循环从For j=0 To (arrFFCount - 1)更改For j=0 To (arrFFCount)它将创建空表框 ...

9 条件函数无法按预期工作

因此,我在人们经常更新的postgresql上获得了此表,并提供了以下功能。 此功能应该做的是,只要状态变为50且为空,就会自动填写日期列 问题是当on_hold布尔值列为true时,我不希望填充日期列。 我试过仅通过键入on_hold = true来设置功能,但是随后它以某 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM