首页 > 解决方案 > 访问vba将单列查询连接成单行结果

问题描述

我有一个新数据库来帮助生成用于订单处理的文档。

我设置了一个查询,其中只有一列结果(产品代码)由主表单上选择的订单确定。

我需要能够使用这些信息来命名我的文件

(客户)(产品 1)+(产品 2)+(产品....)(位置)

我有生成行 (Customer) (Product1) (Location) 的代码,并且正在尝试获取连接函数或循环函数或其他东西以使所有产品与每个“行”之间的“+”对齐”。

我有一个查询 (Query1) 设置为我提供我需要的确切数据...

SELECT tblREF_Chemical.Abbr
FROM qry_AX_LineItems_DISTINCT INNER JOIN tblREF_Chemical ON 
qry_AX_LineItems_DISTINCT.ItemId = tblREF_Chemical.[Item Number]
GROUP BY tblREF_Chemical.Abbr, qry_AX_LineItems_DISTINCT.SALESID, 
tblREF_Chemical.[Proper Shipping Name]
HAVING (((qry_AX_LineItems_DISTINCT.SALESID)=[Forms]![frm_SalesOrderEntry]! 
[Combo617]) AND ((tblREF_Chemical.[Proper Shipping Name]) Is Not Null));

我在主窗体上设置了一个按钮来测试数据输出,然后我打算将代码添加到我的代码中以获取 DoCmd.Output 文件名。

到目前为止,唯一有效的代码是......

Private Sub Command1492_Click()
Dim i As Integer

Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim SQL As String

Set db = CurrentDb
SL = [Forms]![frm_SalesOrderEntry]![Combo617]

SQL = "SELECT * FROM  ALL_SalesOrderItemsLineDates WHERE 
ALL_SalesOrderItemsLineDates.SALESID = '" & SL & "';"
Set rst = db.OpenRecordset(SQL)

For i = 0 To DCount("*", "ALL_SalesOrderItemsLineDates", 
 "ALL_SalesOrderItemsLineDates.SALESID = '" & [Forms]![frm_SalesOrderEntry]! 
[Combo617] & "'") - 1
 Debug.Print DLookup("[Abbr]", "[tblREF_Chemical]", "[Item Number]= '" & 
rst.Fields("ItemID") & "'")
 rst.MoveNext
Next i

rst.Close

End Sub

我似乎无法在此代码中添加其他 where 语句或使用我的实际查询,否则系统在 db.OpenRecordset 代码行出现错误(错误 3061 和 3078)。

即使忽略这些问题,输出也是多行的,我需要将它用于文档名称的单个文本字符串中。

更新1:

我正在使用代码直接使用我的查询...

Dim i As Integer

Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim SQL As String

Set db = CurrentDb
SL = [Forms]![frm_SalesOrderEntry]![Combo617]

SQL = "SELECT tblREF_Chemical.Abbr "
SQL = SQL & "FROM qry_AX_LineItems_DISTINCT INNER JOIN tblREF_Chemical ON qry_AX_LineItems_DISTINCT.ItemId = tblREF_Chemical.[Item Number] "
SQL = SQL & "GROUP BY tblREF_Chemical.Abbr, qry_AX_LineItems_DISTINCT.SALESID, tblREF_Chemical.[Proper Shipping Name] "
SQL = SQL & "HAVING ((qry_AX_LineItems_DISTINCT.SALESID)='" & SL & "'"
SQL = SQL & "AND ((tblREF_Chemical.[Proper Shipping Name]) Is Not Null));  "

Set rst = db.OpenRecordset(SQL)
Dim s As String

Do While rst(0) Is Not Null
   s = s & "+" & rst(0)
   rst.MoveNext
Loop
rst.Close
Debug.Print s

不幸的是,我现在遇到运行时错误 3061 - 参数太少。预期 1。

我已经仔细检查了我的拼写并运行了查询以确保无论查询得到多少结果(按预期运行)我仍然收到此错误。

更新2:

通过更多的研究,我了解到,由于缺少更好的词,查询可以有不可见的编码。我正在更新我的代码以从我的查询中删除内部查询,以简化我的 VBA 必须做的“研究”量。

Private Sub Command1492_Click()

Dim i As Integer

Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim SQL As String

Set db = CurrentDb
SL = [Forms]![frm_SalesOrderEntry]![Combo617]

SQL = "SELECT tblREF_Chemical.Abbr "
SQL = SQL & "FROM ALL_SalesOrderItemsLineDates INNER JOIN tblREF_Chemical ON ALL_SalesOrderItemsLineDates.ItemId = tblREF_Chemical.[Item Number] "
SQL = SQL & "GROUP BY tblREF_Chemical.Abbr, ALL_SalesOrderItemsLineDates.SALESID, tblREF_Chemical.[Proper Shipping Name]"
SQL = SQL & "HAVING ((ALL_SalesOrderItemsLineDates.SALESID)='" & SL & "'"
SQL = SQL & "AND ((tblREF_Chemical.[Proper Shipping Name]) Is Not Null));  "

Set rst = db.OpenRecordset(SQL)
Dim s As String

Do While rst(0) Is Not Null 'Debug error here!
   s = s & "+" & rst(0)
   rst.MoveNext
Loop
rst.Close
Debug.Print s

End Sub

不幸的是,我仍然遇到运行时错误,但现在需要 424 对象,调试将我带到“Do While”行。

我认为这是向前迈出的一步,但仍然有点卡住。

Update3: 由于调试将我带到“Do While”行,我返回到我的功能代码并用基于整数的代码替换了循环函数。

谢谢#骚扰爸爸!你的代码是一个巨大的帮助!将您的想法用于字符串而不是直接使用 debug.print 是天才。

下面从我遇到问题的地方开始替换我的代码。

Dim s As String

For i = 0 To DCount("*", "ALL_SalesOrderItemsLineDates", "ALL_SalesOrderItemsLineDates.SALESID = '" & SL & "'") - 1
 s = s & "+" & rst.Fields("Abbr")
 rst.MoveNext
Next i

 rst.Close
 Debug.Print s

我的结果显示只有一个打嗝。

+CHA+DEEA+EEP+MEC+PERC+PM+PROP

开头有一个额外的“+”,但我相信我可以找到解决这个小问题的方法。

我希望这些笔记可以在将来对某人有所帮助。谢谢大家的帮助!

标签: vbaloopsms-access-2016

解决方案


Private Sub Command1492_Click()
Dim i As Integer

Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim SQL As String

Set db = CurrentDb
SL = [Forms]![frm_SalesOrderEntry]![Combo617]
SQL = "SELECT tblREF_Chemical.Abbr "
SQL = SQL & "FROM qry_AX_LineItems_DISTINCT INNER JOIN tblREF_Chemical ON "
SQL = SQL & "qry_AX_LineItems_DISTINCT.ItemId = tblREF_Chemical.[Item Number] "
SQL = SQL & "GROUP BY tblREF_Chemical.Abbr, qry_AX_LineItems_DISTINCT.SALESID, "
SQL = SQL & "tblREF_Chemical.[Proper Shipping Name] "
SQL = SQL & "HAVING (((qry_AX_LineItems_DISTINCT.SALESID)='" &  SL & "'"  'edit here
SQL = SQL & "AND ((tblREF_Chemical.[Proper Shipping Name]) Is Not Null));  "  


Set rst = db.OpenRecordset(SQL)
Dim s as string

Do While rst(0) is not null
   s = s & "+" & rst(0)
   rst.MoveNext
Loop
rst.Close
Debug.print s
End Sub

推荐阅读