Сложность использования оператора SELECT в VBA - PullRequest
0 голосов
/ 31 мая 2018

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

ID    scenarioID    reductionID    Impact Variable    Variable Impact
1         1              1          Safety             4
2         1              1          Environmental      2
3         1              1          Financial          1 

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

Вот код.Я оставил DoCmd.SQL перед оператором select из-за отсутствия чего-либо еще, чтобы разместить там сейчас.

Private Sub Var1R1_Click() 'Stores appropriate values in tImpact upon click

'Declaring database and setting recordset
Dim db As Database
Dim rs As Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("tImpact")


'Declaring Variable as Scenario Choice combobox value
Dim Sc As Integer

Sc = Schoice.Value


'Stores impact variable 
Dim impvar1 As String


'Desired impact variable for column 1
impvar1 = DLookup("impactVariable", "tImpactVars", "ID = 1")



DoCmd.RunSQL "SELECT * FROM tImpact WHERE [Impact Variable] = " & impvar1 & " AND scenarioID = " & Sc



If rs.EOF Then

    DoCmd.RunSQL "INSERT INTO tImpact(scenarioID, [Impact Variable], [Variable Impact])" & "VALUES (" & Sc & ", " & impvar1 & ", 1)"

    MsgBox "Record Added", vbOKOnly


Else

    db.Execute "UPDATE tImpact SET [Variable Impact] = 1 WHERE [Impact Variable] = " & impvar1 & " AND scenarioID = " & Sc

    MsgBox "Record Updated", vbOKOnly


End If

End Sub

Если кто-нибудь может сказать мне, как заставить работать этот оператор SELECT или другой способ сделать это, это было бы здорово.

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вы можете использовать набор записей.В этом случае набор записей лучше, так как вы выполняете SQL только один раз, если он возвращает запись, вы «редактируете», а если нет, то «добавляете» с тем же reocrdset.Этот подход не требует кода FAR, и значения, которые вы устанавливаете в reocrdset, не требуют кавычек или разделителей и т. Д.

например:

scenaridID = 1             ' set this to any number
impvar1 = "Safety"         ' set this to any string
updateTo = "Financial"

strSQL = "select * from tImpact where [Impact Variable] = '" & impvar1 & "'" & _
        " AND scenaridID = " & scenaridID

Set rst = CurrentDb.OpenRecordset(strSQL)
With rst
  If .RecordCount = 0 Then
     ' add the reocrd
     .AddNew
  Else
     .Edit
  End If

  !scenaridID = scenarid
  ![Impact Variable] = impvar1
  ![Variable Impact] = 1
  .Update
End With
rst.Close

Таким образом, вы можете использовать тот же код дляобновление и редактирование.Это просто вопрос, если вы добавите или отредактируете.

0 голосов
/ 31 мая 2018

Используйте OpenRecordset и получите идентификатор для записи, если она существует.

Private Sub Command0_Click()

    Dim aLookup(1 To 3) As String
    Dim aAction(1 To 3) As String
    Dim rs As Recordset
    Dim db As Database

    'Replace these two constants with where you get the information on your form
    Const sIMPVAR As String = "Financial"
    Const lSCENID As Long = 1

    'Build the SQL to find the ID if it exists
    aLookup(1) = "SELECT ID FROM tImpact"
    aLookup(2) = "WHERE ScenarioID = " & lSCENID
    aLookup(3) = "AND ImpactVariable = """ & sIMPVAR & """"

    'Run the sql to find the id
    Set db = CurrentDb
    Set rs = db.OpenRecordset(Join(aLookup, Space(1)))


    If rs.BOF And rs.EOF Then 'it doesn't exist, so build the insert statement
        aAction(1) = "INSERT INTO tImpact"
        aAction(2) = "(ScenarioID, ImpactVariable, VariableImpact)"
        aAction(3) = "VALUES (" & lSCENID & ", '" & sIMPVAR & "', 1)"
    Else 'it does exist, so build the update statement
        aAction(1) = "UPDATE tImpact"
        aAction(2) = "SET VariableImpact = 1"
        aAction(3) = "WHERE ID = " & rs.Fields(0).Value
    End If

    'Run the action query
    db.Execute Join(aAction, Space(1))

    rs.Close
    Set rs = Nothing
    Set db = Nothing

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