在Access VBA中从表中的记录创建查询

3
我正在为一家小企业使用Microsoft Access进行产品定价。我有一个产品表、我们供应商的价格和专门的客户表格。不同的查询取出我们供应商的价格,并将不同的加价应用于不同的价格级别。对于一些客户,我们在某些产品上提供特殊价格,但其余的产品属于某个价格级别。然后,我将客户的特殊定价与他们的价格级别查询相结合。如果存在特殊价格,则使用该价格而不是他们的常规价格级别价格。为了获得此查询,我首先必须为每个客户创建一个查询,以从客户定价查询中获取他们的所有产品和特价。然后,我将该查询与价格级别查询连接起来。如果我不执行第一步并将客户定价与价格级别查询连接起来,那么具有相同产品的特殊定价的客户将显示多次,这是不允许的。因此,如果我创建一个查询从客户定价中取出他们的价格,然后再与价格级别连接,它就可以工作。
抱歉如果我没说清楚。如果您有问题或需要更多详细信息,请告诉我。
我完全不懂VBA。我可以阅读并遵循,但从未编写过VBA代码。
我的要求是使用VBA代码搜索客户表,并检查每个客户是否拥有自己的查询,将他们的价格与客户价格分离,因此如果添加新客户,则自动为其创建查询。然后创建一个查询,将其价格级别与刚刚创建的查询连接起来。
这可能吗?还是有更好的方法来处理这个问题。非常感谢。
这是我的表格:
供应商          产品                CustomerPrds      客户 Prcode <--------Prcode 1------多 Prcode Prname                                    CustID 多-------1 CustID                                                 CustPrice
以下是一个价格级别和一个客户的查询示例。

J6
字段:PrCode   PrName   PrBulked   PrMultiple   $/GAL $/UNIT
来源:所有这些都来自产品表“$/GAL:计算的字段以标记供应商”“$/UNIT:$/GAL * PrMultiple”
客户价格
字段: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]; 

1
请发布您现有的查询/查询。 - Fionnuala
嗨Lars,将查询发布到Stackoverflow的最佳方法是切换到Access中的SQL视图,并从该窗口剪切和粘贴文本。它看起来像SELECT stuff FROM Table1 ... - Fionnuala
嗯,好主意,我没想到。我会加上的。 - Lars Hovden
至少,您可以将客户作为表单上的控件进行引用,例如:[Customer Pricing].customerid = Forms!MyForm!cboSelectCustomer 这意味着您不需要为每个客户编写一个查询。还有其他可以简化的事情。 - Fionnuala
我之前没有真正接触过表单。所以我是从客户定价还是客户创建一个表单? - Lars Hovden
这个最好在聊天中讨论,但不幸的是还没有 :( 只有通过表单才能真正使用Access。对于我所说的示例,首先为了安全起见,请复制您的数据库,然后创建一个空白表单并使用向导添加组合框。应该从客户表中选择组合框,并将客户ID作为第一绑定列,客户名称为您自己方便。选择客户名称并运行引用组合框名称的简单查询。您也可以在查询中使用参数,但我的空间不足。 - Fionnuala
1个回答

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和recordset之间存在开销差异,但我不熟悉它们是什么。
qry = "SELECT CustPrice FROM CustomerPrds WHERE CustID=" & Forms!MyForm!cboSelectCustomer & " AND Prcode=" & Forms!MyForm!cboSelectProduct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接