Foxtable(狐表)用户栏目专家坐堂 → 执行窗口命令后不能保存?


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

主题:执行窗口命令后不能保存?

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
执行窗口命令后不能保存?  发帖心情 Post By:2016/5/6 15:16:00 [显示全部帖子]

请问老师,以下程序是计算各科成绩在班级的名次和全校的名次、等级,能正常后执行,但保存后再打开结果没有了,是什么原因?

Tables("成绩总表").StopRedraw
Dim cs() As String ={"语文_高一","语文_高二","数学_高一","数学_高二","英语_高一","英语_高二","物理_高一","物理_高二","化学_高一","化学_高二","政治_高一","政治_高二","历史_高一","历史_高二","地理_高一","地理_高二","技术_高一","技术_高二","生物_高二","总分"}
Dim t As Table = Tables("成绩总表")
For Each c As String In cs
    If t.DataTable.DataCols.Contains(c & "_班名")=False Then
        t.DataTable.DataCols.Add(c & "_班名", Gettype(Integer))
        t.cols(c & "_班名").Move(t.cols(c).Index+1)
    End If
    If t.DataTable.DataCols.Contains(c & "_校名")=False Then
        t.DataTable.DataCols.Add(c & "_校名", Gettype(String))
        t.cols(c & "_校名").Move(t.cols(c).Index+2)
    End If
    If t.DataTable.DataCols.Contains(c & "_等级")=False Then
        t.DataTable.DataCols.Add(c & "_等级", Gettype(String))
        t.cols(c & "_等级").Move(t.cols(c).Index+3)
    End If
    t.cols(c).Caption = c & "_分数"
Next

Dim bjs As List(Of String) = DataTables("成绩总表").GetValues("班级","[班级] Is Not NULL")
Dim Count As Integer
Dim ColNames() As String ={"语文_高一","语文_高二","数学_高一","数学_高二","英语_高一","英语_高二","物理_高一","物理_高二","化学_高一","化学_高二","政治_高一","政治_高二","历史_高一","历史_高二","地理_高一","地理_高二","技术_高一","技术_高二","生物_高二","总分"}
Dim TotalName As String
Dim denji As String
For Each ColName As String In ColNames
    
    '以下设置学科成绩按全校排名和等级
    
    Dim drss As List(of DataRow)=DataTables("成绩总表").Select("", Colname & " DESC ")
    count=0
    TotalName = ColName & "_校名"
    denji=Colname & "_等级"
    For n As Integer = 0 To drss.Count - 1 '遍历所有行
        Count = Count + 1
        If n > 0 AndAlso drss(n)(Colname) = drss(n-1)(Colname) Then '如果总分和上一行相同
            drss(n)(Totalname) = drss(n-1)(Totalname) '则排名等于上一行
        Else
            drss(n)(Totalname) =count '设置排名
        End If
        If drss(n)(Totalname)<=drss.Count *0.15 Then
            drss(n)(denji)="A"
        ElseIf drss(n)(Totalname)<=drss.Count *0.45 Then
            drss(n)(denji)="B"
        ElseIf drss(n)(Totalname)<=drss.Count *0.75 Then
            drss(n)(denji)="C"
        ElseIf drss(n)(Totalname)<=drss.Count *0.95 Then
            drss(n)(denji)="D"
        Else
            drss(n)(denji)="E"
        End If
    Next
    
    '以下设置学科成绩按班级排名
    For i As Integer = 0 To bjs.Count -1
        Dim drs As List(Of DataRow) = DataTables("成绩总表").Select("[班级] = " & bjs(i), ColName & " DESC")
        Count = 0
        TotalName = ColName & "_班名"
        For n As Integer = 0 To drs.Count - 1
            Count = Count + 1
            If n > 0 AndAlso drs(n)(ColName ) = drs(n-1)(ColName) Then
                drs(n)(TotalName ) = drs(n-1)(TotalName )
            Else
                drs(n)(TotalName ) = Count
            End If
        Next
    Next
Next
Tables("成绩总表").Sort = "总分 DESC"
Tables("成绩总表").ResumeRedraw
图片点击可在新窗口打开查看此主题相关图片如下:截图20160506150810.png
图片点击可在新窗口打开查看


 


图片点击可在新窗口打开查看此主题相关图片如下:截图20160506150842.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/6 21:29:00 [显示全部帖子]

大红袍老师,如果直接用菜单中的导出功能,再导入的话,多层表头就没有了。

变成这样了:

 


图片点击可在新窗口打开查看此主题相关图片如下:截图20160506212559.png
图片点击可在新窗口打开查看

另外我发现只要在原表基础上执行以下程序自动插入列的操作,如下图,就无法保存了。

 Tables("成绩总表").StopRedraw
Dim cs() As String ={"语文_高一","语文_高二","数学_高一","数学_高二","英语_高一","英语_高二","物理_高一","物理_高二","化学_高 一","化学_高二","政治_高一","政治_高二","历史_高一","历史_高二","地理_高一","地理_高二","技术_高一","技术_高 二","生物_高二","总分"}
Dim t As Table = Tables("成绩总表")
For Each c As String In cs
    If t.DataTable.DataCols.Contains(c & "_班名")=False Then
        t.DataTable.DataCols.Add(c & "_班名", Gettype(Integer))
        t.cols(c & "_班名").Move(t.cols(c).Index+1)
    End If
    If t.DataTable.DataCols.Contains(c & "_校名")=False Then
        t.DataTable.DataCols.Add(c & "_校名", Gettype(String))
        t.cols(c & "_校名").Move(t.cols(c).Index+2)
    End If
    If t.DataTable.DataCols.Contains(c & "_等级")=False Then
        t.DataTable.DataCols.Add(c & "_等级", Gettype(String))
        t.cols(c & "_等级").Move(t.cols(c).Index+3)
    End If
    t.cols(c).Caption = c & "_分数"
Next


图片点击可在新窗口打开查看此主题相关图片如下:截图20160506210931.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2016/5/7 6:50:27编辑过]

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/7 16:26:00 [显示全部帖子]

 是这样的,原表中没有这几个列,为了统计成绩需要加入这几列,由于在统计名次的代码中已经有了需要增加的列的名称:{"语文_高一","语文_高二","数学_高一","数学_高二","英语_高一","英语_高二","物理_高一","物理_高二","化学_高一","化学_高二","政治_高一","政治_高二","历史_高一","历史_高二","地理_高一","地理_高二","技术_高一","技术_高二","生物_高二","总分"},如果在手工增加这些列的话会很麻烦,所以想到用代码来自动插入列。

这样插入的列是临时列吗?本身是 不能保存的吗?

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/8 11:38:00 [显示全部帖子]

 哦,是这样啊,但是下面动态增加列的代码执行后也是需要重启项目才能看到生成的列吧?那就得把增加列的代码和统计名次的代码分开,否则还是会提示列不存在

 

Dim Builder As New ADOXBuilder
Builder.Open()

With
Builder.Tables("A")
    .
RenameColumn("第一列","姓名")
End With

Builder
.Close()


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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/9 14:50:00 [显示全部帖子]

嗯,导出可以保留多层表头了,那多层表头的导入也应用代码吧,为什么以下代码有错误提示:

 

Dim ip As New Importer
ip.SourcePath = "C:\Users\Public\Desktop\成绩总表1.xls" '指定数据文件
ip.SourceTableName = "成绩总表1$" '指定要导入的表
ip.NewTableName ="成绩总表1" '导入后的表名
ip.Format = "Excel" '指定导入格式
ip.Import()

 

我导出的Excel工作簿名称是“成绩总表1”,工作表也是“成绩总表1”,无论是否加"$" ,都有以下提示:

 


图片点击可在新窗口打开查看此主题相关图片如下:截图20160509144801.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/9 15:00:00 [显示全部帖子]

哦,我的桌面进行了移动,文件地址改成“I:\office\成绩总表1.xls“就可以导入了,但导入后的表,多层表头还是没有了,多层表头能保留吗?

 

 


图片点击可在新窗口打开查看此主题相关图片如下:截图20160509145809.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/9 15:05:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:2017届学生管理.rar


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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/9 16:10:00 [显示全部帖子]

谢谢大红袍老师,我没测试,估计应该可以这样来动态增加列了。

另外:

1、您刚才试了吗,导入excel的方式是否确实不能保留多层表头?可能是我的表头有三层,太过复杂了

 

2、目前项目中”成绩总表“只含有高一、高二两个成绩,如果以后还需要增加多个成绩,如高三成绩、期中成绩等,目的是为了统计各个班每次考试排名、等级、平均分等信息,那是把所有成绩合并到”成绩总表“中还是每次成绩单独一个表,然后来构建跨表查询好?


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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/9 19:07:00 [显示全部帖子]

执行代码

Dim cs() As String ={"语文_高一","语文_高二","数学_高一","数学_高二","英语_高一","英语_高二","物理_高一","物理_高二","化学_高一","化学_高二","政治_高一","政治_高二","历史_高一","历史_高二","地理_高一","地理_高二","技术_高一","技术_高二","生物_高二","总分"}
Dim t As Table = Tables("成绩总表")
Dim Builder As New ADOXBuilder
Builder.Open()
Dim tbl = builder.Tables("成绩总表")
For Each c As String In cs
    If t.DataTable.DataCols.Contains(c & "_班名")=False Then
        tbl.AddColumn(c & "_班名", ADOXType.Integer) '增加整数型列
       
    End If
    If t.DataTable.DataCols.Contains(c & "_校名")=False Then
        tbl.AddColumn(c & "_校名", ADOXType.Integer) '增加整数型列
    End If
    If t.DataTable.DataCols.Contains(c & "_等级")=False Then
        tbl.AddColumn(c & "_等级", ADOXType.Integer) '增加整数型列
    End If
    If t.DataTable.DataCols.Contains(c & "_分数")=False Then
        tbl.RenameColumn(c, c & "_分数")
    End If
Next
Builder.Close()
DataTables.unload("成绩总表")
DataTables.load("成绩总表")
t = Tables("成绩总表")
Dim idx As Integer = 3
For Each c As String In cs
    t.cols(c & "_分数").Move(idx)
    t.cols(c & "_分数").width = 40
    t.cols(c & "_班名").Move(idx+1)
    t.cols(c & "_校名").Move(idx+2)
    t.cols(c & "_等级").Move(idx+3)
    idx += 4
Next


 

出现如下提示:


图片点击可在新窗口打开查看此主题相关图片如下:截图20160509190501.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2016/5/9 19:07:37编辑过]

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


加好友 发短信
等级:幼狐 帖子:52 积分:537 威望:0 精华:0 注册:2016/3/24 11:13:00
  发帖心情 Post By:2016/5/10 16:10:00 [显示全部帖子]

谢谢大红袍老师。

 

为了统计每次考试的成绩情况,按您的思路应该把各次考试成绩合到“成绩总表”(不是临时表)中。现有两张数据表,“高一下期末”和“高二上期末”,要根据班级和姓名合到一张表中,我原来是两者建立关联后用表达式列把“高一下期末”添加到“高二上期末”中去的,如何用代码快速进行合并?

 

 高二上期末:


图片点击可在新窗口打开查看此主题相关图片如下:截图20160510154920.png
图片点击可在新窗口打开查看

 

高一下期末: 


图片点击可在新窗口打开查看此主题相关图片如下:截图20160510155439.png
图片点击可在新窗口打开查看

 

合并后字段:


 
图片点击可在新窗口打开查看此主题相关图片如下:截图20160510160811.png
图片点击可在新窗口打开查看


 回到顶部
总数 14 1 2 下一页