Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 从文本文件导入以前导出的Access SQL查询_Ms Access_Vba - Fatal编程技术网

Ms access 从文本文件导入以前导出的Access SQL查询

Ms access 从文本文件导入以前导出的Access SQL查询,ms-access,vba,Ms Access,Vba,我使用这篇文章的答案将我的查询导出到一个文本文件,这样我就可以进行查找/替换练习: 我继承了一个数据库,它有对象名,banker1,banker2等等,硬编码,我必须创建额外的数据库。我导出了所有查询,并用新名称替换了banker1。到目前为止还不错 是否可以从生成的单个文本文件中反转此过程,并将查询加载回Access 我以前的方法是使用Application.SaveAsText将查询导出到单个文本文件,然后循环执行查找/替换。我在使用此方法时遇到的问题是,文件是“格式化”的,可能是固定宽度

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

我继承了一个数据库,它有对象名,banker1,banker2等等,硬编码,我必须创建额外的数据库。我导出了所有查询,并用新名称替换了banker1。到目前为止还不错

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

我以前的方法是使用
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上这样做,但我会调查这条线索。导出到文本文件有点麻烦!谢谢你。我今天早上试过了,效果很好。非常感谢:)