从 Access VBA 中的表中的记录创建查询
Posted
技术标签:
【中文标题】从 Access VBA 中的表中的记录创建查询【英文标题】:Create query from record in table in Access VBA 【发布时间】:2011-10-10 09:16:52 【问题描述】:我正在使用 Microsoft Access 为小型企业进行产品定价。我有一张产品表、我们供应商的价格表和专门的客户表。有不同的查询可以获取我们供应商的价格并对不同的价格水平应用标记。对于某些客户我们对某些产品给予特殊的价格,而其余的产品则属于一定的价格水平。然后,我将客户的特殊定价与他们的价格水平查询结合起来。如果存在特殊价格,则使用该价格而不是其正常价格水平价格。要获得此查询,我首先必须对每个客户进行查询,以从客户定价查询中获取他们的所有产品和特价。然后我将该查询与价格水平查询结合起来。如果我不做第一步并加入带有价格水平查询的客户定价,对同一产品有特殊定价的客户,该产品会出现多次,而我不能拥有。因此,如果我创建一个查询以从客户定价中提取他们的价格,然后加入价格水平,它就可以工作。
对不起,如果我不清楚。如果您有疑问或想了解更多详细信息,我会提供。
我根本不懂 VBA。我可以阅读并遵循,但从未编写过 VBA 代码。
我想要的是 VBA 代码来搜索客户表并检查每个客户是否有自己的查询,将他们的价格与客户价格分开,因此如果添加了新客户,它会自动为他们创建一个查询。然后创建一个查询,将他们的价格水平与刚刚创建的查询连接起来。
这可能吗。或者有没有更好的方法来解决这个问题。非常感谢。
这是我目前的表
供应商 产品 CustomerPrds 客户 Prcode 1-----many Prcode Prname 客户 ID 很多--------1客户ID 客户价格
这是一个价格水平和一个客户的查询示例
J6 字段: PrCode PrName PrBulked PrMultiple $/GAL $/UNIT Src: 所有这些都来自 Products tbl "$/GAL:calculated field to mark up supplier$" "$/UNIT:$/GAL * PrMultiple" CustomerPricing 字段:CustID CustName PrCode PrName Cust$ 来源: CustPrds Custms CustPrds Prds CustPrds Cust1 CustPricing 查询 CustID=1 的所有字段加入 Cust1 和 J6 加入 J6 中的所有记录和 J6.PrCode=CustomerPricing.PrCode 的记录 PrCode - 来自 J6 的多个。 $/Gal:如果 CustID=1, cust$, J6.$/GAL
这是查询的 SQL
SELECT [Customer Products].customerid,
customers.customer,
[Customer Products].[Product Number],
chevron_products.[MATERIAL NAME],
chevron_products.bulked,
chevron_products.uom,
chevron_products.multiple,
[Customer Products].[Customer Price],
[Customer Price] * [Chevron_Products]![Multiple] AS [$/UNIT]
FROM customers
INNER JOIN ((chevron91311
RIGHT JOIN chevron_products
ON chevron91311.[MATERIAL NUMBER] =
chevron_products.[MATERIAL NUMBER])
INNER JOIN [Customer Products]
ON chevron_products.[MATERIAL NUMBER] =
[Customer Products].[Product Number])
ON customers.[Customer Number] = [Customer Products].customerid;
SELECT [Customer Pricing].customerid,
[Customer Pricing].[Product Number],
[Customer Pricing].[Customer Price]
FROM [Customer Pricing]
WHERE (( ( [Customer Pricing].customerid ) = 2 ));
SELECT j6.[MATERIAL NUMBER],
j6.[MATERIAL NAME],
j6.bulked,
j6.uom,
j6.multiple,
Iif([Customer Pricing].[CustomerID] = 2,
[Customer Pricing].[Customer Price], [J6].[$/GAL]) AS [$/GAL],
[$/GAL] * [J6].[Multiple]
AS [$/UNIT]
FROM j6
LEFT JOIN cobbprds
ON j6.[MATERIAL NUMBER] = cobbprds.[Product Number]
ORDER BY j6.[MATERIAL NAME];
【问题讨论】:
请发布您现有的查询/查询。 嘿 Lars,在 *** 上发布查询的最佳方式是切换到 Access 中的 SQL 视图,然后从该窗口剪切和粘贴文本。它看起来像SELECT stuff FROM Table1 ...
呃。好点没想到。我也会补充的
至少,您可以将客户称为表单上的控件,例如:[Customer Pricing].customerid = Forms!MyForm!cboSelectCustomer
这意味着您不需要针对每个客户进行查询。还有其他可以简化的事情。
我以前没有真正使用过表单。那么我会根据客户定价或客户创建一个表单吗?
【参考方案1】:
不完全确定我是否理解,但看起来一个快速的 VBA 条件语句就足够了......您可以使用 dlookup 来确定是否有客户特定的价格并根据结果设置您的查询。如果我离基地很远 - 您能否提供更详细的示例数据场景?
这里有一些 VBA 代码,我可以根据该客户/产品是否存在 CustPrice 在两个不同的查询之间进行选择...
if not isnull(dlookup("CustPrice","CustomerPrds","CustID=" & Forms!MyForm!cboSelectCustomer & " AND Prcode=" & Forms!MyForm!cboSelectProduct)) then
lookupQuery = "SELECT foo FROM bar WHERE baz='abc'"
else
lookupQuery = "SELECT foo From bar WHERE baz='xyz'"
现在您已经有条件地将查询设置为执行您需要的操作,并且可以通过记录集执行:
dim rs as recordset
set rs = currentdb.openrecordset(lookupQuery)
while not rs.eof
'do stuff with the recordset here
wend
rs.close
顺便说一下 - 上面的 dlookup 和这个查询是一样的。虽然我确信使用 dlookup 和记录集之间存在开销差异,但我不熟悉它们是什么。
qry = "SELECT CustPrice FROM CustomerPrds WHERE CustID=" & Forms!MyForm!cboSelectCustomer & " AND Prcode=" & Forms!MyForm!cboSelectProduct
【讨论】:
以上是关于从 Access VBA 中的表中的记录创建查询的主要内容,如果未能解决你的问题,请参考以下文章
如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表
在不使用 VBA/Access 中的内联查询的情况下向表中添加记录