以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关联表数据怎样调用  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=43741)

--  作者:zhangc2000
--  发布时间:2013/12/13 22:00:00
--  关联表数据怎样调用
请问:我需要通过编程获取关联表中的数据,怎样处理?

如:主表A(企业信息)与关联表B(产品信息)通过企业编号进行关联,而表B与表C(产品销售情况)也是关联关系,通过产品编号关联。
我要在A表中选择查看产品销售情况,但不知使用怎样的语句。

在查看B表信息,我一般采用Find和Select语句(企业代码是从表A中传递过来的):
If DataTables("表B").find("[企业代码] = 100001") IsNot Nothing Then
   drs = DataTables("表B").Select("[企业代码] = 100001l", "结算日期")
   。。。
End If 

由于关联字段不一样(表A和表B是企业代码,表B和表C是产品编号)那么,查看表C时,怎么写代码?

我不知道是否把我的问题描述清楚了

请指教。



--  作者:有点甜
--  发布时间:2013/12/13 22:13:00
--  
 方法一:在表C加一列 企业代码,和表A关联。

 方法二:代码类似

If DataTables("表B").find("[企业代码] = 100001") IsNot Nothing Then
    drs = DataTables("表B").Select("[企业代码] = 100001l", "结算日期")
    For Each dr As DataRow In drs
        For Each cdr As DataRow In DataTables("表C").Select("产品编号 = \'" & dr("产品编号") & "\'")
            
        Next
    Next
End If

--  作者:zhangc2000
--  发布时间:2013/12/14 16:40:00
--  
若采用方法二,我添加了绘图的一些代码,好像还有点问题,能否帮我看看:
Dim n as Integer = 0
If DataTables("表B").find("[企业代码] = 100001") IsNot Nothing Then 
   drs = DataTables("表B").Select("[企业代码] = 100001", "结算日期")         
   For Each dr As DataRow In drs
      For Each cdr As DataRow In DataTables("表C").Select("产品编号 = \'" & dr("产品编号") & "\'")
         Series.X(i) = i
         Series.Y(i) = cdr("A产品销售收入")
         Chart.AxisX.SetValueLabel(i, cdr("结算日期")) 
         i = i + 1
      Next
   Next 
End If

谢谢


--  作者:有点甜
--  发布时间:2013/12/14 22:37:00
--  
 呃,你的意思是 按照产品编号 分别统计 销售收入吧?

 直接用统计就行了吧?


--  作者:horseroom
--  发布时间:2013/12/14 22:52:00
--  
我的理解,其实数据关联和你编程没关系,关联表其实就是系统内部的一个编程而已,不是数据库的一部分。
你就正常查询数据表就行了。
Datatable的查询,就是select方法,和“for each 对象 in 对象组”  的配合使用。

Datatable是对象“表”,Datatables是对象(表)组。

Dim drs As List(Of DataRow)     \'这个是行组(你可以理解为datarows)
drs = DataTables("订单").Select("[产品] = \'PD01\' And [日期]= #1/4/1999#")     \'这个就是选出符合条件的行。


Dim dr As DataRow    \'这个就是行

For each dr in drs       \'这句其实就是把drs行组的每一行都看一遍,dr就是行。

dr("字段名")    \'这个就是具体这行对应字段的值的引用方法。


后面你就嵌套而已。





--  作者:zhangc2000
--  发布时间:2013/12/15 11:37:00
--  
感谢
--  作者:zhangc2000
--  发布时间:2013/12/15 16:58:00
--  
我还是没有绕过来。
因为C表数据没有办法直接通过A表查询,它与A表没有直接关联,在设置Select方法时,不知道语句怎么写。
我的理解是:我首先要找到B表的信息,才能根据B表与C表的关系,找到C表的数据。但是写出的程序老说“未将对象引用设置到对象的实例”。程序如下:
Dim zh As DataRow
Dim drs As List(of DataRow)
If e.Form.controls("产品名称").text IsNot Nothing Then  ’从窗口组合框中选择产品名称
   If DataTables("表B").find("[企业代码] = \'100001\'") IsNot Nothing Then  ‘从表A传递过来企业编号100001
     zh = DataTables("表B").find("[产品名称] = \'" & e.Form.controls("产品名称").text & "\'")  ’找到表B中与窗口输入的产品相符的数据行
     cdcpbh = zh("产品编号") \'传递产品编号     ‘将该数据行的与表C关联的产品编号字段传递
     If DataTables("表C").find("[产品编号] = \'" & cdcpbh & "\'") IsNot Nothing Then
        drs = DataTables("主营产品业绩").Select("[产品编号] = \'" & cdcpbh & "\'","结算日期")  ’找到所有符合的行
        Dim i As Integer = 0  ‘下面是绘图部分
        For Each dr As DataRow In drs
           Series.X(i) = i
           Series.Y(i) = dr("产品销售收入")
           Chart.AxisX.SetValueLabel(i, dr("结算日期")) \'指定字符表示
           i = i + 1
        Next
     Else
        MessageBox.Show("没有这个企业信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
     End If
   End If
End If

帮我看一下,哪里错了。我感觉第四行好像不对,但也没有其他的方法传递数据。
另:是否可通过Table 的一些方法,将关联表的数据找到,而不需要通过DataTable。但我对Table 怎样找数据的语句不熟悉。
谢谢



--  作者:有点甜
--  发布时间:2013/12/15 19:28:00
--  
 我猜是这样写,实在不行,就上传一个例子吧。

Dim zh As DataRow
Dim drs As List(of DataRow)
If e.Form.controls("产品名称").text > "" Then  \'从窗口组合框中选择产品名称
    zh = DataTables("表B").find("[企业代码] = \'100001\' and [产品名称] = \'" & e.Form.controls("产品名称").text & "\'")  \'找到表B中与窗口输入的产品相符的数据行
    If zh IsNot Nothing Then  \'从表A传递过来企业编号100001
        Dim cdcpbh As String = zh("产品编号") \'传递产品编号
        drs = DataTables("主营产品业绩").Select("[产品编号] = \'" & cdcpbh & "\'","结算日期")  \'找到所有符合的行    
        If drs.Count > 0 Then
            Dim i As Integer = 0  \'下面是绘图部分
            For Each dr As DataRow In drs
                Series.X(i) = i
                Series.Y(i) = dr("产品销售收入")
                Chart.AxisX.SetValueLabel(i, dr("结算日期")) \'指定字符表示
                i = i + 1
            Next
        Else
            MessageBox.Show("没有这个企业信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If   End If
    End If
End If

--  作者:zhangc2000
--  发布时间:2013/12/15 22:23:00
--  
我试了上面给的程序,还是不行,我编了一个简单的例子,请把我上传的例子调出来。
先谢了。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目3.zip


--  作者:有点甜
--  发布时间:2013/12/15 22:43:00
--  
 打开例子,下面的代码

\'以下程序是需要将给定企业(100001)的指定产品的销售情况用图表展示出来
Dim jg As String = e.Form.controls("ComboBox1").text
If jg > "" Then  \'从窗口组合框中选择产品名称
    Dim Chart As WinForm.Chart \'定义一个图表变量
    Dim Series As WinForm.ChartSeries \'定义一个图系变量
    Chart = e.Form.Controls("Chart1") \' 引用窗口中的图表
    Chart.SeriesList.Clear() \'清除图表原来的图系
    Series = Chart.SeriesList.Add() \'增加一个图系
    Chart.AxisX.ClearValueLabel \'清除所有通过SetValueLabel设置的数值字符标示
    Chart.LegendVisible = False \'不显示图列
    Dim drs As List(of DataRow)
    Dim zh As DataRow = DataTables("表B").find("[企业编号] = \'100001\' and [产品名称] = \'" & jg & "\'")  \'找到表B中与窗口输入的产品相符的数据行
    If zh IsNot Nothing Then  \'从表A传递过来企业编号100001
        Dim cdcpbh As String = zh("产品编号") \'传递产品编号
        drs = DataTables("表C").Select("[产品编号] = \'" & cdcpbh & "\'","结算日期")  \'找到所有符合的行
        series.Length = drs.Count
        If drs.Count > 0 Then
            Dim i As Integer = 0  \'下面是绘图部分
            For Each dr As DataRow In drs
                Series.X(i) = i
                Series.Y(i) = dr("销售收入")
                Chart.AxisX.SetValueLabel(i, dr("结算日期")) \'指定字符表示
                i = i + 1
            Next
            Chart.AxisX.AnnoWithLabels = True \'启用字符标示
        Else
            MessageBox.Show("没有这个企业信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End If
End If