Сохранить запись с помощью INSERT - сохранить и 1 INSERT не работает, но остальные работают нормально - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать или сохранить запись, и если связанная запись существует во вторичной таблице, она только сохраняет / обновляет запись в форме. Операторы INSERT работают просто отлично, но я сосу на ссылки на формы / подчиненные формы и чувствую, что это как-то связано с ними.

Private Sub cmdSave_Click()
    On Error GoTo cmdSave_Click_Err

DoCmd.RunCommand acCmdSaveRecord

If DCount("*", "[tblRegSR]", "[WorkOrderID] = " & [Forms]![frmWelcome]![sfrmWorkOrders].Form![txtID]) > 0 Then
    DoCmd.GoToRecord , "", acNewRec
    Me.lstWorkOrders.Requery
    Me.lstWorkOrders.Value = ""
    Me.txtComments.Value = ""
    MsgBox "Save Completed"
Else
    DoCmd.SetWarnings True
    DoCmd.OpenQuery "qryInsertSR"
    RunSQL "INSERT INTO tblFirstSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblSecondSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblInflatorSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblHPSPGSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblOctoSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblComputerSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    DoCmd.GoToRecord , "", acNewRec
    Me.lstWorkOrders.Requery
    Me.lstWorkOrders.Value = ""
    Me.txtComments.Value = ""
    MsgBox "Sub Tables Injected"
End If


cmdSave_Click_Exit:
    Exit Sub

cmdSave_Click_Err:
    MsgBox Error$
    Resume cmdSave_Click_Exit

End Sub

Я ожидаю, что процесс проверит, существует ли запись в tblRegSR, имеющая отношение к tblWorkOrders, и запись соответствует соответствующему связанному полю ([WorkOrderID] в tblRegSR соответствует [ID] в tblWorkOrders ). Если соответствующая запись не существует в tblRegSR, создайте ее вместе с дочерними таблицами (tblFirstSR и т. Д.).

Кроме того, он просто не обновляет / не сохраняет исходную запись в DoCmd.RunCommand acCmdSaveRecord
Так что я не совсем уверен, где это вызывает проблемы. Это не ВСТАВКА в tblWorkOrders или tblRegSR, но это ВСТАВКА во все другие таблицы. Я уверен, что как только я уясню две другие INSERT, выражение IF будет работать нормально ... Я надеюсь ...

РЕДАКТИРОВАТЬ НИЖЕ:
Вот пара скриншотов типов данных:
Тип данных tblWorkOrders
tblRegSR Тип данных
Тип данных дочерней таблицы
Изображение моей таблицы Отношения

Что касается счетчика, я предполагаю, что он работает, потому что он всегда завершает оператор ELSE, где он INSERT строк в дочерних таблицах (tblFirstSR и т. Д.). Однако он НЕ ВСТАВЛЯЕТСЯ в tblRegSR и не сохраняет запись в форме (которая находится в tblWorkOrders). Надеюсь, это ответит на ваши вопросы @Nathan_Sav - спасибо!

РЕДАКТИРОВАТЬ ВТОРОЕ:
Вот изображение нарушения правила валидации:
Нарушение правил валидации

ИЗМЕНИТЬ ТРИ:
Я решил просто поделиться всей базой данных. Вот ссылка. База данных заказов на работу

РЕДАКТИРОВАТЬ ЧЕТЫРЕ (10 января 19):
Вот новый код, который я использую вместе с кодом, который я использую в своем запросе на добавление qryInsertSR

В qryInsertSR это SQL, который я использую:
INSERT INTO tblRegSR (WorkOrderID, CustomerID) VALUES (Forms![frmWelcome]![sfrmWorkOrders].Form![txtID], Forms![frmWelcome]![sfrmWorkOrders].Form![Customer])

Кроме того, я обновил фрагмент кода выше, чтобы отразить любые сделанные мной изменения.

ПРАВИТЬ ПЯТЬ (11 января 19):
Вот изображение моего браузера объектов, показывающее все в базе данных. Включая sfrmWorkOrders.
ЗДЕСЬ

1 Ответ

0 голосов
/ 08 января 2019

При попытке использовать значения формы в DLookUp и запросе SQL вы должны использовать проходные значения в качестве параметров или путем конкатенации. Если не используется сохраненный запрос, значения формы должны быть переданы в необходимый SQL или DLookUp, а не жестко запрограммированы со строкой.

В противном случае механизм доступа использует буквенное значение '[Forms]![frmWelcome]![sfrmWorkOrders].Form![txtID]', которое не выполняется, поскольку оно не является числом и использует неэкранированные специальные символы. Это может быть причиной нарушения преобразования типов.

Поэтому отрегулируйте DCount как:

If DCount("*", "[tblRegSR]", "[WorkOrderID] = " & [Forms]![frmWelcome]![sfrmWorkOrders].Form![txtID]) > 0 Then
        ...

И сохраняют ваш запрос на добавление в качестве объекта MS Access. Эти типы запросов могут читать параметры формы / отчета или любой объект, открытый на экран:

INSERT INTO tblRegSR (WorkOrderID, CustomerID) 
VALUES (Forms![frmWelcome]![sfrmWorkOrders].[Form]![txtID], 
        Forms![frmWelcome]![sfrmWorkOrders].[Form]![Customer])

Для запуска в VBA следующим образом (без необходимости закрывать его как запрос действия):

If DCount("*", "[tblRegSR]", "[WorkOrderID] = " & [Forms]![frmWelcome]![sfrmWorkOrders].[Form]![txtID]) > 0 Then
    MsgBox "Save Completed"
Else
    DoCmd.SetWarnings True           ' REDUNDANT AS WARNINGS START AS TRUE
    DoCmd.OpenQuery "mySavedQuery"
    RunSQL "INSERT INTO tblFirstSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblSecondSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblInflatorSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblHPSPGSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblOctoSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    RunSQL "INSERT INTO tblComputerSR (ServiceRecordID) SELECT Max(ID) FROM tblRegSR"
    MsgBox "Sub Tables Injected"
End If

DoCmd.RunCommand acCmdSaveRecord     ' MOVE SAVE INSTANCE TO END
DoCmd.GoToRecord , "", acNewRec
Me.lstWorkOrders.Requery
Me.lstWorkOrders.Value = ""
Me.txtComments.Value = ""

Таблица отношений

Учитывая все вышесказанное, тщательно подумайте о ваших табличных отношениях, которые вызывают нарушения ссылочной целостности между родительскими и дочерними таблицами в зависимости от обновления. В частности, ваш рабочий процесс выше пытается обновить дочернюю таблицу после записи родительской таблицы. Первичный ключ от родительского элемента должен существовать до внешнего ключа дочернего элемента. Выше будет заполнено tblRegSR только в том случае, если его отношение к tblWorkOrder нарушено.

Table Relationships Image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...