2016-04-21 3 views
0

У меня есть Table1 с CustomerID и Category как первичный ключ и форма, которую я использую для редактирования этой таблицы. Существует несколько FieldComboBoxes в форме, содержащей другую информацию, и CategoryComboBox, которая обновляет таблицу после выбора опции.Редактирование определенной строки в таблице Access 2013

Что я пытаюсь сделать, это найти, существует ли первичный ключ в таблице, и если это так, найдите и отредактируйте эту строку. Я использую VBA в изменении события О из CategoryComboBox:

Dim db As DAO.Database 
Dim rec As DAO.Recordset 

Set db = CurrentDb 
Set rec = db.OpenRecordset("Table1") 

If Not IsNull(DLookup("CustomerID", "Table1", "CustomerID = " & [CustomerID] AND _ 
"Category = '" & CategoryComboBox.Value & "'")) Then 
     rec.Edit 
     rec!CustomerID = CustomerID 
     rec!Category = CategoryComboBox.Value 

     rec!Field1 = Field1ComboBox.Value 
     rec!Field2 = Field2ComboBox.Value 
     ... 

     rec.Update 
End If 

Если строка с таким же первичным ключом в качестве текущей записи в форме существует в таблице, я ожидаю, что для обновления строки, но что Случается, что он обновляет вторую строку в таблице независимо от PrimaryKey. Я также попытался добавить If Category = CategoryComboBox.Value перед командой AddNew, но это не влияет.

Вкратце, как получить доступ к выбору и редактированию определенной строки - в моем случае строка с правильным первичным ключом?

ответ

1

Ваш код говорит «если запись существует в Table1 для этого клиента и категории, а затем добавить новую запись в таблицу один для этого клиента и категории» Если, как вы описали, вы редактируете существующую строку, а чем добавление нового, тогда ваше редактирование будет нерабочим, потому что вы настраиваете Customer и Category для соответствия тем, что уже было вашим критерием, поэтому я предполагаю, что в вашем примере что-то отсутствует, и это показано ниже с [other_field] и ' новое значение ".

Прежде всего, для такой операции, как вы описываете, гораздо быстрее использовать SQL напрямую, чем создавать набор записей, объективировать запись и обновлять через VBA. EG:

currentdb.execute "UPDATE Table1 set [other_field] = 'new value' where CustemerID = " & CustemerID & " AND Category = '" CategoryComboBox.Value & "';" 

Но если вы сделали что-то сложное и нуждается крючок VBA для записи, то первый выбор был бы ограничить набор записей:

Set rec = db.OpenRecordSet "select * from Table1 where customerID = " & CustomerID & " AND CategoryComboBox.Value = '" & CategoryComboBox.Value & "';" 
if rec.RecordCount > 0 then 
    rec.movefirst 
    rec.edit 
    rec.[other field] = 'new value' 
    rec.update 
    rec.close 
end if 

Опять же, пусть так же будет сделано SQL, как возможное.

Если вам действительно нужно все в наборе записей по другим причинам, то

Set rec = db.OpenRecordSet "Table1" 
if rec.RecordCount > 0 then 
    rec.findfirst("customerID = " & CustomerID & " AND CategoryComboBox.Value = '" & CategoryComboBox.Value & "'") 
    if not rec.nomatch then 
    rec.edit 
    rec.[other field] = 'new value' 
    rec.update 
    rec.close 
    end if 
end if 
+0

Мои извинения, я забыл упомянуть, что в таблице есть другие поля! Я редактировал свой вопрос. – jjjjjjjjjjj

+0

Ваш ответ сработал. Я использовал SQL в моем запросе, и теперь он обновляет точную строку. Благодаря! – jjjjjjjjjjj

1

Это работает? Я смущен, как он узнает, какая запись обновляется на основе идентификатора customerID, так как я думаю, что может быть несколько, но я думаю, что это приблизит вас.

Dim db As DAO.Database 
Dim rec As DAO.Recordset 
Dim sql As String 

Set db = CurrentDb 
Set rec = db.OpenRecordset("Table1") 

If IsNull(DLookup("CustomerID", "Table1", "CustomerID = " & Me![CustomerID] AND _ 
"Category = '" & Me!CategoryComboBox.Value & "'")) Then 
    rec.AddNew 
    rec!CustomerID = CustomerID 
    rec!Category = CategoryComboBox.Value 
    rec.Update 
ELSE: 
    sql = "UPDATE Table1 SET Category = " & Me!CategoryComboBox.Value & " WHERE CustomerID = " & Me![CustomerID] 
    DoCmd.RunSql sql 
End If 

Set rec = Nothing 
Set db = Nothing 

Exit Sub 
End Sub 
+0

Добавления Категории в SQL запрос требуется определить строку, но какой смысл обновлять его, если он уже имеет правильное значение категории ? Вот что меня смущает. – MoondogsMaDawg

+0

Мои извинения, я забыл упомянуть, что в таблице есть другие поля! Я редактировал свой вопрос. – jjjjjjjjjjj

+0

Использование SQL вместо редактирования RecordSet решило мою проблему, спасибо! – jjjjjjjjjjj

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