以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  重置“工序_班组”列提示错误  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=5568)

--  作者:wqc360
--  发布时间:2009/12/20 9:37:00
--  重置“工序_班组”列提示错误
DataColChanged事件:
Dim dr As DataRow = e.DataRow
Dim dt As DataTable = DataTables("生产工艺")
Dim str As String = "图号 = \'" & dr("图号") & "\' And 工序_序号 = \'" & dr("工序_序号") & "\' And 派工单号 = \'" & dr("派工单号") & "\'And 状态 = \'执行\'"
if e.DataCol.Name = "图号" OrElse e.DataCol.Name = "工序_序号" OrElse e.DataCol.Name = "派工单号"   Then
    Dim r As DataRow = dt.Find(str)
    if r IsNot Nothing Then
        dr("成本_加工") = (dt.Compute("Sum(成本_加工费元)",str))
        dr("成本_工资") = (dt.Compute("Sum(成本_工资元)",str))
        dr("工艺工时_准结") = (dt.Compute("Sum(工艺工时_准结)",str))
        dr("工艺工时_加工")=(dt.Compute("Sum(工艺工时_加工)",str))
        dr("完成工时_准结")=(dt.Compute("Sum(完成工时_准结)",str))
        dr("完成工时_加工")=(dt.Compute("Sum(完成工时_加工)",str))
        dr("工废损失")=(dt.Compute("Sum(工废损失)",str))
        dr("实用工时")=(dt.Compute("Sum(实用工时)",str))
    End If
End If
Select Case e.DataCol.Name
    Case "工艺工时_准结","工艺工时_加工","完成工时_准结","完成工时_加工","工作时间"
        dr("完成工时_比例")=(dr("完成工时_准结")+dr("完成工时_加工"))/(dr("工艺工时_准结")+dr("工艺工时_加工"))
        dr("工艺工时_天数")=(dr("工艺工时_加工")+dr("工艺工时_准结"))/dr("工作时间")
        dr("完成工时_天数")=(dr("完成工时_准结")+dr("完成工时_加工"))/dr("工作时间")
End Select
If e.DataCol.Name = "确定" Then \'如果是已结帐列的内容变动
    If e.NewValue = True Then \'而且变动后的值是True(已勾选)
        e.DataRow.Locked = True \'那么锁定此行
    End If
End If
If e.DataCol.Name = "工序_班组" Then
    dr = DataTables("基础表").Find(" [班组] = \'" & e.DataRow("工序_班组") & "\'")
    If dr IsNot Nothing Then
        e.DataRow("工作时间") = dr("工作时间")
    Else
        e.DataRow("工作时间") = Nothing
    End If
End If
Dim Sum As Double = Tables("生产工序").Compute("Sum(工艺工时_天数)","[图号] = \'" & dr("图号") & "\' And [派工单号] = \'" & dr("派工单号") & "\' And [状态] = \'执行\' And [工序_序号] <= " & dr("工序_序号"))
Dim Sum1 As Double = Tables("生产工序").Compute("Sum(工艺工时_天数)","[图号] = \'" & dr("图号") & "\' And [派工单号] = \'" & dr("派工单号") & "\' And [状态] = \'执行\' And [工序_序号] >= " & dr("工序_序号"))
Dim pr As DataRow = dr.GetParentrow("生产目录")
dr("工序_完工日期") = pr("到料日期").AddDays(Sum * (pr("生产周期")/pr("工艺工时_天数")))
dr("工序_开工日期") = pr("完工日期").AddDays(-Sum1 * (pr("生产周期")/pr("工艺工时_天数"))+1)

图片点击可在新窗口打开查看此主题相关图片如下:未命名.bmp
图片点击可在新窗口打开查看

--  作者:wqc360
--  发布时间:2009/12/20 9:45:00
--  
奇怪,我把以下代码放在最后,他又能正常了,证明代码没问题,前后有没关系怎么回事?
If e.DataCol.Name = "工序_班组" Then
    dr = DataTables("基础表").Find(" [班组] = \'" & e.DataRow("工序_班组") & "\'")
    If dr IsNot Nothing Then
        e.DataRow("工作时间") = dr("工作时间")
    Else
        e.DataRow("工作时间") = Nothing
    End If
End If
--  作者:程兴刚
--  发布时间:2009/12/20 10:02:00
--  
改成这样试试:

    If dr("工作时间")= Nothing Then
       e.DataRow("工作时间") = Nothing
    Else
       e.DataRow("工作时间") = dr("工作时间")
    End If

--  作者:czy
--  发布时间:2009/12/20 10:04:00
--  
图号列类型是数值型吗?
--  作者:程兴刚
--  发布时间:2009/12/20 10:06:00
--  
哦,是两个表的图号列类型不匹配!

执行到这里:
If e.DataCol.Name = "工序_班组" Then
    dr = DataTables("基础表").Find(" [班组] = \'" & e.DataRow("工序_班组") & "\'")
此dr非彼dr,放到后面自然不报错了。

[此贴子已经被作者于2009-12-20 10:11:01编辑过]

--  作者:wqc360
--  发布时间:2009/12/20 10:29:00
--  
工作时间是提取按条件基础表中的,程版的不行。
不知执行代码时有没有顺序,比如:
1由2、3得出
3由4、5得出
1写在前面,3写在后面,算1时,是先用以前的3,还是用重新计算出3得出。
向我上面的,我以改成如下,但是顺序还是有一个不对,如"工作时间",先有调用计算其他数据,后又计算自己,掉前面不能执行:
Dim dr As DataRow = e.DataRow
Dim dt As DataTable = DataTables("生产工艺")
Dim str As String = "图号 = \'" & dr("图号") & "\' And 工序_序号 = \'" & dr("工序_序号") & "\' And 派工单号 = \'" & dr("派工单号") & "\'And 状态 = \'执行\'"
if e.DataCol.Name = "图号" OrElse e.DataCol.Name = "工序_序号" OrElse e.DataCol.Name = "派工单号"   Then
    Dim r As DataRow = dt.Find(str)
    if r IsNot Nothing Then
        dr("成本_加工") = (dt.Compute("Sum(成本_加工费元)",str))
        dr("成本_工资") = (dt.Compute("Sum(成本_工资元)",str))
        dr("工艺工时_准结") = (dt.Compute("Sum(工艺工时_准结)",str))
        dr("工艺工时_加工")=(dt.Compute("Sum(工艺工时_加工)",str))
        dr("完成工时_准结")=(dt.Compute("Sum(完成工时_准结)",str))
        dr("完成工时_加工")=(dt.Compute("Sum(完成工时_加工)",str))
        dr("工废损失")=(dt.Compute("Sum(工废损失)",str))
        dr("实用工时")=(dt.Compute("Sum(实用工时)",str))
    End If
End If
Dim Sum As Double = Tables("生产工序").Compute("Sum(工艺工时_天数)","[图号] = \'" & dr("图号") & "\' And [派工单号] = \'" & dr("派工单号") & "\' And [状态] = \'执行\' And [工序_序号] <= " & dr("工序_序号"))
Dim Sum1 As Double = Tables("生产工序").Compute("Sum(工艺工时_天数)","[图号] = \'" & dr("图号") & "\' And [派工单号] = \'" & dr("派工单号") & "\' And [状态] = \'执行\' And [工序_序号] >= " & dr("工序_序号"))
Dim pr As DataRow = dr.GetParentrow("生产目录")
dr("工序_完工日期") = pr("到料日期").AddDays(Sum * (pr("生产周期")/pr("工艺工时_天数")))
dr("工序_开工日期") = pr("完工日期").AddDays(-Sum1 * (pr("生产周期")/pr("工艺工时_天数")))
Select Case e.DataCol.Name
    Case "工艺工时_准结","工艺工时_加工","完成工时_准结","完成工时_加工","工作时间"
        dr("完成工时_比例")=(dr("完成工时_准结")+dr("完成工时_加工"))/(dr("工艺工时_准结")+dr("工艺工时_加工"))
        dr("工艺工时_天数")=(dr("工艺工时_加工")+dr("工艺工时_准结"))/dr("工作时间")
        dr("完成工时_天数")=(dr("完成工时_准结")+dr("完成工时_加工"))/dr("工作时间")
End Select
If e.DataCol.Name = "确定" Then \'如果是已结帐列的内容变动
    If e.NewValue = True Then \'而且变动后的值是True(已勾选)
        e.DataRow.Locked = True \'那么锁定此行
    End If
End If
If e.DataCol.Name = "工序_班组" Then
    dr = DataTables("基础表").Find(" [班组] = \'" & e.DataRow("工序_班组") & "\'")
    If dr IsNot Nothing Then
        e.DataRow("工作时间") = dr("工作时间")
    Else
        e.DataRow("工作时间") = Nothing
    End If
End If



--  作者:wqc360
--  发布时间:2009/12/20 10:40:00
--  
我又改了一下,粉红橘黄得出红色红色得出橙色,最后得出橘黄,但是橘黄掉得出红色前面不行。
Dim dr As DataRow = e.DataRow
Dim dt As DataTable = DataTables("生产工艺")
Dim str As String = "图号 = \'" & dr("图号") & "\' And 工序_序号 = \'" & dr("工序_序号") & "\' And 派工单号 = \'" & dr("派工单号") & "\'And 状态 = \'执行\'"
if e.DataCol.Name = "图号" OrElse e.DataCol.Name = "工序_序号" OrElse e.DataCol.Name = "派工单号"   Then
    Dim r As DataRow = dt.Find(str)
    if r IsNot Nothing Then
        dr("成本_加工") = (dt.Compute("Sum(成本_加工费元)",str))
        dr("成本_工资") = (dt.Compute("Sum(成本_工资元)",str))
        dr("工艺工时_准结") = (dt.Compute("Sum(工艺工时_准结)",str))
        dr("工艺工时_加工")=(dt.Compute("Sum(工艺工时_加工)",str))
        dr("完成工时_准结")=(dt.Compute("Sum(完成工时_准结)",str))
        dr("完成工时_加工")=(dt.Compute("Sum(完成工时_加工)",str))
        dr("工废损失")=(dt.Compute("Sum(工废损失)",str))
        dr("实用工时")=(dt.Compute("Sum(实用工时)",str))
    End If
End If
Select Case e.DataCol.Name
    Case "工艺工时_准结","工艺工时_加工","完成工时_准结","完成工时_加工","工作时间"
        dr("完成工时_比例")=(dr("完成工时_准结")+dr("完成工时_加工"))/(dr("工艺工时_准结")+dr("工艺工时_加工"))
        dr("工艺工时_天数")=(dr("工艺工时_加工")+dr("工艺工时_准结"))/dr("工作时间")
        dr("完成工时_天数")=(dr("完成工时_准结")+dr("完成工时_加工"))/dr("工作时间")
End Select
Dim Sum As Double = Tables("生产工序").Compute("Sum(工艺工时_天数)","[图号] = \'" & dr("图号") & "\' And [派工单号] = \'" & dr("派工单号") & "\' And [状态] = \'执行\' And [工序_序号] <= " & dr("工序_序号"))
Dim Sum1 As Double = Tables("生产工序").Compute("Sum(工艺工时_天数)","[图号] = \'" & dr("图号") & "\' And [派工单号] = \'" & dr("派工单号") & "\' And [状态] = \'执行\' And [工序_序号] >= " & dr("工序_序号"))
Dim pr As DataRow = dr.GetParentrow("生产目录")
dr("工序_完工日期") = pr("到料日期").AddDays(Sum * (pr("生产周期")/pr("工艺工时_天数")))
dr("工序_开工日期") = pr("完工日期").AddDays(-Sum1 * (pr("生产周期")/pr("工艺工时_天数")))
If e.DataCol.Name = "确定" Then \'如果是已结帐列的内容变动
    If e.NewValue = True Then \'而且变动后的值是True(已勾选)
        e.DataRow.Locked = True \'那么锁定此行
    End If
End If
If e.DataCol.Name = "工序_班组" Then
    dr = DataTables("基础表").Find(" [班组] = \'" & e.DataRow("工序_班组") & "\'")
    If dr IsNot Nothing Then
        e.DataRow("工作时间") = dr("工作时间")
    Else
        e.DataRow("工作时间") = Nothing
    End If
End If

--  作者:wqc360
--  发布时间:2009/12/20 10:44:00
--  

 图片点击可在新窗口打开查看 Post By:2009-12-20 10:06:00

哦,是两个表的图号列类型不匹配!

执行到这里:
If e.DataCol.Name = "工序_班组" Then
    dr = DataTables("基础表").Find(" [班组] = \'" & e.DataRow("工序_班组") & "\'")
此dr非彼dr,放到后面自然不报错了。

基础表无图号列
[此贴子已经被作者于2009-12-20 10:44:28编辑过]

--  作者:wqc360
--  发布时间:2009/12/20 10:49:00
--  
如要想把"工作时间"计算代码插在"工艺工时_天数"前面,代码应怎么改
--  作者:wqc360
--  发布时间:2009/12/20 10:51:00
--  
本表"工作时间"是本表"工序_班组"=基础表"班组"时,调用基础表"工作时间"