以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  满足条件统计  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=175097)

--  作者:nuoyan89
--  发布时间:2022/2/19 17:30:00
--  满足条件统计
老师,我在窗口表中需要设置状态,如下:我有两个表(分别为:A表和B表),根据生产批次,加工工序、使用设备、成品编码等条件,在B表中统计“加工状态” 列中如果有空值,并且表A的“待加工数”列小于或等于0,表A中的刀具状态为“待还刀”;如果加工状态列中没有空值,刀具状态为“已还刀”,如果表B中的统计根本没有这个相关的明细可统计,并且表A的“可排产数”列不等于表A中的“计划数量”,表A中的刀具状态为“待配刀”,如果表B中根本没有这个相关的明细可统计,并且表A的“合格品”列大于0,表A中的刀具状态为“无需刀具”。我想在窗口表中表事件中,请帮忙看看,谢谢!
以下这个刀码也帮忙看看,谢谢
If e.DataRow("刀具状态") <> "已还刀" AndAlso e.DataRow("使用设备") Like "*ZK*" Then
    Dim Filter12 As String = "[成品编码] = \'" & e.DataRow("成品编码") & "\' and [加工工序] = \'" & e.DataRow("加工工序") & "\'and [使用设备] = \'" & e.DataRow("使用设备") & "\' and [生产批次] = \'" & e.DataRow("生产批次") & "\'"\'
    If DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) > 0  Then
        e.DataRow("刀具状态") = "已还刀"
    ElseIf  DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) < 0   Then
        e.DataRow("刀具状态") = "待还刀"
    ElseIf   e.DataRow("合格品") > 0  AndAlso  e.DataRow("待加工数") > 0 AndAlso  DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) = Nothing   Then
        e.DataRow("刀具状态") = "进行中"
    ElseIf  e.DataRow("待加工数") = e.DataRow("计划数量") AndAlso DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) = Nothing   Then
        e.DataRow("刀具状态") = "未加工"
    End If
End If

--  作者:有点蓝
--  发布时间:2022/2/19 17:42:00
--  
既然代码里都有具体的表名列名,描述问题记录使用代码里的表名列名,不要使用什么A表,B表,A列B列来表示,无法对号入座,看半天都不知道哪个是A表哪个是B表。

根本没有这个相关的明细可统计指什么?有空值,没有空值又表示什么?

--  作者:nuoyan89
--  发布时间:2022/2/19 20:01:00
--  
老师,我把代码改了下,红色标注的是需要达到的结果,目前就是计划领用刀具这个表统计时有点分不清表达,被搅晕了(1、根据以下条件(蓝色),先在计划领用刀具表中查找是否有对应的刀具清单,如果有,再统计加工状态这一列是否有空值,没有空值,刀具状态则为已还刀,如果有空值,并且工序状态为进行中时,刀具状态则为进行中?2、另外一个就是根据蓝色字体的条件,先查找计划领用刀具表中查找是否有对应的清单,如果没有,则按刀具状态按要求显示;3、另外一个就是根据蓝色字体的条件,先查找计划领用刀具表中查找是否有对应的清单,如果有,按照加工状态统计中没有空值,则按刀具状态按要求显示;)。请帮忙看看,谢谢
If e.DataRow("刀具状态") <> "已还刀" AndAlso e.DataRow("使用设备") Like "*ZK*" Then
    Dim Filter12 As String = "[成品编码] = \'" & e.DataRow("成品编码") & "\' and [加工工序] = \'" & e.DataRow("加工工序") & "\'and [使用设备] = \'" & e.DataRow("使用设备") & "\' and [生产批次] = \'" & e.DataRow("生产批次") & "\'"\'
   1、If DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) > 0  Then (解释:如果《计划领用刀具》的加工状态这列没有空值,那当前窗口表中的“刀具状态” = “已还刀”
        e.DataRow("刀具状态") = "已还刀"
    ElseIf  DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) < 0  AndAlso e.DataRow("工序状态") = "进行中" Then(解释:如果《计划领用刀具》的加工状态这列有空值,并且当前窗口表中的工序状态列为”进行中“,那当前窗口表中的“刀具状态” = “进行中”
        e.DataRow("刀具状态") = "进行中"
    ElseIf   e.DataRow("已排产数") <> 0  AndAlso  e.DataRow("合格品") = 0 AndAlso  DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) = Nothing   Then(解释:如果《计划领用刀具》的没有对应的刀具明细,并且当前窗口表中的已排产数列不等于于零和合格品列等于0,那当前窗口表中的“刀具状态” = “待配刀”
        e.DataRow("刀具状态") = "待配刀"
    ElseIf  e.DataRow("待加工数") = e.DataRow("计划数量") AndAlso DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) = Nothing   Then
        e.DataRow("刀具状态") = "未加工" (解释:如果《计划领用刀具》的没有这个批次的的相关刀具信息,并且当前窗口表中的待加工数等于计划数量,那当前窗口表中的“刀具状态” = “未加工”
ElseIf  DataTables("计划领用刀具").SQLCompute("count(加工状态)", Filter12) < 0  AndAlso e.DataRow(" 工序状态") = "已完工" Then(解释:如果《计划领用刀具》的加工状态这列有空值,并且当前窗口表中的工序状态列为”已完工“,那当前窗口表中的“刀具状态” = “待还刀”
        e.DataRow("刀具状态") = "待还刀"
    End If
End If

--  作者:有点蓝
--  发布时间:2022/2/20 20:56:00
--  
If e.DataRow("刀具状态") <> "已还刀" AndAlso e.DataRow("使用设备") Like "*ZK*" Then
    Dim Filter12 As String = "[成品编码] = \'" & e.DataRow("成品编码") & "\' and [加工工序] = \'" & e.DataRow("加工工序") & "\'and [使用设备] = \'" & e.DataRow("使用设备") & "\' and [生产批次] = \'" & e.DataRow("生产批次") & "\'"\'
dim dr as datarow = DataTables("计划领用刀具").SQLFind(Filter12)
if dr is nothing then 《计划领用刀具》没有对应的刀具明细
如果没有,则按刀具状态按要求显示
if e.DataRow("已排产数") <> 0  AndAlso  e.DataRow("合格品") = 0 then
《计划领用刀具》的没有对应的刀具明细,并且当前窗口表中的已排产数列不等于于零和合格品列等于0,那当前窗口表中的“刀具状态” = “待配刀”
elseif e.DataRow("待加工数") = e.DataRow("计划数量")
待加工数等于计划数量,那当前窗口表中的“刀具状态” = “未加工”
endif
else 《计划领用刀具》有对应的刀具明细
    if dr.isnull("加工状态") then 加工状态这一列是空值
        if e.DataRow("工序状态") = "进行中" then
如果有空值,并且工序状态为进行中时,刀具状态则为进行中
elseif e.DataRow("工序状态") = "已完工" then
加工状态这列有空值,并且当前窗口表中的工序状态列为”已完工“,那当前窗口表中的“刀具状态” = “待还刀”
        end if
    else 加工状态这一列不是空值
加工状态这列没有空值,那当前窗口表中的“刀具状态” = “已还刀”
    end if
end if
End If

--  作者:nuoyan89
--  发布时间:2022/2/23 20:31:00
--  
老师,再请教下,计划领用刀具这个表中的刀具状态有很多行,我想让当刀具状态这一列的多行全部为已完工时,订单状态=已完工,只要有一个不是已完工的,订单状态=进行中
--  作者:有点蓝
--  发布时间:2022/2/24 8:46:00
--  
使用compute计算

if e.datatable.compute("count(刀具状态)","刀具状态 <> \'已完工\' or 刀具状态 is null") > 0 then
订单状态=进行中
else
订单状态=已完工
end if

--  作者:nuoyan89
--  发布时间:2022/2/24 9:33:00
--  
老师,我把写成了下面这样的,但是不变,如图2
Dim Filter12 As String = "[成品编码] = \'" & e.DataRow("成品编码") & "\' and [生产批次] = \'" & e.DataRow("生产批次")  & "\'"
If DataTables("生产排产表").SQLcompute("count(订单状态)","订单状态 <> \'已完成\' or 订单状态 is null") > 0 AndAlso  e.DataRow("申请关闭") = Nothing  Then
    e.DataRow("排产状态") =  "进行中"
Else
    e.DataRow("排产状态") = "已完工"
End If

图片点击可在新窗口打开查看此主题相关图片如下:2.jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2022/2/24 9:34:29编辑过]

--  作者:有点蓝
--  发布时间:2022/2/24 9:56:00
--  
Dim Filter12 As String = "[成品编码] = \'" & e.DataRow("成品编码") & "\' and [生产批次] = \'" & e.DataRow("生产批次")  & "\' and (订单状态 <> \'已完成\' or 订单状态 is null)"
If DataTables("生产排产表").SQLcompute("count(订单状态)",Filter12 ) > 0 AndAlso  e.DataRow("申请关闭") = Nothing  Then

--  作者:nuoyan89
--  发布时间:2022/3/2 9:13:00
--  
老师,以下代码帮忙看看,查询时出现闪退或者以下如图异常,这个代码注释掉就不会出现
Dim Filter12 As String = "[成品编码] = \'" & e.DataRow("成品编码") & "\' and [生产批次] = \'" & e.DataRow("生产批次")  & "\' and (订单状态 <> \'已完成\' or 订单状态 is null)"
If DataTables("生产排产表").SQLcompute("count(订单状态)",Filter12 ) > 0 AndAlso  e.DataRow("申请关闭") = Nothing  Then
   e.DataRow("排产状态") =  "进行中"
Else
    e.DataRow("排产状态") = "已完工"
End If

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2022/3/2 9:23:00
--  
应该是事件代码之间互相触发形成了死循环。

检查代码逻辑,或者加上这个试试:http://www.foxtable.com/webhelp/topics/2218.htm