Foxtable(狐表)用户栏目专家坐堂 → 取值问题


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

主题:取值问题

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


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
取值问题  发帖心情 Post By:2009/12/25 18:41:00 [只看该作者]

  下列设计中用到“Tables("课时名单").Rows(i)("计分") =e.Form.Controls(Values(0)).Value”一句,其中“e.Form.Controls(Values(0)).Value”的值当前窗口输入的“星期一至星期日的值”,我现欲改为从“表A”的“正课”列中取星期一至星期日的值,不知怎样修改?请各位老师看看。谢谢!

表A:

月份

星期

正课

辅导

2009.11

星期一

3

3

2009.11

星期二

4

3

2009.11

星期三

4

3

2009.11

星期四

5

4

2009.11

星期五

3

4

2009.11

星期六

3

5

2009.11

星期日

4

5

 

 

'生成"课时名单"表

Dim ksmd As New DataTableBuilder("课时名单")

ksmd.AddDef("姓名", GetType(String), 15)

ksmd.AddDef("星期", GetType(String), 15)

ksmd.AddDef("计分", GetType(Integer))

ksmd.TableVisible = false

ksmd.Build()

 

'生成"课时名单"数据

Dim Values() As String

Dim n As Integer = Tables("课程表").rows.count

Dim n1 As Integer

for Each dc as Datacol in DataTables("课程表").Datacols

    if dc.name <> "班级" Then

        n1 = n1 +1

        dim f As New Filler

        f.SourceTable = DataTables("课程表") '指定数据来源

        f.SourceCols = dc.name '指定数据来源列

        f.DataTable = DataTables("课时名单") '指定数据接收表

        f.DataCols = "姓名" '指定数据接收列

        f.Distinct = false

        f.Fill() '填充数据

        Values = dc.name.split("_")

        For i As integer = (n*n1)-n to Tables("课时名单").rows.count -1

            Tables("课时名单").Rows(i)("星期") = Values(0)

            Tables("课时名单").Rows(i)("计分") =e.Form.Controls(Values(0)).Value

        Next

    end if

Next


[此贴子已经被作者于2009-12-25 18:42:08编辑过]

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/12/26 0:30:00 [只看该作者]

有点难为大家了。

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


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By:2009/12/26 0:56:00 [只看该作者]

我再仔细考虑一下,也许能解决问题。

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


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By:2009/12/26 10:27:00 [只看该作者]

以下是引用czy在2009-12-26 0:30:00的发言:
有点难为大家了。

解决不了,传上文件请老师看一下

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


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/12/26 11:12:00 [只看该作者]

'生成"课时名单"表
Dim ksmd As New DataTableBuilder("课时名单")
ksmd.AddDef("姓名", GetType(String), 15)
ksmd.AddDef("星期", GetType(String), 15)
ksmd.AddDef("计分", GetType(Integer))
ksmd.Build()
'生成"课时名单"数据
Dim Values() As String
Dim n As Integer = Tables("课程表").rows.count
Dim n1 As Integer
for Each dc as Datacol in DataTables("课程表").Datacols
    if dc.name <> "班级" Then
        n1 = n1 +1
        dim f As New Filler
        f.SourceTable = DataTables("课程表") '指定数据来源
        f.SourceCols = dc.name '指定数据来源列
        f.DataTable = DataTables("课时名单") '指定数据接收表
        f.DataCols = "姓名" '指定数据接收列
        f.Distinct = false
        f.Fill() '填充数据
        Values = dc.name.split("_")
        For i As integer = (n*n1)-n to Tables("课时名单").rows.count -1
            Dim dr As DataRow = DataTables("表A").Find("星期 = '" & Values(0) & "'")
            Tables("课时名单").Rows(i)("星期") = Values(0)
            Tables("课时名单").Rows(i)("计分") = dr("正课")
        Next
    end if
Next

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


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By:2009/12/26 13:14:00 [只看该作者]

记住了,谢谢老师指点。复习一下帮助中相关知识:
 

Find

 

在DataTable查找符合条件的行,如果找到的话,返回找到的行,否则返回Nothing。
如果有多个符合条件的行,默认返回第一个,也可以指定返回第几个符合条件的行。

语法:

Find(Filter,Sort,Index)

Filter:  条件表达式,请参考表达式的运算符和函数
Sort:    可选参数,指定排序方式。
Index:   可选参数,指定返回第几个符合条件的行。

示例一:

Dim dr As DataRow
dr =
DataTables("产品").Find("产品编号 = '03'") '找出编号为03的产品
With DataTables(
"订单")
    dr = .Find(
"产品 = 'PD01'","日期") '找出第一次订购PD01产品的记录
    dr = .Find(
"产品 = 'PD01'","日期",1) '找出第二次订购PD01产品的记录
End With

实例二:

有的时候,我们需要查找倒数第几行数据,例如最近一次订购某某产品的记录。
可以参考下面的代码:

Dim dr As DataRow
With DataTables("订单")
    dr
= .Find("产品 = 'PD01'","日期 Desc")
'找出最后一次订购PD01产品的记录
   
dr = .Find("产品 = 'PD01'","日期 Desc",1) '找出倒数第二次订购PD01产品的记录
End With

可以看到代码和原来几乎一样,唯一的变化是排序参数,被改为:日期 Desc
加上DESC使得日期按照降序排序,最后的日期排在最前面,我们所找出的第一条记录,就是最后一次订购产品PD01的记录。

示例三

通常应该在在代码中判断是否找到了符合条件的行,然后再运行后续的代码。
例如要找出最近一次订购产品数量超过1000的订单,并显示订单的日期和客户:

Dim dr As DataRow
dr =
DataTables("订单").Find("数量 > 1000","日期 Desc")
If
dr IsNot Nothing Then '如果找到的话
    Output.Show(
"日期:" & dr("日期"))
    Output.Show(
"客户:" & dr("日期"))

End If

 

如果我们不加上判断,直接:

Dim dr As DataRow
dr =
DataTables("订单").Find("数量 > 1000","日期 Desc")
Output.Show(
"日期:" & dr("日期"))
Output.Show(
"客户:" & dr("日期"
))

 

一旦订单表并不存在订购数量超过1000的订单,那么Find方法返回Nothing,导致后续代码运行出错。




Find函数只能找出一条符合条件的行,如果要同时找出所有符合条件的行,可以使用Select方法。

Select

以集合的形式,返回所有符合指定条件的行。

语法:

Select(Filter)
Select(Filter,Sort)

Filter: 条件表达式,请参考表达式的运算符和函数
Sort: 可选参数,指定排序方式

我们经常需要对符合某一条件的记录,统一进行处理,此时Select方法就派上用场了。

例如,对于1999年1月4日订购PD01的订单,希望将其折扣统一设置为0.12,代码为:

Dim drs As List(Of DataRow)
drs = DataTables("订单").Select("[产品] = 'PD01' And [日期]= #1/4/1999#")
For Each
dr As Datarow In drs
    dr("折扣") = 0.12

Next

再例如,希望列出1999年1月4日订购PD01的客户,按订购的数量排序:

Dim drs As List(Of DataRow)
drs = DataTables("订单").Select("[产品] = 'PD01' And [日期]= #1/4/1999#","数量 DESC")
For Each
dr As Datarow In drs
    Output.show(dr("客户"))

Next

下面是一个典型的应用,在一个成绩表中,包括班级、姓名、总分、总分排名几列数据,希望按班级自动生成总分排名:

'获得所有班级名称,保存在集合中
Dim
bjs As List(Of String) = DataTables("成绩表").GetUniqueValues("","班级")
For Each
bj As String In bjs
   
'获得该班级的全部行,按总分降序排序
    Dim
drs As List(Of DataRow) = DataTables("成绩表").Select("[班级] = " & bj, "总分 DESC")
   
For n As integer = 0 To drs.Count - 1 '遍历所有行
       
If n > 0 AndAlso drs(n)("总分") = drs(n-1)("总分") Then '如果总分和上一行相同
            drs(n)(
"总分排名") = drs(n-1)("总分排名") '则排名等于上一行
       
Else
            drs(n)(
"总分排名") = n + 1 '设置排名
       
End If
   
Next
Next

上面的例子,可以参考CaseStudy目录下的文件:成绩排名.Table

 


 回到顶部