从文本文件

时间:2016-03-16 13:15:22

标签: vba ms-access access-vba

我使用这篇文章中的答案将我的查询导出到文本文件中,这样我就可以进行查找/替换练习:

Using VBA to export all ms access sql queries to text files

我继承了一个具有对象名称,banker1,banker2等的数据库,硬编码,我不得不创建额外的东西。我导出了所有查询,并用新名称替换了banker1。到目前为止一切都很好。

是否可以从生成的单个文本文件中撤消此过程并将查询加载回Access?

我之前的方法涉及使用Application.SaveAsText将查询导出到单个文本文件,然后循环并执行查找/替换。我使用这种方法遇到的问题是文件是"格式化的#34;,可能是固定宽度但不确定,这样一些名称被分割成行,因此没有被find /检测到更换。使用Application.LoadFromText重新加载它们的工作非常完美,除了我仍然需要搜索查询以找到没有更改的名称。

编辑:请求的查询示例。

  

BNK30-AddChargebacks   插入BNK30EntryTable(入门)   SELECT BNK30SelectChargebacks.Entry   来自BNK30SelectChargebacks   WHERE(((BNK30SelectChargebacks.Amount)<> 0));

     

BNK30-AddCredit   INSERT INTO BNK30EntryTable(Entry)SELECT   BNK30EntryQuery.Credit来自BNK30EntryQuery WHERE   (((BNK30EntryQuery.Amt)LT;&0));

在上面我会用BNK31等找到/替换BNK30。

编辑2:

Operation =3
Name ="BNK01SavedReserves"
Option =0
Where ="(((BNK01Select.Reference) Is Null Or (BNK01Select.Reference)=[forms]![BNK01Nav]!"
    "[txtReference]) AND ((BNK01Select.Date) Is Null Or (BNK01Select.Date)=[forms]![B"
    "NK01Form]![StartedTime]))"
Begin InputTables
    Name ="BNK01Select"
End
Begin OutputColumns
    Name ="AssignedTo"

以上是我原来的方法,除了BNK01被分割之外的其他方法;在 Begin InputTables 行的正上方。因此,尝试切换到将SQL导出为一个大文件。

1 个答案:

答案 0 :(得分:2)

您可以根据需要使用VBA过程修改查询名称及其SQL。这种方法应该比将查询定义转储到文本文件,在文本文件中进行搜索和替换,然后(不知何故?)根据文本文件更改修改查询要简单得多。

例如,使用以下程序,您可以执行"使用BNK31" 查找/替换BNK30 ......

ModifyQueries "BNK30", "BNK31"

但是,如上所述,该过程不会更改查询。它仅显示启用.Name = strNewName.SQL = strNewSql行时所做的更改。在启用这些行之前,请检查立即窗口中的输出。

Public Sub ModifyQueries(ByVal pFind As String, ByVal pReplace As String)
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strNewSql As String
    Dim varNewName As Variant

    Set db = CurrentDb
    For Each qdf In db.QueryDefs
        With qdf
            varNewName = Null
            strNewSql = vbNullString
            If .Name Like "*" & pFind & "*" Then
                varNewName = Replace(.Name, pFind, pReplace)
                Debug.Print "change " & .Name & " to " & varNewName
                '.Name = strNewName
            End If

            If .SQL Like "*" & pFind & "*" Then
                strNewSql = Replace(.SQL, pFind, pReplace)
                Debug.Print Nz(varNewName, .Name) & " SQL: "
                Debug.Print strNewSql
                '.SQL = strNewSql
            End If
        End With
    Next
End Sub

请注意,代码尚未经过全面测试。它只是作为一个起点;你必须测试并改进它。

您应该添加错误处理。如果/当它尝试使用与现有查询或表匹配的名称命名查询时,该过程将抛出错误。

注意,我编写了重命名查询的程序。如果您更喜欢创建新查询,请修改代码以执行此操作...

db.CreateQueryDef varNewName, strNewSql

最后确保在运行"启用"之前备份数据库。该代码的版本。我怀疑你需要那个警告,内森,但我想到其他任何人无意中泄露了他们的疑问,我感到畏缩。