#ms-access #vba
#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»
Оценка клиентов
Поле: 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. Пожалуйста, опубликуйте свой существующий запрос / запросы.
2. Эй, Ларс, лучший способ отправлять запросы в Stackoverflow — это переключиться на представление SQL в Access и вырезать и вставить текст из этого окна. Это выглядит примерно так
SELECT stuff FROM Table1 ...
3. Дух. Хорошая мысль об этом не подумала. Я тоже добавлю это
4. По крайней мере, вы можете ссылаться на клиента как на элемент управления в форме, например:
[Customer Pricing].customerid = Forms!MyForm!cboSelectCustomer
Это означало бы, что вам не нужен запрос для каждого клиента. Есть и другие вещи, которые можно упростить.5. Я действительно не работал с формами раньше. Итак, я бы создал форму из Customer Pricing или Customers?
Ответ №1:
Не совсем уверен, что понимаю, но, похоже, достаточно быстрого условного оператора VBA… вы можете использовать dlookup, чтобы определить, есть ли конкретная цена для клиента, и задать свой запрос на основе результата. Если я далеко от базы — можете ли вы предоставить более подробный сценарий с образцами данных?
Вот некоторый код VBA, который я бы использовал для выбора между двумя разными запросами на основе наличия CustPrice для этого клиента / продукта…
if not isnull(dlookup("CustPrice","CustomerPrds","CustID=" amp; Forms!MyForm!cboSelectCustomer amp; " AND Prcode=" amp; 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=" amp; Forms!MyForm!cboSelectCustomer amp; " AND Prcode=" amp; Forms!MyForm!cboSelectProduct