#database #ms-access #ms-access-2010
#База данных #ms-access #ms-access-2010
Вопрос:
Я все еще довольно новичок в Access, поэтому прошу прощения, если это довольно простой материал. У меня есть база данных с таблицей, содержащей информацию о разных компаниях и их продуктах. Пользователь может ввести несколько продуктов в поле «Продукт» на основе выпадающего списка флажков. Например, у меня может быть название компании в поле «Название компании», а затем в поле «Продукты» может быть до четырех продуктов, которые она производит: «Игрушки, бытовая техника, мебель, чистящие средства».
Я создал отчет для создания списка компаний по продуктам. Пользователь открывает форму, в которой он может выбрать один из продуктов в выпадающем списке, а затем нажать go. В идеале, созданный отчет содержит всех поставщиков, которые производят этот продукт. Однако моя проблема заключается в том, что если компания производит несколько продуктов, фильтр не включает эту компанию, поскольку она точно не соответствует указанным критериям.
По сути, я ищу какой-то способ указать отчету фильтровать для всех компаний, если он СОДЕРЖИТ определенный продукт, а не просто равен этому продукту. Я не уверен, как это сделать. Я надеюсь, что это имеет смысл, любая помощь будет оценена!
Ответ №1:
Вам нужно иметь две таблицы (возможно, на самом деле три; я пойду с тремя).
Таблица компаний Информация о компании: имя, адрес, номер телефона и т. Д., Плюс поле идентификатора, Которое будет целочисленным, Auto (автоматически назначается Access) и будет первичным ключом.
Таблица ProductType Список типов ваших товаров (игрушки и так далее). Будет содержать идентификатор, определенный в соответствии с идентификатором в таблице Customer.
Таблица CustomerProduct Также будет иметь идентификатор в соответствии с двумя другими. Он также будет иметь два поля int: CustomerID и ProductTypeId. Они будут содержать значение столбца ID в таблицах Customer и ProductType. Они будут определены как внешние ключи: Access не позволит вам поместить, например, 10 в ProductTypeId, если ProductType не имеет строки с идентификатором 10. Это называется целостностью ссылок и помогает обеспечить согласованность ваших данных.
Вы также можете создать уникальный индекс для CustomerID и ProductID (один индекс для двух полей). Это гарантирует, что вы не получите одну и ту же комбинацию ProductType / Customer в базе данных дважды.
Запросы Теперь вы можете использовать строки в ProductType для раскрывающихся списков, которые содержат типы продуктов. Если вам нужно добавить одно, вы просто добавляете строку в таблицу ProductType, и код подберет ее. Чтобы получить список клиентов, у которых есть ProductType, вы выполняете объединение между Customer и CustomerProduct . Что-то вроде:
select *
from Customer c
inner join CustomerProduct p on p.CustomerID = c.ID
where p.ProductTypeID = 10
(предполагается, что тип продукта, который они ищут, имеет идентификатор 10).
На самом деле это правильный способ сделать это. Ваш способ — наличие нескольких типов продуктов в одной строке customer — немного усложняет задачу. Есть способ обойти вашу непосредственную проблему, но я не собираюсь туда идти, поскольку этот тип дизайна, хотя и не является необычной ошибкой для начинающих, приводит к ужасным проблемам позже. Сделайте это правильно с самого начала.
Комментарии:
1. Большое вам спасибо! Это сработало отлично. Я подумал, что это должно быть какой-то проблемой дизайна. Еще раз спасибо!