Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

代码填写access标题不全

杜昌立  发表于:2011-09-26 11:01:52  
复制


Sub list()
Dim work As Workspace
Dim dbnew As Database
Dim elem As Object
Dim rs As Recordset
Dim RowNum As Integer
Set work = DBEngine.Workspaces(0)
Dim dbs As Database
Dim tdfNew As TableDef
Dim tdf As TableDef
Dim dbsname As String
Dim array1 As Variant
Dim array2 As Variant '声明所需的变量及类型
dbsname = "D:\材料表.mdb"
'声明Access数据库写到哪一个文件
On Error Resume Next
Set dbs = work.CreateDatabase(dbsname, dbLangGeneral)
If Err Then
Kill (dbsname)
'发现要写入的Access数据库文件已存在就将其删除
Set dbs = work.CreateDatabase(dbsname, dbLangGeneral)
End If
Set tdfNew = dbs.CreateTableDef("电气 _材料明细表")
'建立一个名为电气材料明细表的表
RowNum = 0
Dim Header As Boolean
Header = False
For Each elem In ThisDrawing.ModelSpace
'在CAD模型空间,查找所有图形对象
With elem
If StrComp(.EntityName, "AcDbBlockReference", 1) = 0 Then
If .HasAttributes Then
array1 = .GetAttributes '设置array1指向图形对象的属性
array2 = .GetConstantAttributes '设置array2指向图形对象的固定属性
For Count = LBound(array2) To UBound(array2)
If Header = False Then
If StrComp(array2(Count).EntityName, "AcDbAttributeDefinition", 1) = 0 Then
tdfNew.Fields.Append tdfNew.CreateField(array2(Count).TagString, dbText)
End If
'读出属性值读出,作为Access数据库表的标题
End If
Next Count
For Count = LBound(array1) To UBound(array1)
If Header = False Then
If StrComp(array1(Count).EntityName, "AcDbAttribute", 1) = 0 Then
tdfNew.Fields.Append tdfNew.CreateField(array1(Count).TagString, dbText)
End If
End If
Next Count
If Header = False Then
dbs.TableDefs.Append tdfNew
Set rs = dbs.OpenRecordset("挖土机 _明细表", dbOpenTable) '打开记录
End If
RowNum = RowNum + 1
rs.AddNew '增加一笔新记录
For Count = LBound(array2) To UBound(array2)
rs(Count).Value = array2(Count).TextString
Next Count '读固定属性值
For Count = LBound(array1) To UBound(array1)
rs(UBound(array2) + Count + 1).Value = array1(Count).TextString
Next Count '读输入属性值
rs.Update '增加新记录修改结束
Header = True
End If
End If
End With
Next elem
rs.Close  '关闭记录,释放资源
dbs.Close '关闭数据库,释放资源
End Sub

 

以上代码在填写access时,填写不全,比如CAD中有很多属性的值,而在提取后的access表中的标题数量是以CAD中的属性值最少的记录的,而且还不能填写标题对应的数据,大家帮我看看,谢谢

 

Top
杜昌立 发表于:2011-09-26 13:04:42

没有人懂access的VBA吗?

 

 

 

悲哀



杜昌立 发表于:2011-09-27 01:09:33

真的没有人搞定?

我的代码能启动access啊,只是对access不是很了解导致数据填写位置的问题啊,这个论坛的高手是设么级别的高手啊?没有人敢挑战自己的专业啊..............!!



羽扇子君 发表于:2011-09-27 09:48:00

代码中:

 

Set tdfNew = dbs.CreateTableDef("电气 _材料明细表")

……

If Header = False Then
dbs.TableDefs.Append tdfNew
Set rs = dbs.OpenRecordset("挖土机 _明细表", dbOpenTable) '打开记录
End If

 

开始时,tdfNew引用了(电气 _材料明细表),后来,Rs中却引用了(挖土机 _明细表),不知道那个tdfNew有什么用?

 

另,

rs(Count).Value的引用有误,至少应该是:

rs.Field(Count) = array2(Count).TextString



杜昌立 发表于:2011-09-27 19:14:04
现在可以运行的,但是填写access的时候位置不对

sunny 发表于:2011-09-28 10:35:28
位置不对?有可能是记录集里字段的排序和你想要的排序不同的哦

杜昌立 发表于:2011-09-28 11:11:49

帮我看看吧,我不懂access啊,在access中填写的位置只要求数据与标题对应就好了,现在是数据与标题不对应啊,而且只有最后的几个数据,也就是好像有覆盖的现象,

谁能帮我啊



sunny 发表于:2011-09-28 12:17:08

把数据精简下,弄个附件上来,大家才方便查看原因



杜昌立 发表于:2011-09-28 12:47:13
这个是填写到access的数据,永远只有最后几个的属性值填在这里,而且数据与字段的标题不对应

杜昌立 发表于:2011-09-28 20:24:19

请本论坛的高高手出山!!

现在的问题是很明显的,相信会有高高手的!!

期待!........



杜昌立 发表于:2011-09-29 19:55:34
这个才是正确的,可惜是我手动填写上去的

dbaseIIIer 发表于:2011-09-30 01:14:06

整个数据表都是从你的 ThisDrawing 的 element 里面生成的,

又没得看你的 ThisDrawing物件,

至少有个类库, 或者类库名称吧???

能除到错的, 只有你自己, 别怪这里没人理你!

 

你连发问的水平都没有,

连是否有足够的的信息可以解开你问题的都不知道,

怎么有资格要求高手回答你的问题?

 

我看你是Access 不太懂吧? 什么类库是在Access 内知道吧?



杜昌立 发表于:2011-10-01 00:39:48

就是完全不懂access啊

 



杜昌立 发表于:2011-10-01 00:45:29
好几个高手链接我的电脑了,现场根据我的CAD调试的啊,都没有搞定啊,被你们这些高手调试过后就什么数据也不生成了

杜昌立 发表于:2011-10-01 00:54:29
我找CAD开发人员看过了,他们也都认为是代码对access不熟导致的啊,能填写数据到access中去就说明CAD这边的问题不大,我很难在全中国找到既懂CAD的又懂access的;现在我已经找过CAD的相关人员了,他们说对access不懂,我的问题会不会成为千古之谜啊??

杜昌立 发表于:2011-10-01 01:14:32
这个是CAD中的图纸截屏,图中有0.75BL、0.75PU、H1、T1等等,这些在CAD中叫做块,当用鼠标双击后会显示右边的框中的内容,现在代码的任务就是将每个块中像框中这样的数据填写到access中去,框中的标记就是access的字段名,值就是access中字段对应的数据。以下的网址是对块的详细说明:http://wenku.baidu.com/view/ddcaa4c4bb4cf7ec4afed0fc.html

dbaseIIIer 发表于:2011-10-01 07:22:27

我熟悉Access 及操作过  MathCAD 2.0, OrCAD PCB 2.0, AutoCAD 3.0/4.0 支持的LISP编程, CorelDraw 9.0, Gerber 文件的编程, 

93年我都创立过一套CAD软件, 只是未见过你那种CAD类库!

 

但其实不需要在全中国找又熟ACCESS又熟CAD的人啊,

CAD 的类库是有帮助文件的, 有人设计好类库,

我们都是根据定义去做事的, 要跟着设计者的思想去抽取数据的!

 

现在是你的代码是否正确的取得文件内容都不知道

 

elem.EntityName = "AcDbBlockReference" 就是 Block 块吗?

elem.HasAttributes 就是有属性?

elem.GetAttributes   就取得所有属性 Collection? 还是 array 数据?

elem.GetConstantAttributes 就取得所有常量属性?

elem.GetConstantAttributes(n).EntityName = "AcDbAttributeDefinition" 时就是属性定义?

elem.GetConstantAttributes(n).TagString 就 取得属性里的标签字符串?

elem.GetAttributes(n).TextString 就 取得属性里的文本字符串?

 

这就是你的代码用到的属性和方法!

 

你的代码在什么环境执行的? 在 AutoCAD 2000 内吧?

有VBE? 有的话就进去即时窗口,

? ThisDrawing.ModelSpace.count 有数值吗?

 

? ThisDrawing.ModelSpace.item(0).EntityName 正常显示吗?

 

一步步来肯定能查到问题的!



dbaseIIIer 发表于:2011-10-01 08:13:19


dbaseIIIer 发表于:2011-10-01 08:17:59

Sub list()
Dim work As Workspace
Dim dbnew As Database
Dim elem As Object
Dim rs As Recordset
Dim RowNum As Integer
Set work = DBEngine.Workspaces(0)
Dim dbs As Database
Dim tdfNew As TableDef
Dim tdf As TableDef
Dim dbsname As String
Dim Array1 As Variant
Dim Array2 As Variant '声明所需的变量及类型
dbsname = "D:\材料表.mdb"

'声明Access数据库写到哪一个文件
On Error Resume Next
Set dbs = work.CreateDatabase(dbsname, dbLangGeneral)
If Err Then
    Kill (dbsname)
    '发现要写入的Access数据库文件已存在就将其删除
    Set dbs = work.CreateDatabase(dbsname, dbLangGeneral)
End If

Set tdfNew = dbs.CreateTableDef("电气 _材料明细表")
'建立一个名为电气材料明细表的表
RowNum = 0
Dim Header As Boolean
Dim FieldIndex(1000)
Dim idx As Long

idx = 0
Header = False
For Each elem In ThisDrawing.ModelSpace
'在CAD模型空间,查找所有图形对象
    With elem
        If StrComp(.EntityName, "AcDbBlockReference", 1) = 0 Then
            If .HasAttributes Then
                Array1 = .GetAttributes '设置array1指向图形对象的属性
                For Count = LBound(Array1) To UBound(Array1)
                    If Header = False Then
                        If Array1(Count).Constant Then
                            FieldIndex(idx) = Count
                            tdfNew.Fields.Append tdfNew.CreateField(Array1(Count).TextString, dbText)
                            idx = idx + 1
                        End If
                    End If
                Next Count
                If Header = False Then
                    dbs.TableDefs.Append tdfNew
                    Set rs = dbs.OpenRecordset(tdfNew.Name, dbOpenTable) '打开记录
                End If
                RowNum = RowNum + 1
                rs.AddNew '增加一笔新记录
                               
                For Count = 0 To tdfNew.Fields.Count - 1
                    rs(Count).Value = Array1(FieldIndex(Count)).TextString
                Next Count '读输入属性值
               
                rs.Update '增加新记录修改结束
                               
                Header = True
            End If
        End If
    End With
Next elem
rs.Close  '关闭记录,释放资源
dbs.Close '关闭数据库,释放资源
End Sub


 



dbaseIIIer 发表于:2011-10-01 08:24:04

1. Array1 Array2 存在名称重复/冲突, 不能全部作为一个表的字段名

2. 上面建的表, 下面 set rs = 的打开错误表名

3. Array1 字段名插入时带 条件, 但插入数据时, 所有属性写入表, 字段数量有可能不符

4. Array2 字段名同样有条件地插入, 但数据没有

5. 字段名 用 TagString 还是 TextString? 你要确定一下!  最好是Access 合法的字段名称!

 

以上例子我就用 Array1 只取 Array(1).Constant 为真的数据

 



煮江品茶 发表于:2011-10-01 08:32:10


总记录:20篇  页次:1/1 9 1 :