Foxtable(狐表)用户栏目专家坐堂 → 求助:下列FOXTABLE文件中“课时变化”表中的“正课统计”按纽公式如何设置?


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

主题:求助:下列FOXTABLE文件中“课时变化”表中的“正课统计”按纽公式如何设置?

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


加好友 发短信
等级:贵宾 帖子:102 积分:880 威望:0 精华:4 注册:2008/8/31 21:47:00
  发帖心情 Post By:2008/11/10 2:43:00 [显示全部帖子]

不知是否理解正确。可以调整一下思路.原来的表1取消,增加一个表“课时名单”作为过度表,为“另表”和“流水表”计算做准备。代码如下。速度很快的,我的电脑耗时4秒。

e.Form.Controls("Label1").text="稍等..."
dim timestart,timeend as date
timestart=date.now
dim s as string ="上午,下午,读报"
dim h as integer =0
DataTables("课时名单").DataRows.Clear()
For Each dr As DataRow In DataTables("课时变化").DataRows
    if dr("正课_星期") isnot nothing  then
        dim ksweek as string =dr("正课_星期")
        for Each dc as Datacol In DataTables("课时变化").Datacols
            if dc.name.IndexOf("_") >0 then
                dim ksspan as string =dc.name.split("_")(1)
                if s.IndexOf(ksspan)>=0 then
                    if dr(dc.name)=true then
                        For Each drkc As DataRow In DataTables("课程表").DataRows
                            for Each dckc as Datacol in DataTables("课程表").Datacols
                                if ksspan="读报" then
                                    ksspan="班主任"
                                end if
                                if dckc.name.IndexOf(ksweek)>=0 and dckc.name.IndexOf(ksspan)>=0 and  drkc(dckc) isnot nothing  then
                                    for j as integer =0 to (drkc(dckc) & "/") .split("/").Length - 1                                       
                                        if (drkc(dckc) & "/") .split("/")(j) <> "" then
                                            Dim drmd As DataRow
                                            h=h+1
                                            drmd = DataTables("课时名单").DataRows.AddNew()
                                            drmd("星期") = ksweek
                                            drmd("时段") = ksspan
                                            drmd("姓名") = (drkc(dckc) & "/") .split("/")(j).Replace("DU","")
                                            IF (drkc(dckc) & "/") .split("/").Length >2 OR (drkc(dckc) & "/").split("/")(j).IndexOf("DU")>=0
                                                drmd("计分") = 0.5
                                            ELSE
                                                 drmd("计分") = 1
                                            END IF
                                        end if   
                                    next                                   
                                end if
                            next
                        next
                    end if
                end if
            end if
        next
    end if
next
DataTables("另表").DataRows.Clear()
dim f As New Filler
f.SourceTable = DataTables("课时名单") '指定数据来源
f.SourceCols = "姓名"   '指定数据来源列
f.DataTable = DataTables("另表") '指定数据接收表
f.DataCols = "姓名" '指定数据接收列
f.Fill() '填充数据
DataTables("另表").datacols("出现次数").Recalc()

DataTables("流水表").DataRows.Clear()
f.DataTable = DataTables("流水表") '指定数据接收表
f.DataCols = "正课_姓名"  '指定数据接收列
f.Fill() '填充数据
DataTables("流水表").datacols("正课_课时").Recalc()
timeend=date.now
e.Form.Controls("Label1").text="耗时" & (timeend-timestart).TotalSeconds & "秒"
Messagebox.Show("处理完毕!")

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


[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
yuanbin
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:102 积分:880 威望:0 精华:4 注册:2008/8/31 21:47:00
  发帖心情 Post By:2008/11/10 12:53:00 [显示全部帖子]

以下是引用abcdzabcdz在2008-11-10 12:28:00的发言:

原设计中的"表1"是放从"课程表"中相应日期和时段上课教师姓名的.

表1的格式不是数据库处理的好办法。实际上“课程表”属于交叉统计报表,所增加的“课时名单”表才是数据库存储的表现形式,它便于后续统计,也便于生成交叉报表。上述代码的作用就是将“课程表”(交叉报表)到“课时名单”进行一个逆向转换再进行其它的统计分析。


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


加好友 发短信
等级:贵宾 帖子:102 积分:880 威望:0 精华:4 注册:2008/8/31 21:47:00
  发帖心情 Post By:2008/11/18 18:36:00 [显示全部帖子]

因为已经没有“/”分隔符的处理,j值循环就可以取消了。即使循环也只是循环一次,也用不上Length了。
请去掉 “ for j as integer =0 to (drkc(dckc)).Length - 1”         和  对应的next语句。                               
修改一条语句:if drkc(dckc) <> "" then
                                                                                                

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


加好友 发短信
等级:贵宾 帖子:102 积分:880 威望:0 精华:4 注册:2008/8/31 21:47:00
  发帖心情 Post By:2008/11/19 23:54:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:甘孜班补课问题.table

这几次的交叉表到数据表的转换,需求只是有细微变化,根据表名的规律结合字符串应用,通过FOR EACH遍历操作即可完成。

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


加好友 发短信
等级:贵宾 帖子:102 积分:880 威望:0 精华:4 注册:2008/8/31 21:47:00
  发帖心情 Post By:2008/11/29 0:21:00 [显示全部帖子]

 问题在以下2句中。因为表的“日期”列中没有分隔符"_",所以在split("_")(1)就超出了范围。它只能取split("_")(0)。

for Each dc as Datacol In DataTables("课时变化").Datacols

dim xz as string =dc.name.split("_")(1)


在dim xz as string =dc.name.split("_")(1)之前增加一个判断即可,即:
for Each dc as Datacol In DataTables("课时变化").Datacols
    if dc.name.IndexOf("_") >0 then   
       dim xz as string =dc.name.split("_")(1)  
    ...

    end if
...
       

[此贴子已经被作者于2008-11-29 1:18:54编辑过]

 回到顶部