以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [已解决]求助多表合并方法。  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=100923)

--  作者:husl
--  发布时间:2017/5/21 15:28:00
--  [已解决]求助多表合并方法。
 有表A 表B
A表
 ID 
  名称
  单价  
   1   A   15
   2B   20

B表
 ID 
  数量
   1   3
  2
   4

请教怎么用代码直接生成  窗口表 C
ID
名称
单价
数量
合计
1
A
14
3
42
2
B
20
4
80

我在窗口中添加列这样写,但是数量这里咋办呢?。
With tb.DataTable.DataCols    \'tb我定义的是表A
    .Add("数量",Gettype(Double), "")
    .Add("合计",Gettype(Double), "ISNULL([单价],0)*ISNULL([数量],0)")
End With

求教。,。。




【解决办法】
找了半天方法,最后做了关联

只是不知道还有没有别的好办法了。类似于 left join 一样的。

 Relations.Add("po",表A.DataTable.DataCols("ID"),表B.DataTable.DataCols("ID"))
With tb.DataTable.DataCols    \'tb我定义的是表A
    .Add("数量",Gettype(Double), "sum(Child(po).数量")
    .Add("合计",Gettype(Double), "ISNULL([单价],0)*ISNULL([数量],0)")
End With
 Relations.Delete("po")





[此贴子已经被作者于2017/5/21 16:29:46编辑过]

--  作者:有点蓝
--  发布时间:2017/5/22 8:49:00
--  
如果需要编辑数据的,只能使用关联表

不需要编辑的,可以使用sqlquery表,用sql直接 left join即可

--  作者:husl
--  发布时间:2017/5/22 10:16:00
--  
 老师好,。主要是我的 A,B 表是内部函数生成的,函数定义的就是个Table,满足一大串条件之后,然后再 XX.fill(select ***) 生成的一堆表中选的两个临时表,,窗口中通过Functions.Execute引用的,目前想不到别的办法,除非把函数都改掉,但是工程太大。。。另外因为 select 语言太长,。我直接在SQL server 生成视图都可以的,但是在foxtable中经常出现莫名其妙的错误。。所以有的表是 SQL语句生成的,有的是视图。
就是这样得出来的 A表和 B表。
表c不需要编辑,有没有别的啥办法呢?


[此贴子已经被作者于2017/5/22 10:20:17编辑过]

--  作者:有点色
--  发布时间:2017/5/22 10:21:00
--  

 你的表A和表B直接连接查询不就行了?类似

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=100766&skin=0

 


--  作者:husl
--  发布时间:2017/5/22 11:00:00
--  
 额。这个例子。

Dim sql1 As String = "select 反馈完成日 as 日期, 样办数量 as 反馈, 0 as 计划 from (" & sql4 & ") union all select 计划完成日, 0, 样办数量 from (" & sql5 & ")"



from (“ & sql4 & ”)  
其中的SQL4 是 String,但是我的  Functions.Execute  定义的   是table.fill(****)  

求教。这个怎么写呢。


--  作者:有点蓝
--  发布时间:2017/5/22 11:57:00
--  
Dim sql1 As String = "select 反馈完成日 as 日期, 样办数量 as 反馈, 0 as 计划 from (" & sql4 & ") union all select 计划完成日, 0, 样办数量 from (" & sql5 & ")"
table.fill(sql,true) 

--  作者:有点色
--  发布时间:2017/5/22 12:04:00
--  

 回复5楼,你用一个变量记录对应表的sql语句吧,比如

 

vars("表A") = sql语句

 

 你的问题,同样可以用代码解决。填充表内容,可以这样写

 

For Each r As row in Tables("表C").Rows

    Dim fdr As DataRow = DataTables("表B").Find("id = \'" & r("id") & "\'")

    If fdr isnot nothing then

        r("数量") = fdr("数量")

    End If

Next


--  作者:husl
--  发布时间:2017/5/22 16:16:00
--  

谢谢了老师们的耐心解答 。但是貌似 不在一个频道。。。还是我没理解。。。我的表A和B 是用 这样的 内部函数 得出来的
Dim a As Table =Args(0)
……………………
 a.DataTable.Fill("select ************)

窗口中的表 A,和B是
Functions.Execute(“a”,A)
Functions.Execute(“****”,B)

还有一个就是空的 table控件。 目的是在这个 table里面 生成 表C

上面的方法貌似不行吧?。除非修改内部函数 定义一个  String
然后 用 下面的方法。。
Dim sql1 As String = "select 反馈完成日 as 日期, 样办数量 as 反馈, 0 as 计划 from (" & sql4 & ") union all select 计划完成日, 0, 样办数量 from (" & sql5 & ")"
table.fill(sql,true)

是这样吗?






--  作者:有点色
--  发布时间:2017/5/22 16:52:00
--  

 用两个全局变量记录生成你a表、b表的sql语句,这样你可以直接写sql语句生成表C了。

 

 你也可以写代码处理,不就是把数量列填充过去而已嘛?类似代码

 

For Each r As row in Tables("表C").Rows

    Dim fdr As DataRow = DataTables("表B").Find("id = \'" & r("id") & "\'")

    If fdr isnot nothing then

        r("数量") = fdr("数量")

    End If

Next


--  作者:husl
--  发布时间:2017/5/22 16:57:00
--  

好的,明白了。谢谢!!