Foxtable(狐表)用户栏目专家坐堂 → [求助]表A中选择多行后,在表B中找出对应行并替换某列数值?


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

主题:[求助]表A中选择多行后,在表B中找出对应行并替换某列数值?

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


加好友 发短信
等级:一尾狐 帖子:431 积分:2808 威望:0 精华:0 注册:2008/9/1 8:46:00
[求助]表A中选择多行后,在表B中找出对应行并替换某列数值?  发帖心情 Post By:2008/12/15 11:01:00 [只看该作者]

假定表A和表B都有品名、型号两列,我们在表A中选择了一行,希望从表B中找出相同品名、规格的行:

Dim dr1 As DataRow = Tables("表A").Current.DataRow
Dim dr2 As DataRow
dr2 = DataTables("表B").Find("[品名] = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'")


   帮助中的上述代码可以实现在表A中选定一行后,在表B中找到对应的行。
  
   我想参照引用的代码来实现:先在表A中选择满足条件的所有行(十几个行),然后在表B中依次找到对应行后,将“客户”列内容改成“PPP”:

Dim drs As List(Of DataRow)
drs = DataTables("表A").Select("[品名] = 'PD01' ")


Dim dr2 As DataRow
dr2 = DataTables("表B").Find("[品名] = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'")

dr2("客户")="PPP"

    请高手加上二个循环,实现在二个表中的循环操作。不知道能否说明白,即是将原来功能中的选定一行改成选定多行,再执行查找,找到后将客户列内容改成“PPP”。

    谢谢各位高人!!
  


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


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2008/12/15 11:25:00 [只看该作者]

Dim T As String
Dim dr1,dr2 As DataRow

Dim drs As List(Of DataRow)
drs = DataTables("表A").Select("[品名] = 'PD01'")


for Each dr1 in drs
    T = "[品名] = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'"   
    dr2 = DataTables("表B").Find(T)
    dr2("客户")="PPP"
Next


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


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19223 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2008/12/15 13:31:00 [只看该作者]

画蛇添足一下,考虑到dr2可能没有找到的情况,添加一个判断

Dim T As String
Dim dr1,dr2 As DataRow

Dim drs As List(Of DataRow)
drs = DataTables("表A").Select("[品名] = 'PD01'")


for Each dr1 in drs
    T = "[品名] = '" & dr1("品名") & "'And [规格] = '" & dr1("规格") & "'"   
    dr2 = DataTables("表B").Find(T) 
    if dr2 IsNot Nothing then
       dr2("客户")="PPP"
    end if
Next


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


加好友 发短信
等级:一尾狐 帖子:431 积分:2808 威望:0 精华:0 注册:2008/9/1 8:46:00
  发帖心情 Post By:2008/12/15 16:38:00 [只看该作者]

     回来晚了,先试试看,谢谢二位顶力帮助!!

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


加好友 发短信
等级:小狐 帖子:324 积分:3807 威望:0 精华:0 注册:2008/9/1 7:34:00
  发帖心情 Post By:2008/12/16 7:44:00 [只看该作者]

提两个问题:
1、若“表A”中有一字符型列“物品编号”,现要求根据“品名”和“规格”在“表B”中自动填写“物品编号”,请问该怎样修改2楼设计?
2、若在窗口设计中,先选择“品名”,再点击按纽“自动填写‘物品编号’”,又该怎样设计?

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


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

不管是窗口,还是表格,自动输入的代码都一样。


自动输入的实现

实现自动输入的基本原理是:

1、有一个基础数据表,输入所有的基础信息,例如订单管理系统中,产品表会输入所有的产品信息。
2、在另一个表输入某关键列的内容,然后自动从基础数据表提取其它列的内容输入到相关列中,例如在订单表输入产品编号,可以从产品表提取该产品的名称、型号、规格,自动输入到订单表的相关列中。

示例一

例如希望在订单表输入产品编号,能够从产品表提取该产品的名称、型号、规格,自动输入到订单表的相关列中。
为实现此目的,可在订单表的
DataColChanged事件中输入如下代码:

If e.DataCol.Name = "产品编号" Then '发生变化的是产品名称吗?
    '在产品表找出该产品
   
Dim dr As DataRow = DataTables("产品").Find("编号 = " & "'" & e.DataRow("产品编号") & "'" )
   
If dr IsNot Nothing '如果找到, 则设置各列内容
        e.
DataRow("品名")= dr("品名")
        e.
DataRow("型号")= dr("型号")
        e.
DataRow("规格")= dr("规格")
   
End If
End
If

示例二

假定项目中有一个名为“行政区域”的基础数据表,分别是省市、市县、区号、邮编,这个表已经输入了全国所有县级行政区域的资料;现在我们在客户表中输入数据,假定客户表也有这么四列,希望输入省市、县市两列的内容后,区号、邮编能够自动输入。

为实现此目的,可在客户表的DataColChanged事件中输入如下代码:

'如果刚刚输入的不是省市或县市列
If
e.DataCol.Name <> "省市" AndAlso e.DataCol.Name <> "县市" Then
    Return
'则返回
End
If
'如果省市或县市列的内容为空

If
e.DataRow.IsNull("省市") OrElse e.DataRow.IsNull("县市") Then
   
'则清除区号和邮编两列的内容
    e.
DataRow("区号") = Nothing
    e.
DataRow("邮编") = Nothing
    Return
'然后返回
End
If
Dim
dr As DataRow
'在行政区域表查找所输入省市?县市的行

dr =
DataTables("行政区域").Find("[省市] = '" & e.DataRow("省市") & "' And [县市] = '" & e.DataRow("县市") & "'")
If
dr IsNot Nothing Then '如果找到
    '将找到行的区号?邮编内容填入到正在输入的行中.

    e.
DataRow("区号") = dr("区号") '
    e.
DataRow("邮编") = dr("邮编")
End
If

代码有点长,但是逻辑很清晰,配合注释,你应该很容易理解。


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


加好友 发短信
等级:小狐 帖子:324 积分:3807 威望:0 精华:0 注册:2008/9/1 7:34:00
  发帖心情 Post By:2008/12/16 11:27:00 [只看该作者]

6楼方式特别管用,现阶段侧重于学习,指出参考内容即可.

顺便指点建议:由于大家都很忙,论坛回答问题"多指点参考目录即可,让提问者思考问题",若经指点还不能解决问题,再给答案.

 回到顶部