Доступ: Как я могу отобразить новую запись в одной форме после создания во второй форме - PullRequest
0 голосов
/ 13 мая 2011

Access 2007: у меня есть одна форма с отображением сотен записей.У меня есть вторая форма для редактирования или создания новых записей.Когда я возвращаюсь к первой форме после добавления новой записи, я делаю При активации: Me.Requery, чтобы новая запись добавлялась в список, но мне бы хотелось, чтобы она отображалась на экране с селектором записи для новой записи.Есть ли способ сделать это?Я предполагаю, что я сохраняю идентификатор в глобальной переменной, но не уверен, что делать дальше.Благодарю.

ОТВЕТ: Спасибо // т.Ваш ответ заставил меня двигаться в правильном направлении.Я опубликую свое решение, которое я считаю более обходным.Должно быть лучшее решение, но это похоже на работу.

Форма 1 (список) -> Форма 2 (редактировать / новая) и создать новую запись.

Private Sub Form_Current ()
  glngID = Me.ID.Value
End Sub

Private Sub Form_Close
  gstrLastForm = "Form2"
End Sub

Когда я закрываю форму 2, форма 1 активна.

Private lngSelectedRecord as Long

Private Sub Form_Activate()
  Me.Requery
  FindSelectedRecord
  If gstrLastForm = "Form2" Then
    DoCmd.GoToRecord acDataForm, "Form1", acGoTo, lngSelectedRecord
  End If 
End Sub

Private Sub FindSelectedRecord()
  ...
  Open recordset, move through records, increment counter, exit when ID found
  ...
  lngSelectedRecord = intCounter
  ...
End Sub 

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Обычно это делается с помощью формы, открытой в диалоговом режиме. В большинстве случаев в главной форме у вас будет кнопка «ДОБАВИТЬ НОВУЮ ЗАПИСЬ», которая при нажатии запускает такой код:

  DoCmd.OpenForm "MyAddForm", , , , acFormAdd, acDialog 

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

Однако вам нужно знать PK записи, которая была добавлена, поэтому вы не можете просто закрыть форму и позволить коду продолжаться. Итак, обычная практика - установить для свойства диалогового окна Visible значение False, извлечь из него нужные вам данные, затем закрыть его и сделать то, что вы хотите:

  Dim lngPK As Long
  DoCmd.OpenForm "MyAddForm", , , , acFormAdd, acDialog 
  If Forms!MyAddForm.Tag <> "Cancel" Then
     lngPK = Forms!MyAddForm!PK
     Application.Echo False 
     Me.Requery
     With Me.RecordsetClone
       .FindFirst "[PK]=" & lngPK
       If Not .NoMatch Then
          If Me.Dirty Then
             Me.Dirty = False
          End If
          Me.Bookmark = .Bookmark
       End If
     End With
     Application.Echo True
  End If
  DoCmd.Close acForm, "MyAddForm"

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

  If Me.Dirty Then
     Me.Dirty = False
  End If.
  Me.Visible = False

... и кнопка ОТМЕНА делает это:

  Me.Undo
  Me.Tag = "Cancel"
  Me.Visible = False

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

Это все стандартное проектирование пользовательского интерфейса Access, и на сегодняшний день это самый простой и самый пуленепробиваемый метод для подобных действий.

1 голос
/ 13 мая 2011

Используйте метод on_close в вашем всплывающем окне, чтобы перейти к вставленной записи, что-то вроде:

private sub on_close()
  'maby first check we're not undoing..
  docmd.gotoRecord yourform,yournewid
  me.close

(на OSX в настоящее время, но я надеюсь, что вы поняли концепцию ...)

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