sql/access — вставить там, где X не существует

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

Я хочу вставить строку в МОДЕЛИ FINLDATA с FINLDATA_ID и MODEL из формы (F_EDIT_ENTRIES_MODEL_SUB), где MODEL не существует.

Форма

FINLDATA - что заполняет верхнюю часть формы

МОДЕЛИ FINLDATA — заполняет подформу (где указано время)

T_MODEL_LIST

Для каждого ВАРИАНТА мы назначаем БАЗОВОЕ ВРЕМЯ для текущих МОДЕЛЕЙ. Традиционно человек до меня копировал и вставлял времена в форме (смешно). Я закодировал кнопку для обновления времени для ВСЕХ моделей, однако это не работает, если у модели нет предыдущей записи для этого идентификатора. Форма имеет список всех моделей, которые в настоящее время находятся в T_MODEL_LIST. Во многих случаях модели не привязаны ко времени для процесса, поскольку в FINLDATA MODELS нет записи.

Каждый процесс для данной опции имеет уникальный FINLDATA_ID, этот FINLDATA_ID одинаков для всех моделей. FINLDATA MODELS — это время, которое мы обновляем. Каждая запись имеет свой уникальный FINLDATA_MODEL_ID для каждой модели (см. T_MODEL_LIST). FINLDATA_MODEL_ID — это просто число, которое считается вверх, например. если бы я добавил время в форму к модели, у которой раньше не было времени для этого процесса, это было бы общее количество записей в МОДЕЛЯХ FINLDATA +1.

Я хочу закодировать еще одну кнопку, которая добавляет запись в FINLDATA MODELS для каждой модели без учета времени.

Логика будет примерно такой:

ВСТАВИТЬ в МОДЕЛИ FINLDATA ИДЕНТИФИКАТОР FINLDATA из ФОРМЫ (Me.FINLDATA_ID.Value) и МОДЕЛЬ из T_MODEL_LIST, если он еще не присутствует в МОДЕЛЯХ FINLDATA.

Например. Для конкретного FINLDATA_ID, если MODEL из T_MODEL_LIST не существует в FINLDATA MODELS. ВСТАВЬТЕ в МОДЕЛИ FINLDATA (FINLDATA_ID, МОДЕЛИ, КОТОРЫЕ НЕ ИМЕЮТ ЗАПИСЕЙ)

Надеюсь, это прояснит ситуацию. Подформа перечисляет все модели слева, это заполняется T_MODEL_LIST, если это помогает.

SQL для запроса, который заполняет список моделей в подчиненной форме

ВЫБЕРИТЕ T_MODELS_LIST.MODEL AS MASTER_MODEL, T_MODELS_LIST.MODEL_NAME, models.FINLDATA_MODEL_ID, models.FINLDATA_ID, models.MODEL, models.[BASE TIME], models.VERIFICATION, models.COMMENTS, models.[ВРЕМЯ УСТАНОВКИ], models.STATION

FROM T_MODELS_LIST LEFT JOIN (SELECT * FROM [FINLDATA MODELS] WHERE FINLDATA_ID = Forms![F_EDIT_ENTRIES]![FINLDATA_ID]) КАК модели ON T_MODELS_LIST.MODEL = models.MODEL

ГДЕ (((T_MODELS_LIST.REMOVED)=Нет)) ORDER BY T_MODELS_LIST.MODEL;

Спасибо всем.


person mezje    schedule 08.06.2018    source источник
comment
Вы не можете комбинировать INSERT INTO ... VALUES с предложением WHERE. INSERT INTO ... VALUES вставляет только одну строку. Похоже, вам нужен запрос UPDATE или INSERT INTO ... SELECT, но с вашим текущим описанием я не уверен на 100%, что вы хотите. Можете ли вы добавить образцы данных для обеих таблиц, входные данные в этой форме и ожидаемый результат на основе этих входных данных?   -  person Erik A    schedule 08.06.2018
comment
@ErikvonAsmuth обновлен, надеюсь, немного прояснит ситуацию.   -  person mezje    schedule 12.06.2018
comment
Пожалуйста, прочтите справку по редактированию формата блока кода. Пожалуйста, прочтите минимально воспроизводимый пример и действуйте. Пожалуйста, используйте текст, а не изображения/ссылки, для текста (включая код, таблицы и ERD). Используйте изображение только для удобства, чтобы дополнить текст и/или для того, что не может быть дано в тексте. Используйте функции редактирования для встраивания, а не ссылки, если у вас есть представитель — сделайте свой пост автономным. И никогда не давайте диаграмму без легенды/ключа.   -  person philipxy    schedule 22.08.2018


Ответы (2)


Попробуйте использовать DCount, агрегат домена для подсчета записей в таблице models и принятия решения о выполнении запросов на добавление или обновление в соответствии с результатом подсчета. Также рассмотрите возможность использования параметризованных запросов с QueryDefs с сохраненными подготовленными запросами. заранее, тем более, что вы получаете пользовательский ввод.

SQL (сохранить ниже как сохраненные запросы)

ОБНОВИТЬ

PARAMETERS [BaseTimeParam] Long, [IDParam] Long; 
UPDATE [FINLDATA MODELS]
SET [BASE TIME] = [BaseTimeParam] _
WHERE [FINLDATA MODELS].FINLDATA_ID = [IDParam]

ДОБАВИТЬ

PARAMETERS [IDParam] Long, [ModelParam] Long, [BaseTimeParam] Long; 
INSERT INTO [FINLDATA MODELS] (FINLDATA_ID, MODEL, [BASE TIME])
VALUES ([IDParam], [ModelParam], [BaseTimeParam]);

VBA

Private Sub btnCopyTimes_Click() 
   ' Define variables
   Dim EnteredValue As Double, CheckCount As Long
   Dim IDToUpdate As String
   Dim qdef As QueryDef

   ' Grab ID
   IDToUpdate = Me.FINLDATA_ID.Value

   ' Prompt for new base time for ALL models
    EnteredValue = InputBox("Enter New Base Time for ALL models")

   CheckCount = DCount("*", "T_MODELS_LIST", _
                       "MODEL = " & Me.FINLDATA_MODEL_ID)

   If CheckCount >= 1 Then
       ' RUN UPDATE
       Set qdef = CurrentDb.QueryDefs("myUpdateQuery")

       qdef![BaseTimeParam] = EnteredValue        ' BIND PARAMETERS
       qdef![IDParam] = IDToUpdate 

       qdef.Execute dbFailOnError                 ' EXECUTE ACTION
   Else 
       ' RUN APPEND
       Set qdef = CurrentDb.QueryDefs("myAppendQuery")

       qdef![IDParam] = IDToUpdate                ' BIND PARAMETERS
       qdef![ModelParam] = Me.FINLDATA_MODEL_ID           
       qdef![BaseTimeParam] = EnteredValue

       qdef.Execute dbFailOnError                 ' EXECUTE ACTION
   End If

   Set qdef = Nothing

   ' Refresh the form display
   Me.F_EDIT_ENTRIES_MODEL_SUB.Form.Requery
End Sub
person Parfait    schedule 09.06.2018
comment
Спасибо, это звучит как хорошая идея, так как в списке моделей всегда будет заданное количество моделей. Попробую на работе, а там посмотрим! Ценить это :) - person mezje; 11.06.2018

' Define variables
Dim IDToUpdate As String
Dim m_strSQL As String

' Grab ID
IDToUpdate = Me.FINLDATA_ID.Value

' INSERT ID and missing model model numbers - WORKS, doesn't skip 'Removed' models
m_strSQL = "INSERT INTO [FINLDATA MODELS] (FINLDATA_ID, MODEL)" & _
            "SELECT '" & IDToUpdate & "', T_MODELS_LIST.MODEL FROM T_MODELS_LIST WHERE NOT EXISTS(SELECT MODEL FROM [FINLDATA MODELS] WHERE [FINLDATA MODELS].MODEL = T_MODELS_LIST.MODEL)"

RunSQL m_strSQL

' Refresh the form display
Me.F_EDIT_ENTRIES_MODEL_SUB.Form.Requery

Вот так у меня все заработало, всем спасибо!

person mezje    schedule 12.06.2018