Foxtable(狐表)用户栏目专家坐堂 → 关于代码联动的问题?


  共有1950人关注过本帖树形打印复制链接

主题:关于代码联动的问题?

帅哥哟,离线,有人找我吗?
yancheng
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:843 积分:5982 威望:0 精华:0 注册:2013/6/29 9:36:00
关于代码联动的问题?  发帖心情 Post By:2016/10/4 15:29:00 [只看该作者]

有:入库明细,表:DataColChanged 事件如下:

Sel ect Case e.DataCol.name
    Case "入库单价"
        Dim dr As DataRow = e.DataRow
        Dim cmd As New SQLCommand
        Dim dt As DataTable
        cmd.C
        cmd.CommandText = "SEL ECT * F rom {材料} Where [定额编码] = '" & dr("定额编码") & "'"
        dt = cmd.ExecuteReader(True)
        If dt.DataRows.Count > 0 Then
            dt.DataRows(0)("成本价") = dr("入库单价")
            dt.Save()
        End If

有,材料,表:DataColChanged 事件如下:  
Sele ct e.DataCol.Name
    Case "成本价"
        If e.DataRow.IsNull("运杂费") Then
  MessageBox.show(0)
            e.DataRow("材料原价")=(e.DataRow("成本价")*e.DataRow("主材损耗率") * ( 1+e.DataRow("利润率")+e.DataRow("挂靠管理费率")))*(1+e.DataRow("增值税率"))
        Else
  MessageBox.show(1)
            e.DataRow("材料原价")=((e.DataRow("运杂费")+e.DataRow("成本价")*e.DataRow("主材损耗率") )* ( 1+e.DataRow("利润率")+e.DataRow("挂靠管理费率")))*(1+e.DataRow("增值税率"))
        End If
End Sele ct

材料,表的:成本价,手动,改变后, e.DataRow("材料原价")  会执行代码,改变。

但是,间接的,通过“入库明细”表,的第一段代码改变了:材料,表的:成本价,后。。材料,表的:材料原价,不变,代码不执行。


请教是哪里的问题?

 回到顶部
帅哥哟,离线,有人找我吗?
新福星
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1964 积分:15604 威望:0 精华:0 注册:2011/7/16 20:59:00
  发帖心情 Post By:2016/10/4 18:04:00 [只看该作者]

第一段代码直接改的是材料表的后台数据,无法触发材料表的DataColChanged 事件。
第一段你可以改为用
datatables("材料表").LoadFilter = '" & dr("定额编码") & "'"
datatables("材料表").Loadtop=""
datatables("材料表").Load
dim s as row=tables("材料表").Current
if s isnot nothing then  
s("成本价") = e.DataRow("入库单价")
s.save
end if

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2016/10/5 7:09:00 [只看该作者]

ExecuteReader生成的是一个临时表,你并没有为这个表设置事件,也木有办法设置事件,所以你只能手工编码计算:


Sel ect Case e.DataCol.name
    Case "入库单价"
        Dim dr As DataRow = e.DataRow
        Dim cmd As New SQLCommand
        Dim dt As DataTable
        cmd.C
        cmd.CommandText = "SEL ECT * F rom {材料} Where [定额编码] = '" & dr("定额编码") & "'"
        dt = cmd.ExecuteReader(True)
        If dt.DataRows.Count > 0 Then
            Dim dr1 AS DataRow = dt.DataRows(0)
            dr1("成本价") = dr("入库单价")
            if dr1.isnull("运杂费") then
                 dr1("材料原价")=(dr1("成本价")*dr1("主材损耗率") * ( 1+dr1("利润率")+dr1("挂靠管理费率")))*(1+dr1("增值税率"))
            Else
                 dr1("材料原价")=((dr1("运杂费")+dr1("成本价")*dr1("主材损耗率") )* ( 1+dr1("利润率")+dr1("挂靠管理费率")))*(1+dr1("增值税率"))
            End if
            dt.Save()
        End If
[此贴子已经被作者于2016/10/5 7:14:41编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
yancheng
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:843 积分:5982 威望:0 精华:0 注册:2013/6/29 9:36:00
  发帖心情 Post By:2016/10/5 12:05:00 [只看该作者]

Sele ct Case e.DataCol.name
    Case "入库单价"
        Dim dr As DataRow = e.DataRow
        DataTables("材料").LoadFilter = "'" & dr("定额编码") & "'"
        DataTables("材料").LoadTop=""
        DataTables("材料").Load
        Dim s As Row = Tables("材料").Current
        If s IsNot Nothing Then
            s("成本价") = dr("入库单价")
            s.Save()
         MessageBox.SHOW(0)
        End If

我第一次用:小福星,的这个代码,放进去。 MessageBox.SHOW(0) ,弹:0.但是数据没改过来。  s("成本价") 没动?
奇怪,想知道为什么??

用狐爸的代码可以实现 。只是感觉如果:材料表中,要求:材料原价,变了,还有其它 代码执行,用这种方法可能还得加代码。是不是比较繁琐?

反应时间对比:1,小福星的那个代码,反应时间要:7S左右才行。 2、狐爸这个,马上就OK。

麻烦老师点评一下?


我返回到 table(材料)表,需要手动点一下:同步表,按钮,数据 才会刷新 出来。反应时间:10S,数据行:2万行。我感觉有时候 要刷新两次才行的样子。

我的同步表按钮代码如下:
Dim t As Table = CurrentTable
If t.IsRelation = False
    t.DataTable.Load()
End If

[此贴子已经被作者于2016/10/5 12:09:42编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2016/10/5 21:47:00 [只看该作者]

代码无所谓繁琐,能高效执行就行。
如果材料表只是2万行,何不全部加载?
全部加载的话,就可以常规编码了:
http://www.foxtable.com/webhelp/scr/1451.htm


 回到顶部