设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 5912|回复: 28
打印 上一主题 下一主题

[模块/函数] 【原创 / 源码】导出窗体Recordset为任意Access支持格式的数据文件

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-16 22:21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下代码将DAO的RecordSet(包括Access窗体的Recordset)中的当前数据导出为任何Access支持的导出格式。无论你这个Recordset是从窗体的,还是代码创建的,是筛选后结果,还是链接了字段的主窗体,本程序均能正确导出结果,格式包括任何Access支持的导出格式。

备注:数据类型转换的部分可能还会有些小问题,如果有谁使用中发现导出后数据格式错误请告诉我,便于我改进。

(2006年5月13日修改,增加了取消导出的异常处理)


'调用范例

Private Sub Botton_Click()
    Call Output_Recordset(Me.Recordset)
End Sub

<DIV class=quote>


'公共模块

Option Compare Database
Option Explicit

Public Sub Output_Recordset(ByRef frmRs As DAO.Recordset)
    Dim frmField As DAO.Field
    Dim daoDbs As DAO.Database
    Dim daoRs As DAO.Recordset

    Dim strSQL As String
    Dim strFields As String
   
    Set daoDbs = Application.CurrentDb
    Set daoRs = frmRs.Clone
   
    strSQL = "CREATE TABLE USysDAORecordsetOutport"
    strFields = "("
   
    For Each frmField In daoRs.Fields
        strFields = strFields & frmField.Name & " "
        Select Case frmField.Type
            Case dbBigInt:
                strFields = strFields & "Currency"
            Case dbBinary:
                strFields = strFields & "Binary"
            Case dbBoolean:
                strFields = strFields & "Bit"
            Case dbByte:
                strFields = strFields & "TinyInt"
            Case dbChar:
                strFields = strFields & "Char"
            Case dbCurrency:
                strFields = strFields & "Money"
            Case dbDate:
                strFields = strFields & "DateTime"
            Case dbDecimal:
                strFields = strFields & "Decimal"
            Case dbDouble:
                strFields = strFields & "Double"
            Case dbFloat:
                strFields = strFields & "Float"
            Case dbGUID:
                strFields = strFields & "Guid"
            Case dbInteger:
                strFields = strFields & "Integer"
            Case dbLong:
                strFields = strFields & "Long"
            Case dbLongBinary:
                strFields = strFields & "LongBinary"
            Case dbMemo :
                strFields = strFields & "Memo"
            Case dbNumeric:
                strFields = strFields & "Numeric"
            Case dbSingle:
                strFields = strFields & "Single"
            Case dbText:
                strFields = strFields & "Text(" & frmField.Size & ")"
            Case dbTime:
                strFields = strFields & "Time"
            Case dbTimeStamp:
                strFields = strFields & "DateTime"
            Case dbVarBinary:
                strFields = strFields & "VarBinary"
        End Select
        
        strFields = strFields & ","
    Next frmField
    strFields = Left(strFields, Len(strFields) - 1) & ")"
   
    On Error Resume Next
        daoDbs.Execute "DROP TABLE USysDAORecordsetOutport"
    On Error GoTo 0
    daoDbs.Execute strSQL & strFields
   
    daoRs.MoveFirst

    Do Until daoRs.EOF
        strSQL = "INSERT INTO USysDAORecordsetOutport("
        strFields = " Values("
        For Each frmField In daoRs.Fields
            If Not IsNull(frmField.Value) And Not IsEmpty(frmField.Value) Then
                strSQL = strSQL & frmField.Name & ","
                If frmField.Type = dbText Then
                    strFields = strFields & "'" & frmField.Value & "',"
                Else
                    strFields = strFields & frmField.Value & ","
                End If
            End If
        Next frmField
      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2005-8-16 22:22:00 | 只看该作者
不错的说,能否改成ADO的?
3#
 楼主| 发表于 2005-8-16 22:24:00 | 只看该作者
以下是引用zhengjialon在2005-8-16 14:22:00的发言:

不错的说,能否改成ADO的?





问题不大,小改几行就可以,主要是因为原来为导出子窗体内数据,所以采用了Access的DAO方式,这样窗体Recordset就能直接送进去。

本来想做个同时支持ADO和DAO的,但是不知道该怎么来定义这个子程序的参数类型,哪位能提醒一下?我试过AccessObject和Object都出错。

[此贴子已经被作者于2005-8-16 14:31:38编辑过]

4#
发表于 2005-8-16 23:51:00 | 只看该作者
好东西,不过还没试
5#
 楼主| 发表于 2005-8-17 01:03:00 | 只看该作者
重新贴了一下代码,修正了几个BUG:



1、是/否类型的值导出

2、空值导出

3、多数据条目导出
6#
发表于 2005-8-17 01:46:00 | 只看该作者
好东西,效果很棒非常感谢分享谢谢
7#
 楼主| 发表于 2005-8-17 02:19:00 | 只看该作者
再次更新了代码,解决了一个导致效率低的重大原因……



那就是Debug.Print……



原来这个语句这么影响效率……
8#
 楼主| 发表于 2005-8-18 00:30:00 | 只看该作者
晕,这个程序不算太滥吧,这么快就沉了……
9#
发表于 2005-8-18 18:37:00 | 只看该作者
以下是引用LucasLynn在2005-8-17 16:30:00的发言:

晕,这个程序不算太滥吧,这么快就沉了……



我想,不是太滥,而是曲高和寡。能有实例,不会沉掉。
10#
 楼主| 发表于 2005-8-18 18:42:00 | 只看该作者
以下是引用wu8313在2005-8-18 10:37:00的发言:





我想,不是太滥,而是曲高和寡。能有实例,不会沉掉。



这个实例……这个程序已经做成了公共子程序,实例顶多也就是个调用而已……

算了,补充一个吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-2 02:38 , Processed in 0.088913 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表