我使用这篇文章中的答案将我的查询导出到文本文件中,这样我就可以进行查找/替换练习:
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导出为一个大文件。
答案 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
最后确保在运行"启用"之前备份数据库。该代码的版本。我怀疑你需要那个警告,内森,但我想到其他任何人无意中泄露了他们的疑问,我感到畏缩。