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

时间:2011-10-10 09:16:52

标签: ms-access vba

我正在使用Microsoft Access进行小型企业的产品定价。我有产品表,我们的供应商价格和专业客户表。有不同的查询采用我们的供应商的价格并应用不同价格水平的标记。对于某些客户,我们对某些产品给予特价,但其余产品属于特定价格水平。然后,我将客户的特殊定价与其价格水平查询相结合。如果存在特殊价格,则使用该价格而不是其常规价格水平价格。要获得此查询,我首先必须对每个客户进行查询,以便从客户定价查询中获取所有产品和特殊价格。然后我用价格水平查询加入该查询。如果我没有做第一步并加入价格水平查询的客户定价,那些对同一产品有特殊定价的客户,该产品多次显示我不能拥有。因此,如果我创建一个查询,以便从客户定价中取出价格,然后以价格水平加入,那就可以了。

很抱歉,如果我不清楚的话。如果您有任何疑问或想要了解更多细节,我将提供。

我根本不认识VBA。我可以阅读并遵循,但从未编写过VBA代码。

我想要的是VBA代码搜索customers表并检查每个客户是否有自己的查询将其价格与客户价格分开,因此如果添加新客户,它会自动为他们创建查询。然后创建一个查询,将其价格水平与刚刚创建的查询相结合。

这可能吗?或者有更好的方法来解决这个问题。非常感谢。

到目前为止,这是我的表格

供应商 产品 CustomerPrds 客户
Prcode< -------- Prcode 1 ------ 许多 Prcode
Prname CustID 许多 ------- 1 CustID
CustPrice

以下是一个价格级别和一个客户的查询示例

J6
字段:PrCode PrName PrBulked PrMultiple $ / GAL $ / UNIT
Src:所有这些都来自产品tbl“$ / GAL:计算字段以标记供应商$”“$ / UNIT:$ / GAL * PrMultiple”
CustomerPricing
字段:CustID CustName PrCode PrName Cust $
Src: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 个答案:

答案 0 :(得分: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