以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 求助检查关于动态创建表存在问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=28906) |
||||
-- 作者:tedat -- 发布时间:2013/2/22 9:55:00 -- 求助检查关于动态创建表存在问题 Dim Name As String = e.Form.Controls("工程数量分表名称").Value If Name = "" Then MessageBox.Show("分表名称不能为空!","提示") Return End If For Each dt As DataTable In DataTables If dt.Name.Contains(Name) Then MessageBox.Show(name & "数据库中已存在","提示") Else If MessageBox.Show("是否创建工程数量分表?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question) = DialogResult.Yes Then Dim Builder As New ADOXBuilder Dim fb As ADOXTable Builder.Open() fb = Builder.NewTable(name) \'创建表 With fb .AddColumn("分部工程" ,ADOXType.String, 12) .AddColumn("分项工程" ,ADOXType.String, 12) .AddColumn("施工部位_主部位" ,ADOXType.String, 8) .AddColumn("施工部位_辅部位" ,ADOXType.String, 8) .AddColumn("细目号" ,ADOXType.String, 8) .AddColumn("材料类别" ,ADOXType.String, 12) .AddColumn("材料规格" ,ADOXType.String, 8) .AddColumn("单位" ,ADOXType.String, 8) .AddColumn("设计数量" ,ADOXType.Single) .AddColumn("变更数量" ,ADOXType.Single) End With Builder.AddTable(fb) \'增加表 Builder.Close() Else Return End If End If Next DataTables(name).DataCols.Add("有效数量", Gettype(Single), "isnull([设计数量],0) + isnull([变更数量],0)") Dim dmp1 As New TableDataMap dmp1.DataTable = "主合同清单" \'指定数据来源表 dmp1.ValueCol = "细目号" \'指定取值列 dmp1.DisplayCol = "细目号" \'指定显示列 dmp1.ListCols = "细目号,名称" \'指定下拉列表时显示哪些列的数据 dmp1.Sort = "细目号" \'指定排序方式 Tables(name).Cols("细目号").DataMap = dmp1.CreateDataMap() \'生成并设置DataMap Dim dmp2 As New TableDataMap dmp2.DataTable = "材料信息表" \'指定数据来源表 dmp2.ValueCol = "规格型号" \'指定取值列 dmp2.DisplayCol = "规格型号" \'指定显示列 dmp2.ListCols = "材料类别,规格型号" \'指定下拉列表时显示哪些列的数据 dmp2.Sort = "材料类别" \'指定排序方式 Tables(name).Cols("材料规格").DataMap = dmp2.CreateDataMap() \'生成并设置DataMap Dim dmp3 As New TableDataMap dmp3.DataTable = "材料信息表" \'指定数据来源表 dmp3.ValueCol = "材料类别" \'指定取值列 dmp3.DisplayCol = "材料类别" \'指定显示列 dmp3.ListCols = "材料名称,材料类别" \'指定下拉列表时显示哪些列的数据 dmp3.Sort = "材料名称" \'指定排序方式 Tables(name).Cols("材料类别").DataMap = dmp3.CreateDataMap() \'生成并设置DataMap Relations.Add(e.Form.Controls("工程数量分表编号").value,DataTables("工程数量总表").DataCols("细目号"),DataTables(name).DataCols("细目号")) If MessageBox.Show(Name & "已经创建,是否重启系统","请确认",MessageBoxButtons.YesNo,MessageBoxIcon.Question) =DialogResult.Yes Then syscmd.Project.Open(ProjectFile) \'打开表 MainTable = Tables(Name) forms("创建工程数量分表").close() Else Return End If |
||||
-- 作者:lin_hailun -- 发布时间:2013/2/22 10:17:00 -- 没办法,狐表没有提供动态添加表以后得到现有表的属性或者方法。 只能是你自己用一个变量去控制了。 当新增一个表的时候,把变量存入一个集合,用于判断此表是否被添加进去了。 Dim ls_Newtable As List(Of String) ls_Newtable.Add("xxxx") ls_Newtable.Containt("xxx") 还有注意的是,新增表,必须重启项目才可以生效。 Syscmd.Project.Open(ProjectFile) |
||||
-- 作者:tedat -- 发布时间:2013/2/22 11:16:00 -- 我原来是可以的,但是调整后没有了 我原来是可以的,但是调整后没有了 |
||||
-- 作者:lin_hailun -- 发布时间:2013/2/22 11:19:00 -- 以下是引用tedat在2013-2-22 11:16:00的发言: 我原来是可以的,但是调整后没有了 不可能可以的,好吧?你在循环里添加表,表名重复了好吧? |
||||
-- 作者:blackzhu -- 发布时间:2013/2/22 11:30:00 -- 在 实际生产中 动态添加表 还是 在项目设计表? |
||||
-- 作者:tedat -- 发布时间:2013/2/22 13:54:00 -- lin,我上传文件上来,你帮我看看吧 在动态管理中的创建工程数量分表窗口,里面的创建分表按钮控件,你帮我看看吧,另外有个工程数量录入的窗口,我设计了板面,但是内部的代码能不能给我指点下啊
[此贴子已经被作者于2013-2-22 13:55:08编辑过]
|
||||
-- 作者:tedat -- 发布时间:2013/2/22 14:33:00 -- 找到问题了 我调整代码,去掉了设置关联的语句: Dim Name As String = e.Form.Controls("工程数量分表名称").Value If Name = "" Then MessageBox.Show("分表名称不能为空!","提示") Return End If If DataTables.Contains(Name) Then MessageBox.Show("《" & name & "》" & "数据库中已存在","提示") Return End If If MessageBox.Show("是否创建" & "《" & name & "》" & "?","提示",MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then Dim Builder As New ADOXBuilder Dim fb As ADOXTable Builder.Open() fb = Builder.NewTable(name) \'创建表 With fb .AddColumn("分部工程" ,ADOXType.String,16) .AddColumn("分项工程" ,ADOXType.String,16) .AddColumn("施工部位_主部位" ,ADOXType.String,16) .AddColumn("施工部位_辅部位" ,ADOXType.String,16) .AddColumn("细目号" ,ADOXType.String,16) .AddColumn("材料类别" ,ADOXType.String,16) .AddColumn("材料规格" ,ADOXType.String,16) .AddColumn("单位" ,ADOXType.String,16) .AddColumn("设计数量" ,ADOXType.Single) .AddColumn("变更数量" ,ADOXType.Single) End With Builder.AddTable(fb) \'增加表 Builder.Close() Else Return End If syscmd.Project.Open(ProjectFile) \'打开表 MainTable = Tables(Name) forms("创建工程数量分表").close() DataTables(name).DataCols.Add("有效数量", Gettype(Single), "isnull([设计数量],0) + isnull([变更数量],0)") Dim dmp1 As New TableDataMap dmp1.DataTable = "主合同清单" \'指定数据来源表 dmp1.ValueCol = "细目号" \'指定取值列 dmp1.DisplayCol = "细目号" \'指定显示列 dmp1.ListCols = "细目号,名称" \'指定下拉列表时显示哪些列的数据 dmp1.Sort = "细目号" \'指定排序方式 Tables(name).Cols("细目号").DataMap = dmp1.CreateDataMap() \'生成并设置DataMap Dim dmp2 As New TableDataMap dmp2.DataTable = "材料信息表" \'指定数据来源表 dmp2.ValueCol = "规格型号" \'指定取值列 dmp2.DisplayCol = "规格型号" \'指定显示列 dmp2.ListCols = "材料类别,规格型号" \'指定下拉列表时显示哪些列的数据 dmp2.Sort = "材料类别" \'指定排序方式 Tables(name).Cols("材料规格").DataMap = dmp2.CreateDataMap() \'生成并设置DataMap Dim dmp3 As New TableDataMap dmp3.DataTable = "材料信息表" \'指定数据来源表 dmp3.ValueCol = "材料类别" \'指定取值列 dmp3.DisplayCol = "材料类别" \'指定显示列 dmp3.ListCols = "材料名称,材料类别" \'指定下拉列表时显示哪些列的数据 dmp3.Sort = "材料名称" \'指定排序方式 Tables(name).Cols("材料类别").DataMap = dmp3.CreateDataMap() \'生成并设置DataMap 能够执行,但是为什么添加关联代码后就行啊 Relations.Add(e.Form.Controls("工程数量分表编号").value,DataTables("工程数量总表").DataCols("细目号"),DataTables(name).DataCols("细目号")) |
||||
-- 作者:lin_hailun -- 发布时间:2013/2/22 14:34:00 -- 不建议你这样做,创建完成以后,必须是重新打开项目才可以引用这张表的。 也就是说,这样会使你的程序不连贯了。 建议你用外部数据源吧。这样可以动态的新建表、删除表等等操作。 看个例子。 点击浏览该文件:动态创建表.rar |
||||
-- 作者:lin_hailun -- 发布时间:2013/2/22 14:46:00 -- 还是用动态的吧。自己用一个数据表保存你的分表的名字,在项目打开的时候给弄进来。 这样就不需要重新打开项目了。 http://www.foxtable.com/help/topics/1279.htm |
||||
-- 作者:tedat -- 发布时间:2013/2/22 15:52:00 -- 谢谢,补充 我的数据库里面有个记录表名的数据表啊,那怎么做好不用重启啊? 顺便帮我看看 If MessageBox.Show("是否保存数据?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question) = DialogResult.Yes Then DataTables(e.Form.Controls("录入表").value).Save(True) Forms("录入工程数量").Close Else Forms("录入工程数量").Close End If 我是在窗口事件中beforeclose的
|