#sql #vba #ms-access
Вопрос:
У меня есть три стола:
Tblrejectionid отклонения, Период, TescoYear, TescoWeek, Дата отклонения, Размер упаковки, TPNB, TPND, Код партии, Код продукта
tblReason ReasonID, ReasonDesc, Количество, Просмотренные случаи, Проверенные пакеты, Процент изменений, Отображение до
tblRejectionReason RejectionReasonID (автономер), RejectionID, ReasonID
Идея заключается в том, что может быть добавлен отказ и может быть добавлена причина для отказа.
Цель таблицы Reason для отклонения заключается в том, что отклонение может иметь не только причину для отклонения.
Я просто пытаюсь вставить идентификаторы, созданные в tblrejectionи tblReason в качестве значений внешнего ключа из соответствующего первичного ключа каждой таблицы.
testSQL1 и testSQL2 работают нормально. Но testSQL3 не вставляет значения первичного ключа двух таблиц в качестве значений внешнего ключа в связанную таблицу.
Может кто-нибудь сказать мне, что не так с testSQL3?
Dim testSQL1 As String
Dim testSQL2 As String
Dim testSQL3 As String
testSQL1 = "INSERT INTO tblRejection (period, tescoyear, tescoweek, rejectiondate, packsize, TPNB, TPND, batchcode, productID) VALUES ('x','xxxx','xx','xxxxx','xxxxx','xxxxxxx','xxxxxx','xxxxxx',1);"
testSQL2 = "INSERT INTO tblReason (reasondescription, quantity, casesinspected, inspectedpacks, affectedpacks, percentageaffected, displayuntil) VALUES ('zzzzzzz',20,100,50,20,'xxxx','xxxxxx');"
testSQL3 = "INSERT INTO tblRejectionReason (rejectionid, reasonid) " amp; _
'"SELECT tblrejection.rejectionid, tblreason.reasonid " amp; _
'"FROM tblReason " amp; _
'"INNER JOIN (tblRejection INNER JOIN tblRejectionReason ON tblRejection.RejectionID = tblRejectionReason.RejectionID) " amp; _
'"ON tblReason.ReasonID = tblRejectionReason.ReasonID;"
Debug.Print testSQL1
DoCmd.RunSQL testSQL1
Me.Refresh
Debug.Print testSQL2
DoCmd.RunSQL testSQL2
Me.Refresh
Debug.Print testSQL3
DoCmd.RunSQL testSQL3
Me.Refresh`
Комментарии:
1. Зачем использовать VBA и SQL вместо связанных форм? Почему SQL со статическими значениями?
2. Сначала я использую статические значения для тестирования. У меня есть форма, которую пользователь заполнит, и я заменю статические значения значениями из формы с помощью текстовых полей и полей со списком
Ответ №1:
Соединения не имеют смысла — удалите их. Просто нужно FROM tblReason, tblRejection
. Это вызывает декартову ассоциацию записей. Каждая запись каждой таблицы связывается с каждой записью другой таблицы, чтобы создать все возможные пары полей идентификаторов.
Установите поля rejectionID и reasonID в tblRejectionReason в качестве составного индекса, чтобы предотвратить дублирование пар.
Комментарии:
1. В чем проблема с этим запросом? «ВСТАВИТЬ В tblRejectionReason ( RejectionID, ReasonID )» amp; _ «ВЫБЕРИТЕ tblrejectionreason. Отклонение, tblReason. ReasonID » amp; _ «ОТ tblrejection’А, tblReason;»
2. Чего именно вы хотите достичь? Если вы хотите, чтобы в tblRejectionReason были все возможные пары полей идентификаторов из 2 других таблиц, мое предложение сделает это. Удалите соединения и измените значение «ОТ», как показано на рисунке. Объединения не имеют смысла, так как в tblRejectionReason нет записей, к которым можно присоединиться, и если бы они были, не было бы необходимости вставлять идентификаторы. Исследуйте декартов запрос продукта, начните с geeksforgeeks.org/sql-join-cartesian-join-self-join
3. Я бы хотел это сделать. Отклонение tblrejectionid, Дата 1, 07/07/2021 2, 07/07/2021 3, 11/07/2021 4, 11/07/2021 tblRejectionReason причина отклонения, причина отклонения, причина 1, 1, 1 2, 1, 2 3, 3, 3 4, 3, 4 tblReason ReasonID, ReasonComment, Количество 1, Найденная проблема — цвет (Уровень: 2), 65 2, Найденная проблема — Повреждение от холода (Уровень: 2), 90 3, Найденная проблема — Гниль и плесень (Уровень: 3/4), 125 4, Найденная проблема — Гниль (уровень: 3 и 4), 108
4. Ситуация, когда отказ может иметь одну или несколько причин для отклонения. Я планирую сначала заставить пользователя заполнить всю информацию по одной причине. Затем создайте функцию поиска, чтобы иметь возможность добавлять ДОПОЛНИТЕЛЬНЫЕ причины к существующему отказу. Ссылка на то, чего я хочу достичь: ibb.co/RY9YtVb
5. Это не меняет ни моих комментариев, ни предложений.
Ответ №2:
Я пошел и переделал свою базу данных, потому что я сделал ее слишком сложной.
Теперь у меня просто есть две таблицы с основным и внешним ключом, а также форма и подформа.
«Много ко многим» было не нужно.