2017-02-08 22 views
0

В настоящее время я пытаюсь настроить правила проверки для форм в представлении Datasheet или Form, которые запускаются сразу же после перехода на другое поле в записи или на другую запись целиком.MS Access: поиск, исключая уже выбранные значения; проверять уникальный ключ до завершения записи записи

Моя форма предназначена для добавления записей в одну таблицу назначения, где столбец первичного ключа должен соответствовать значению определенного поля в любой записи исходной таблицы. Остальные поля в форме (и таблице назначения) предназначены для общего пользовательского ввода (некоторые поля DateTime, некоторый текст, некоторые десятичные числа).

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

Введенный вами текст не является элементом в списке.
Выберите элемент из списка или ввести текст, который соответствует одному из перечисленных пунктов»

И если я повторно значение подстановок уже выбранных и перейти к следующей записи, я получаю

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

Однако, я хотел бы, чтобы эта ошибка (или подобное) появлялась немедленно, если вы переходите в другое поле в пределах одной записи. Другими словами, я хочу, чтобы он сказал мне, что это дубликат, прежде чем разрешить пользователю заполнять остальную часть текущей записи в форме или таблице.

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

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

Дубликат Значение
Вы уже использовали это значение. Вы хотите изменить эту запись или ранее записанную запись.
⪡ Это один ⪢ < Предыдущая>

Если «Предыдущий» выбран, он вскакивал на том же поле в указанной записи, обеспечивая раскрывающийся список для повторного выбора (и когда-то сделали бы вернуться назад к «текущей» записи и автовыбор временно дублируются значением.

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

ответ

0

«Решен» это VBA.

Private Sub MyControl_AfterUpdate() 
    newval = Me.MyControl.Value 
    oldval = Me.MyControl.OldValue 
    If newval = oldval Then Exit Sub ' everything's okay 
    Dim rs As Object 
    Set rs = Me.Form.Recordset 
    whereclause = "MyControl = '" & newval & "'" 
    qry = "SELECT COUNT(*) as c FROM MyQuery WHERE " & whereclause 
    qrs = CurrentDb.OpenRecordset(qry) 
    If qrs.Count = 1 Then cnt = qrs(0).Value 
    If cnt >= 1 Then 
     selval = MsgBox("Would you like to keep your selection for this record?" & vbCrLf & "[yes = change previous record's MyField; no = change MyField for this record]", vbYesNo Or VbMsgBoxStyle.vbExclamation Or vbSystemModal Or vbDefaultButton2 Or vbMsgBoxSetForeground, "Duplicate MyField selection encountered") 
     If selval = vbYes Then 
      ' set focus to the other entry, preserving selection here 
      thissel = Me.MyControl.ListIndex 
      Me.MyControl.Value = "temp" ' if a string is okay & so we can jump away from this record 
      thisloc = Me.Form.CurrentRecord ' record number 
      rs.Findfirst (whereclause) 
      thatloc = Me.Form.CurrentRecord 
      Debug.Print (thisloc & "now ; was" & thatloc) 
      Me.MyControl.Value = "invalid" 
      DoCmd.GoToRecord , , acGoTo, thisloc ' jump to the new row 
      Me.MyControl.Value = newval 
      DoCmd.GoToRecord , , acGoTo, thatloc ' jump to the one to change 
      If thissel <= 0 Then thissel = 1 ' may not be useful, given the error handling below 
      On Error Resume Next 
      Me.MyControl.ListIndex = thissel - 1 
      On Error GoTo 0 
      Me.MyControl.Dropdown 
     ElseIf selval = vbNo Then 
      Me.MyControl.Value = Me.MyControl.OldValue 
      Me.MyControl.Undo ' for some reason this doesn't clear the "dirty" bit, resulting in the edit pencil showing up for the row. 
      Me.MyControl.SetFocus 
     End If 
    Else 
     Debug.Print ("There were no matches! Das ist gut") 
    End If 
End Sub 

Остаточного Вопрос (ы)

  1. Выбор «Да» из диалога, а затем нажать побег ставят недопустимую «недопустимую» строку в поле, которое игнорирует любое требование ограничить окончательные выбор в один список (т. е. Предел к списку = 1). В идеале это «откат» двух рядов.
  2. Может быть, я должен изменить это на событие OnExit, чтобы оно не срабатывало, прежде чем я покинул ячейку? Не уверен, произойдет ли нарушение первичного ключа до этого. OnChange запускает слишком часто (каждый раз, когда вы стрелка вниз по списку).

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

  • Нет связанных вопросов^_^