以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  后台数据问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=148216)

--  作者:cuicuibing
--  发布时间:2020/4/2 15:08:00
--  后台数据问题
Dim cmd1 As New SQLCommand
cmd1.C \'记得设置数据源名称
cmd1.CommandText = "S  elect *  From 订单 where 编码 = \'614-1\' "
Dim dt1 As DataTable = cmd1.ExecuteReader
Dim cmd5 As New SQLCommand
cmd5.C \'记得设置数据源名称
For Each dr1 As DataRow In dt1.DataRows
    cmd5.CommandText = "S elect * From 表a where 编码 = \'"& dr1("编码") &"\'"
    Dim dt5 As DataTable = cmd5.ExecuteReader
    Dim val As Double = dt5.Compute("sum(用量)", "编码= \'"& dr1("编码") &"\'")
    dr1("余量") = dr1("数量") - val
Next

这里如何生产一个临时表,余量> 0 的。另外,这种遍历,如何提高下效率。数据多时,速度慢。

--  作者:有点蓝
--  发布时间:2020/4/2 16:32:00
--  
使用sql

先更新
up
date 订单 set 余量 = 余量 - b.用量 from 订单 as a inner join  (selec编码,sum(用量) as 用量 from 表a where 编码=\'614-1\' group by 编码) as b on a.编码 = b.编码 where a.码 = \'614-1\' 

然后取临时表
Select *  From 订单 where 编码 = \'614-1\'  and 余量> 0 

--  作者:cuicuibing
--  发布时间:2020/4/3 8:27:00
--  
Dim Filter As String
With e.Form.Controls("DropBox1")
    If .Value IsNot Nothing Then
        Filter = "内部加工单号 = \'" & .Value & "\'"
    End If
End With
With e.Form.Controls("combobox1")
    If .Value IsNot Nothing Then
        If Filter > "" Then
            Filter = Filter & " And "
        End If
        Filter = Filter & "工段 = \'" & .Value & "\'"
    End If
End With
With e.Form.Controls("ComboBox2")
    If .Value IsNot Nothing Then
        If Filter >"" Then
            Filter = Filter & " And "
        End If
        Filter = Filter & "产品名称 = \'" & .Value & "\'"
    End If
End With

With e.Form.Controls("ComboBox3")
    If .Value IsNot Nothing Then
        If Filter >"" Then
            Filter = Filter & " And "
        End If
        Filter = Filter & "工序名称 = \'" & .Value & "\'"
    End If
End With

Dim cmd,cmd1 As New SQLCommand
Dim dt As DataTable
cmd.C
cmd1.C
cmd1.CommandText = "select * From {工序清单} " & iif(Filter>"", "Where " & filter, "")
dt = cmd1.ExecuteReader()
For Each r As DataRow In dt.dataRows
    cmd.CommandText = "update 工序清单 SET 可派工量 = 工序数量 - b.派工量 from 工序清单 as a inner join  (select 编号,sum(派工量) as 派工量 from 派工明细表 where 编号 = \'" & r("编号") & "\' group by 编号 ) As b on a.编号 = b.编号 where a.编号 = \'" & r("编号") & " \' "
    cmd.ExecuteNonQuery()
      这里报错:
           语法错误 (操作符丢失) 在查询表达式 \'工序数量 - b.派工量 from 工序清单 as a inner join  (select 编号,sum(派工量) as 派工量 from 派工明细表 where 编号 = \'qd01019676\' gr oup by 编号 ) As b on a.编号 = b.编号\' 中。
 Next  
          这里是不是可以,直接用语句后台更新,不用 for  each 循环。  语句如何写。
If Filter >"" Then
    Filter = Filter & " And "
End If
Filter = Filter & "[可派工量] > 0 "

If Filter > "" Then
    DataTables("工序库调用_Table1").LoadFilter = Filter \'设置加载条件
    DataTables("工序库调用_Table1").Load()
End If


--  作者:有点蓝
--  发布时间:2020/4/3 9:39:00
--  

如果使用update就没有必要在遍历了,直接一条SQL搞定

Dim cmd As New SQLCommand
cmd.C
cmd.CommandText = "update 工序清单 SET 可派工量 = 工序数量 - b.派工量 from 工序清单 as a inner join  (select 编号,sum(派工量) as 派工量 from 派工明细表 group by 编号 ) As b on a.编号 = b.编号 where " & filter
cmd.ExecuteNonQuery()

If Filter >"" Then
    Filter = Filter & " And "
End If
Filter = Filter & "[可派工量] > 0 "

If Filter > "" Then
    DataTables("工序库调用_Table1").LoadFilter = Filter \'设置加载条件
    DataTables("工序库调用_Table1").Load()
End If

--  作者:cuicuibing
--  发布时间:2020/4/3 15:07:00
--  
蓝版主,按照你的方式,试验了可以。但有个问题。
派工明细表里边比如,原来有qd000001的数据。后来删除了。这时候,后台更新 {工序清单} 中的可派工量,值没有变化。

感觉 当派工明细表中  没有 符合条件的记录时, 不返回数据呢。   可派工量 = 工序数量 - b.派工量     b.派工量,没有反馈会数据

如果是这种情况,如何更新  工序清单中  的可派工量 = 工序数量

--  作者:有点蓝
--  发布时间:2020/4/3 15:12:00
--  
删除后要保存。

试试:可派工量 =  isnull(工序数量,0) - isnull(b.派工量,0)

--  作者:cuicuibing
--  发布时间:2020/4/3 16:21:00
--  
蓝版主,我试验了。
具体问题如下:
工序清单   qd000001 可派工量初始值为1000

派工明细表中,派过 qd000001 的派工量 为1000, 进行其他操作时,  工序清单   qd000001 可派工量 变为0.
如果 派工明细表中,qd000001 的派工 删除掉后,也就是派工明细表中没有  qd000001的数据了。

cmd.CommandText = "update 工序清单 SET 可派工量 = 工序数量 - b.派工量 from 工序清单 as a inner join  (select 编号,sum(派工量) as 派工量 from 派工明细表 group by 编号 ) As b on a.编号 = b.编号 where " & filter

没有把 可派工量  后台没有更新数据。 

把  可派工量 = 工序数量 - b.派工量  改为 可派工量 =  isnull(工序数量,0) - isnull(b.派工量,0)

还是没有变化。  

如果 派工明细表中,qd000001 的派工 有2条记录,删除掉一条后,还剩1条qd000001的记录。可以更新后台数据



--  作者:有点蓝
--  发布时间:2020/4/3 16:33:00
--  
 inner join 改为 left join
--  作者:cuicuibing
--  发布时间:2020/4/3 16:53:00
--  
left join 直接没有数据
--  作者:有点蓝
--  发布时间:2020/4/3 17:03:00
--  
上传实例测试