vba - Access 将 VBA 中的查询从多个源追加到一个表中,Access 2010
问题描述
我几乎从不发帖寻求帮助并尝试自己解决,但现在我被困住了。我只是想将多个表中的数据附加到一个表中。源表是每个美国州的数据集,每个州的附加查询都是相同的,除了要从每个州表中提取的嵌套选择脚本。所以我想创建一个 VBA 脚本,它为每个状态引用一个较小的脚本,而不是为每个状态引用一个完整的附加脚本。我不确定是否应该执行 SELECT CASE、FOR TO NEXT 或 FOR EACH NEXT 或 DO LOOP 或其他操作。
这是我到目前为止所拥有的:
tblLicenses 是一个包含 LicenseState 字段的表,我可以从中提取状态列表。
Function StateScripts()
Dim rst As DAO.Recordset
Dim qryState As String
Dim StateCode As String
Set rst = CurrentDb.OpenRecordset("SELECT LicenseState FROM tblLicenses GROUP BY LicenseState;")
' and I've tried these, but they don't work
' qryState = DLookup("LicenseState", "tblLicenses")
' qryState = "SELECT LicenseState INTO Temp FROM tblLicenses GROUP BY LicenseState;"
' DoCmd.RunSQL qryState
Select Case qryState
Case "CT"
StateCode = "CT"
StateScripts = " SELECT [LICENSE NO] AS StateLicense, [EXPIRATION DATE] AS dateexpired FROM CT "
Case "AK"
StateCode = "AK"
StateScripts = " SELECT [LICENSE] AS StateLicense, [EXPIRATION] AS dateexpired FROM AK "
Case "KS"
StateCode = "KS"
StateScripts = " SELECT [LicenseNum] AS StateLicense, [ExpDate] AS dateexpired FROM KS "
End Select
CurrentDb.Execute " INSERT INTO TEST ( StLicense, OldExpDate, NewExpDate ) " _
& " SELECT State.StateLicense as StLicense, DateExpire AS OldExpDate, State.dateexpired AS NewExpDate " _
& " FROM ( " & StateScripts & " ) AS State " _
& " RIGHT JOIN tblLicenses ON (State.StateLicense = tblLicenses.LicenseNum) " _
& " GROUP BY State.StateLicense, DateExpire, State.dateexpired " _
& " HAVING (((LicenseNum) Like '*" & StateCode & "*') ; "
End Function
解决方案
听起来您正在处理对相同信息使用不同列名的输入源,并且您正在努力将其全部合并到一个表中。我将假设您正在处理 50 个每隔一段时间更新一次的文本文件。
这是您可以处理此项目的一种方法...
使用 VBA 构建文件名集合(Dir()
在特定文件夹中使用)。然后遍历文件名的集合,执行以下操作:
- 使用 VBA 将文件添加为链接表,保留列名。
- 遍历
TableDef
对象中的列并将变量设置为列的实际名称。(见下面的示例代码) - 构建一个简单的 SQL 语句,将链接表插入到列出所有当前许可证到期日期的单个表中。
以下是一些有关如何处理此问题的示例代码:
Public Sub Example()
Dim dbs As Database
Dim tdf As TableDef
Dim fld As Field
Dim strLic As String
Dim strExp As String
Dim strSQL As String
Set dbs = CurrentDb
Set tdf = dbs.TableDefs("tblLinked")
' Look up field names
For Each fld In tdf.Fields
Select Case fld.Name
Case "LICENSE", "LICENSE NO", "License Num"
strLic = fld.Name
Case "EXPIRATION", "EXPIRATION DATE", "EXP"
strExp = fld.Name
End Select
Next fld
If strLic = "" Or strExp = "" Then
MsgBox "Could not find field"
Stop
Else
' Build SQL to import data
strSQL = "insert into tblCurrent ([State], [License],[Expiration]) " & _
"select [State], [" & strLic & "], [" & strExp & "] from tblLinked"
dbs.Execute strSQL, dbFailOnError
End If
End Sub
现在有了组合了所有新数据的新表,您可以构建更复杂的分组查询来生成最终输出。我喜欢这种方法,因为我更喜欢在可视化构建器中而不是在 VBA 代码中管理更复杂的查询。
推荐阅读
- prometheus - Prometheus alertmanager 倍增通知最重要
- php - 如何在codeigniter中获取多个通配符中的值
- vba - 命名范围更改时数据透视表不刷新[VBA]
- java - 如何在 SSL 配置的 tomcat 中缓存和更新 CRL(证书吊销列表)/OCSP 响应?
- python - GridSearchCV 在管道中将 fit_params 传递给 XGBRegressor 会产生“ValueError:需要超过 1 个值才能解包”
- java - 如何在 JavaFX 中将父级的大小与其子级的大小绑定,反之亦然?
- typescript - 缺少 CORS 标头“Access-Control-Allow-Origin”。发布到 API 时
- angular6 - Anhular 6 post方法tod在json中添加一行
- jenkins - 是否可以在 Jenkinsfile 中定义非阻塞输入步骤?
- graph - Power BI:当源包含空值时使折线图连续(处理缺失值)