Ms access 从文本文件导入以前导出的Access SQL查询
我使用这篇文章的答案将我的查询导出到一个文本文件,这样我就可以进行查找/替换练习: 我继承了一个数据库,它有对象名,banker1,banker2等等,硬编码,我必须创建额外的数据库。我导出了所有查询,并用新名称替换了banker1。到目前为止还不错 是否可以从生成的单个文本文件中反转此过程,并将查询加载回Access 我以前的方法是使用Ms access 从文本文件导入以前导出的Access SQL查询,ms-access,vba,Ms Access,Vba,我使用这篇文章的答案将我的查询导出到一个文本文件,这样我就可以进行查找/替换练习: 我继承了一个数据库,它有对象名,banker1,banker2等等,硬编码,我必须创建额外的数据库。我导出了所有查询,并用新名称替换了banker1。到目前为止还不错 是否可以从生成的单个文本文件中反转此过程,并将查询加载回Access 我以前的方法是使用Application.SaveAsText将查询导出到单个文本文件,然后循环执行查找/替换。我在使用此方法时遇到的问题是,文件是“格式化”的,可能是固定宽度
Application.SaveAsText
将查询导出到单个文本文件,然后循环执行查找/替换。我在使用此方法时遇到的问题是,文件是“格式化”的,可能是固定宽度的,但不确定,因此一些名称被跨行拆分,因此find/replace无法检测到。使用Application.LoadFromText
将它们重新加载到应用程序中效果很好,只是我仍然需要搜索查询以查找未更改的名称
编辑:请求的查询示例
BNK30追加退单
插入BNK30EntryTable(条目)
选择BNK30选择退单。输入
从BNK30选择退单
其中(((BNK30SelectChargebacks.Amount)0))
BNK30追加信贷
插入BNK30EntryTable(条目)选择
BNK30EntryQuery.来自BNK30EntryQuery的贷记,其中
((BNK30EntryQuery.Amt)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 Inputables行的上方。因此,尝试切换到将SQL作为一个大文件导出。您可以使用VBA过程根据需要修改查询名称及其SQL。这种方法应该比将查询定义转储到文本文件、在文本文件中执行搜索和替换,然后(不知何故)根据文本文件更改修改查询要简单得多 例如,使用下面的过程,您可以执行如下“用BNK31查找/替换BNK30”
修改查询“BNK30”、“BNK31”
但是,正如所写的,该过程不会更改查询。它仅显示启用.Name=strNewName
和.SQL=strNewSql
行时所做的更改。在启用这些行之前,请查看即时窗口中的输出
公共子修改查询(ByVal pFind作为字符串,ByVal pReplace作为字符串)
Dim数据库作为DAO.Database
将qdf设置为DAO.QueryDef
作为字符串的Dim strNewSql
Dim varNewName作为变量
Set db=CurrentDb
对于db.querydfs中的每个qdf
使用qdf
varNewName=Null
strNewSql=vbNullString
如果.Name像“*”&pFind&“*”那么
varNewName=Replace(.Name,pFind,pReplace)
Debug.Print“change”&.Name&“to”&varNewName
'.Name=strNewName
如果结束
如果.SQL像“*”&pFind&“*”那么
strNewSql=Replace(.SQL,pFind,pReplace)
Debug.Print Nz(varNewName、.Name)和“SQL:”
调试.打印strNewSql
'.SQL=strNewSql
如果结束
以
下一个
端接头
请注意,代码尚未经过彻底测试。这只是一个起点;你必须测试和完善它
您应该添加错误处理。如果/当过程尝试使用与现有查询或表匹配的名称命名查询时,该过程将抛出错误
注意,我编写该过程是为了重命名查询。如果您更喜欢创建新查询,请修改代码以执行此操作
db.CreateQueryDef varNewName,strNewSql
最后,确保在运行该代码的“启用”版本之前备份数据库。我怀疑你是否需要这个警告,内森,但一想到其他人不经意间打断了他们的提问,我就退缩了。@HansUp是的,没错。首先,我用11和12取代banker1。以后可能还会增加一些。例如,我有一个名为Banker1SavedEntry的查询,它引用名为Banker1Statement的表单上的控件。我需要它才能成为Banker12SavedEntry等。每个banker大约有60个相关对象,不包括VBA。@HansUp抱歉,是的,我还需要更改查询名称。这在我最初的方法中不是问题,因为当我在querydefs中循环寻找与banker1匹配的那些时,每次都将它们保存为新名称。我在Word中创建的查找/替换循环用于打开文件夹中的每个文件,执行查找/替换,然后关闭该文件。@HansUp我从导出querydf.SQL创建的文件中添加了一个查询示例。唯一会改变的是BNK30会变成BNK31。@HansUp这是我一直坚持的一点。当我使用我原来的方法进行操作时,我正在导入一个特定的文件,并告诉Access将其另存为什么。当它是一个长文本文件时,我不确定我想做的是否可能。我想我需要某种方式告诉Access这是一个新的查询。@HansUp我不知道我可以在querydef上这样做,但我会调查这条线索。导出到文本文件有点麻烦!谢谢你。我今天早上试过了,效果很好。非常感谢:)