sql / access - вставить где X не существует - PullRequest
0 голосов
/ 08 июня 2018

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

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

Форма

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

FINLDATA MODELS - заполняет подформу (где назначено время)

T_MODEL_LIST

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

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

Я хочу закодировать другую кнопку, которая добавляет запись в МОДЕЛИ FINLDATA для каждой модели без времени.

Логика будет выглядеть примерно так:

ВСТАВИТЬ в FINLDATA МОДЕЛИ FINLDATAИдентификатор из FORM (Me.FINLDATA_ID.Value) и MODEL из T_MODEL_LIST, где его еще нет в FINLDATA MODELS

Например, для конкретного 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.MODELE, models.MODEL, models.], models.VERIFICATION, models.COMMENTS, models. [ВРЕМЯ УЧРЕЖДЕНИЯ], models.STATION

FROM T_MODELS_LIST ВЛЕВО ПРИСОЕДИНЯЕТСЯ (ВЫБРАТЬ * ИЗ [МОДЕЛЕЙ FINLDATA] ГДЕ FINLDATA_ID = Forms! [F_EDIT_ENTRIES_]] FINATA) AS models ON T_MODELS_LIST.MODEL = models.MODEL

WHERE ((((T_MODELS_LIST.REMOVED) = Нет)) ЗАКАЗАТЬ T_MODELS_LIST.MODEL;

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

Ответы [ 2 ]

0 голосов
/ 12 июня 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

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

0 голосов
/ 09 июня 2018

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

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

ОБНОВЛЕНИЕ

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

APPEND

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...