2014-02-11 2 views
6

Я создал пользовательскую форму excel для сбора данных. Я подключил его к Access для сброса данных. Однако я хочу обновлять Access каждый раз, когда пользователь нажимает кнопку отправки.Как проверить запись с помощью идентификатора, тогда если запись существует обновление, если не добавить новую запись

В принципе мне нужен оператор Select, чтобы определить существование идентификатора, а затем, если он не существует, мне нужно использовать INSERT для добавления новой строки. Я очень новичок в любом SQL, поэтому любая помощь будет отличной.

Вот код, который у меня есть сейчас, мне нужно адаптировать его к ADO.

Sub Update() 
Dim cnn As ADODB.Connection 
Dim MyConn 
Dim rst As ADODB.Recordset 
Dim StrSql As String 

Set cnn = New ADODB.Connection 
MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB 

With cnn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .Open MyConn 

Set rst = New ADODB.Recordset 
rst.CursorLocation = adUseServer 
rst.Open Source:="Foam", ActiveConnection:=cnn, _ 
     CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _ 
     Options:=adCmdTable 





StrSql = "SELECT * FROM Foam WHERE FoamID = " & txtMyID 
Set rst = CurrentDb.OpenRecordset(StrSql, dbOpenDynaset) 

If (rst.RecordCount = 0) Then 
    DoCmd.RunSQL "INSERT INTO Foam (ID, Part, Job, Emp, Weight, Oven) VALUES " & _ 
      "(" & txtID & ", '" & txtField1 & "', '" & txtField2 & "', '" & txtField3 & "', '" & txtField4 & "', '" & txtField5 & "');" 

End If 

' Close the connection 
    rst.Close 
    cnn.Close 
    Set rst = Nothing 
    Set cnn = Nothing 


End With 

End Sub 

ответ

3

я пересмотрел свой образец кода достаточно, чтобы получить его работу в моей системе и эту версию в Excel 2007.

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

Когда lngId не соответствует id существующей записи, набор записей открывается пустым [(.BOF And .EOF) = True]. В этой ситуации я добавляю новую запись и добавляю к ней значения поля.

Sub Update() 
    Const TARGET_DB As String = "database1.mdb" 
    Dim cnn As ADODB.Connection 
    Dim MyConn As String 
    Dim rst As ADODB.Recordset 
    Dim StrSql As String 
    Dim lngId As Long 

    Set cnn = New ADODB.Connection 
    MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB 
    With cnn 
     .Provider = "Microsoft.ACE.OLEDB.12.0" 
     .Open MyConn 
    End With 

    lngId = 4 
    StrSql = "SELECT * FROM tblFoo WHERE id = " & lngId 
    Set rst = New ADODB.Recordset 
    With rst 
     .CursorLocation = adUseServer 
     .Open Source:=StrSql, ActiveConnection:=cnn, _ 
       CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _ 
       Options:=adCmdText 
     If (.BOF And .EOF) Then 
      ' no match found; add new record 
      .AddNew 
      !ID = lngId 
      !some_text = "Hello World" 
     Else 
      ' matching record found; update it 
      !some_text = "Hello World" 
     End If 
     .Update 
     .Close 
    End With 

    Set rst = Nothing 
    cnn.Close 
    Set cnn = Nothing 
End Sub 
+0

Должны ли быть значительные изменения для excel 2013? Я получаю "ошибка 3265 Элемент не может быть найден в коллекции, соответствующей запрашиваемому имени или порядку." The! Some + text = "Hello World" отключает эту ошибку – Crabara

+0

'some_text' - это имя поля в моей таблице tblFoo. Замените имя своего поля. Если это имя включает пробел, пунктуацию или любые символы, отличные от букв, цифр или '_', заключите имя поля в квадратные скобки как это ...'! [Ваше поле] ' – HansUp

+0

Спасибо вам большое! Я действительно обновил свою базу данных доступа от пользовательской формы excel! Теперь мне просто нужно заполнить обновления в БД из текстовых полей, а не статических значений. Но ты меня очень близко! Благодаря! – Crabara

1

Использование VBA, вот пример того, как запрос на определенный ID, чтобы проверить, если он существует. Если не добавить его через INSERT заявление:

Dim rs As DAO.Recordset 
Dim StrSql As String 

StrSql = "SELECT * FROM MyTable WHERE ID = " & txtMyID 
Set rs = CurrentDb.OpenRecordset(StrSql, dbOpenDynaset) 

If (rs.RecordCount = 0) Then 
    DoCmd.RunSQL "INSERT INTO MyTable (ID, Field1, Field2) VALUES " & _ 
      "(" & txtID & ", '" & txtField1 & "', '" & txtField2 & "');" 
End If 
+0

Как я могу изменить 101, Whatever, Man) в недавно добавленные данные? – Crabara

+0

Могу ли я добавить (TextBox1.Value, TextBox2.Value .....)? – Crabara

+0

** @ пользователь3297842 **, да это должно работать – Linger

Смежные вопросы