Foxtable(狐表)用户栏目专家坐堂 → 【求助】关于动态加载后出现的问题


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

主题:【求助】关于动态加载后出现的问题

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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
【求助】关于动态加载后出现的问题  发帖心情 Post By:2013/3/4 11:15:00 [显示全部帖子]

If e.DataCol.Name = "数量_本次交"
    DataTables("客户订单主表").LoadFilter = "客户订单编号 = '" & e.DataRow("客户订单编号") & "'"
    DataTables("客户订单主表").Load()
    If DataTables("客户订单主表").DataRows.Count = 0 Then '如果订单表没有数据
        DataTables("客户订单子表").LoadFilter = "客户订单编号 Is Null" '不加载订单明细
    Else
        Dim ids As String
        For Each dr1 As DataRow In DataTables("客户订单主表").DataRows
            ids = ids & ",'" & dr1("客户订单编号") & "'"
        Next
        ids= ids.Trim(",")
        DataTables("客户订单子表").LoadFilter = "客户订单编号 In (" & ids & ")"
    End If
    DataTables("客户订单子表").LoadTop = ""
    DataTables("客户订单子表").Load()
    Dim dr As DataRow = DataTables("客户订单子表").Find("客户订单编号 = '" & e.DataRow("客户订单编号") & "'And OPN ='" & e.DataRow("料号") & "'")
    DataTables("产品资料子表").LoadFilter = "料号 = '" & e.DataRow("料号") & "'"
    DataTables("产品资料子表").load()
    Dim cr As DataRow = DataTables("产品资料子表").Find("料号 = '" & e.DataRow("料号") & "'")
    DataTables("销售出库单子表").LoadFilter ="客户订单编号 = '" & e.DataRow("客户订单编号") & "'"
    'DataTables("销售出库单子表").load()
  Dim v As Integer = DataTables("销售出库单子表").Compute("sum(数量_本次交)","客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'")

    For Each pr As DataRow In DataTables("销售出库单子表").Select("客户订单编号 = '" & e.DataRow("客户订单编号") & "' And 料号 ='" & e.DataRow("料号") & "'")
        pr("数量_累交数") =  v
        pr("数量_未交数") = e.DataRow("数量_订单数")-v
    Next
    dr("累交数") = e.DataRow("数量_累交数")
    dr("未交数") = dr("数量")-dr("累交数")
    cr("当前库存") = cr("当前库存")- e.NewValue+e.OldValue
    DataTables("客户订单主表").LoadFilter ="客户订单编号 = '" & e.DataRow("客户订单编号") & "'"
    DataTables("客户订单主表").load()
    Dim vr As DataRow = DataTables("客户订单主表").Find("客户订单编号 = '" & e.DataRow("客户订单编号") & "'")
    Dim temp As Integer = DataTables("客户订单子表").Compute("sum(未交数)","客户订单编号 = '" & e.DataRow("客户订单编号") & "'")
    If temp > 0 Then
        vr("结案")  = False
    Else
        vr("结案") = True
    End If
End If

 

==========================================

这段代码写在Datacolchanged事件里

我需要通过“数量_本次交”的事件来更新{客户订单子表},{客户订单主表},{产品资料子表},{销售出库单子表}的相关数据

问题处在标红的这句代码上

如果没有这句,后台的数据无法加载到前台来进行COMPUTE的统计,会导致数据出错,如果有这句,compute的代码又无法执行出错,因为当前数据被刷新,想到用SQL的UPDATE来写,后面的代码又涉及到更复杂的逻辑,不知道怎么办了

[此贴子已经被作者于2013-3-4 11:16:38编辑过]

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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 11:28:00 [显示全部帖子]

以下是引用muhua在2013-3-4 11:20:00的发言:

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "SELECT DISTINCT Name From {Users}"
dt = cmd.ExecuteReader()

 

通过这种方法来获取外部数据源表

 

 

也就是

 

Dim v As Integer = DataTables("销售出库单子表").Compute("sum(数量_本次交)","客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'")

 

换成:

 

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "SELECT * From {销售出库单子表} where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'"
dt = cmd.ExecuteReader()

Dim v As Integer = dt.Compute("sum(数量_本次交)","")

 

这个方法只能查询,我需要的是同时把后台数据给替换掉,你看这句

For Each pr As DataRow In DataTables("销售出库单子表").Select("客户订单编号 = '" & e.DataRow("客户订单编号") & "' And 料号 ='" & e.DataRow("料号") & "'")
        pr("数量_累交数") =  v
        pr("数量_未交数") = e.DataRow("数量_订单数")-v
    Next

如果我用UPDATE来直接更新后台数据的话

dr("累交数") = e.DataRow("数量_累交数")
    dr("未交数") = dr("数量")-dr("累交数")

...

等等这些值的更新又会涉及到当前行是新增的还是在已经在数据库里的判断,非常复杂,我昨晚上全部用COMMAND写的,自己都看晕了,也没完成,我把代码也贴一下吧

所以今天我想把数据加载到前台来,统计完了后保存到后台去,这样子最方便,可是就碰到上面的问题

=================

If e.DataCol.Name = "数量_本次交" Then
    Dim dt As DataTable
    Dim cmd As New SQLCommand
    cmd.C
    cmd.CommandText = "select * from {客户订单子表} where 客户订单编号 ='" & e.DataRow("客户订单编号") & "' And OPN ='" & e.DataRow("料号") & "'"
    dt = cmd.ExecuteReader '生成客户订单子表
    Dim dr As DataRow = dt.Find("客户订单编号 ='" & e.DataRow("客户订单编号") & "'And OPN ='" & e.DataRow("料号") & "'")
msgbox(dr("OPN"))
    Dim cmd1 As New SQLCommand
    cmd1.C
    cmd1.CommandText ="select * from {销售出库单子表} where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'"
    Dim dt1 As DataTable = cmd1.ExecuteReader ' 生成销售出库单子表
    Dim v As Integer = dt1.Compute("sum(数量_本次交)","客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'")
msgbox(v)  
 Dim cmd2 As New SQLCommand
    cmd2.C
    cmd2.CommandText = "UPDATE {销售出库单子表} SET 数量_未交数 = V 数量_未交数 = '" & e.DataRow("数量_订单数") & "' - v Where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'"
    Dim dr1 As DataRow = dt1.Find("_Identify ='" & e.DataRow("_Identify") & "'")
    If dr1 Is Nothing Then
        e.DataRow("数量_累交数") = V + e.NewValue
    Else
        e.DataRow("数量_累交数") =V + e.NewValue -e.OldValue
    End If
    e.DataRow("数量_未交数") =  e.DataRow("数量_订单数") - e.DataRow("数量_累交数")
    Dim cmd3 As New SQLCommand
    cmd3.C
    cmd3.CommandText ="UPDATE {客户订单子表} SET 累交数 = V 未交数 = 数量-v Where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'And OPN ='" & e.DataRow("料号") & "'"
    Dim cmd4 As New SQLCommand
    cmd4.C
    cmd4.CommandText = "UPDATE {产品资料子表} SET 当前库存= 当前库存 - '" & e.NewValue & "' +  '" & e.OldValue & "' where 料号 ='" & e.DataRow("料号") & "'"
    Dim cmd5 As New SQLCommand
    cmd5.C
    Dim temp As Integer = dt.Compute("sum(未交数)","客户订单编号 = '" & e.DataRow("客户订单编号") & "'")
    If temp > 0 Then
        cmd5.CommandText = "UPDATE {客户订单主表} SET 结案 = 0 where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'"
    Else
        cmd5.CommandText = "UPDATE {客户订单主表} SET 结案 = 1 where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'"
    End If
End If

 



 

[此贴子已经被作者于2013-3-4 11:28:24编辑过]

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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 11:32:00 [显示全部帖子]

我做个简单的例子吧,很简单,就是把所有的表加载条件设置为[_Identify] Is Null后可以达到我全部加载后的效果

全部加载后的代码我已经写好了

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:库存演算.foxdb


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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 11:35:00 [显示全部帖子]

狐狸爸爸,我不知道是自己还有地方没看到,还是狐表关于动态加载的设计还有待完善的地方,在动态加载后需要同步更新后台数据方面我真的感觉太吃力了


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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 15:08:00 [显示全部帖子]

顶!

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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 15:12:00 [显示全部帖子]

以下是引用狐狸爸爸在2013-3-4 15:10:00的发言:
下次更新,给ExcuteReader生成的表,加上Save功能吧。

那现在,狐爸爸,我的问题要如何解决呢?现在卡这了...


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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 15:16:00 [显示全部帖子]

以下是引用狐狸爸爸在2013-3-4 15:12:00的发言:

此外,计算也并非一定要加载才能计算啊,也可以用SQL语句直接计算后台数据的。

是后面的代码要更新的,这一句是可以用后台直接统计,后面的for..next里就是涉及到很麻烦的问题了,我上面跟帖有说的


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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 16:28:00 [显示全部帖子]

以下是引用狐狸爸爸在2013-3-4 15:48:00的发言:

如果有这句,compute的代码又无法执行出错

 

这是什么意思?

因为load后,前台数据同时被刷新,系统提示此行已经被移除。。。


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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 17:09:00 [显示全部帖子]

以下是引用muhua在2013-3-4 16:03:00的发言:

For Each pr As DataRow In DataTables("销售出库单子表").Select("客户订单编号 = '" & e.DataRow("客户订单编号") & "' And 料号 ='" & e.DataRow("料号") & "'")
    pr("数量_累交数") = v
    pr("数量_未交数") = e.DataRow("数量_订单数")-v
Next

 

 

改为这样:

 

 

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.Connection Name = "User"
cmd.CommandText = "update {销售出库单子表} set [数量_累交数] = '" & v & "', 数量_未交数 = '" & e.DataRow("数量_订单数")-v & "' where 客户订单编号 = '" & e.DataRow("客户订单编号") & "' And 料号 ='" & e.DataRow("料号") & "'"
cmd.ExecuteNonQuery

 

 

[此贴子已经被作者于2013-3-4 16:03:31编辑过]

老大,你这写法有问题,举个简单的例子

客户订单数50个,在后台数据里已经有一张此张订单的销售出库单,交了30个,所以在后台的V值(累交数)是30个,未交数是20个

新增一行,数量_本次交 填10个,

Dim dt As DataTable
    cmd.C
    cmd.CommandText = "SELECT * From {销售出库单子表} where 客户订单编号 = '" & e.DataRow("客户订单编号") & "'And 料号 ='" & e.DataRow("料号") & "'"
    dt = cmd.ExecuteReader()
    Dim v As Integer = dt.Compute("sum(数量_本次交)")  

用上述代码取V值,这个V值是后台的V值,就是30个,[数量_累交数] = '" & v & "',应该是 '" & e.NewValue + v & "  [e.NewValue]是数量_本次交的值

如果我没有保存的情况下改变了这个值呢? 假设e.Oldvalue=10这个时候[数量_累交数]的值在后台已经改变了,变成了40,假设e.NewValue是12,后台的V值就变成了52个,数据不对,如果用  '" & e.NewValue-e.oldvalue + v & "  = 12-10+40 =42个

===========

问题1:在 update {销售出库单子表} set [数量_累交数] = '" & e.NewValue-e.oldvalue + v & "', 数量_未交数 = '" & e.DataRow("数量_订单数")-v & "'

V的值是根据e.Newvalue随时变化的,set列有顺序之分吗?如果是同时的话,数量_未交数 显示不正确,刚才测试了下,好像真是同时发生的,数据依然不对...

 


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


加好友 发短信
等级:幼狐 帖子:186 积分:1294 威望:0 精华:0 注册:2011/8/17 17:29:00
  发帖心情 Post By:2013/3/4 17:23:00 [显示全部帖子]

以下是引用狐狸爸爸在2013-3-4 17:11:00的发言:

我无法理解的问题,我不明白为什么要这样设计。

 

做个简单的例子,将问题的关键点提炼出来。

狐爸,第一页我已经上传了例子啊,这种情况在业务流程中很常见啊,我在填写出库单的时候要知道这张订单已经交了多少,还没有交多少,累交了多少,以及在导入出库单的时候把已经交完的客户订单筛选掉

在例子的出库单这张表里我已经写好了在全部加载的情况下的语句,你改变下本次交数量的值就明白了

我在实际项目中是用SQL动态加载的数据,就会出现一张订单分多次交,比如一张订单分了2次交,第二次新增出库单的时候第一次的出库单又没有加载到前台来

其实如果可以COMMAND出来的dt可以直接保存数据最简单,现在不行的情况,我只能想到现在这种笨办法,但是逻辑太复杂了。。我直接晕了


 回到顶部
总数 12 1 2 下一页