Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Простой вопрос про открытие формы для добавления записи
 
 автор: dimonicss   (16.02.2008 в 19:39)   личное сообщение
 
 

Чего-то не срабатывает код

DoCmd.OpenForm "Телефоны", acNormal
DoCmd.GoToRecord , , acNewRec
Me!НомерТел = x

где x - текстовое зачение присваиваемое до этого в отдельной форме для ввода
НомерТел - строковое значение в Таблице Телефоны и связанной с ней Формы Телефоны.
Я так понимаю что не годится Me! для записи которая еще не создана, а только будет создаваться. Подскажите как правильнее команду задать.

  Ответить  
 
 автор: akkorn   (16.02.2008 в 22:53)   личное сообщение
 
 

необходимо
1-открыть форму. команда "DoCmd.OpenForm "Телефоны", acNormal" верная.
но можно просто "DoCmd.OpenForm "Телефоны"
2-перейти на новую запись. команда "DoCmd.GoToRecord , , acNewRec" верная
3-задать значение в поле. имя поля необходимо знать. как называется графа в таблице- значения не имеет. правильно так: Me!НомерТел = "фыв"
но это при том, что у вас есть полле с именем "НомерТел"
если все так- то необходимо поставить кавычки.
если знакчение задается из другой формы или из памяти (переменная и т.д.)- то необходимо писать так:
Me!НомерТел = Переменная1
или
Me!НомерТел =Форма1!Поле1!Value

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

Удачи!

  Ответить  
 
 автор: Explorer   (16.02.2008 в 23:08)   личное сообщение
 
 

>Подскажите как
>правильнее команду задать.

IMHO правильнее всего будет устанавливать DefaultValue для нужного поля (еще до того как перейти к нужной записи)

  Ответить  
 
 автор: akkorn   (17.02.2008 в 14:13)   личное сообщение
 
 

Explorer
> устанавливать DefaultValue для нужного поля

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


а если Вы настаиваете на фразе
еще до того как перейти к нужной записи

тогда может получиться так, что мы будем дорабатывать форму по возникновении ошибки (не важно какой), и когда все будет гутт- мы нажмем САВЕ. И все, дефаульт наш последний, тоже сохранится вместе с измененными обьектами и кодом. И всегда уже будет иметь какое-то начальное значение DefaultValue, пока его не определят, т.е. до первой ошибки.
А это уже НЕ гутт

  Ответить  
 
 автор: Анатолий (Киев)   (18.02.2008 в 12:24)   личное сообщение
 
 

У DoCmd.OpenForm есть аргумент OpenArgs, через который можно передать ваше значение, а по событию Form_BeforeInsert прочитать его из Me.OpenArgs и присвоить полю.

  Ответить  
 
 автор: dimonicss   (19.02.2008 в 04:40)   личное сообщение
 
 

Все-таки не пойму почему у меня не работает.
Полный код функции такой
Function ТелефАдрес(x)
Dim MyCriteria As String
Dim MyRst As Recordset
MyCriteria = "[НомерТел] = '" & x & "'"
Set MyRst = CurrentDb.OpenRecordset("Телефоны", dbOpenDynaset)
With MyRst
.FindFirst MyCriteria
If Not MyRst.NoMatch Then
k = MyRst![Код]
DoCmd.OpenForm "Телефоны", acNormal
DoCmd.GoToRecord , , acGoTo, k
Else
DoCmd.OpenForm "Телефоны", acNormal
DoCmd.GoToRecord , , acNewRec
Me!НомерТел = x
End If
End With
MyRst.Close
End Function

Если вместо
Me!НомерТел = x
например пишу
MsgBox x
то при обработке функции сообщение с введенным текстом выскакивает.
а с Me пишет

Compile error:
Invalid use of Me keyword

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

  Ответить  
 
 автор: osmor   (19.02.2008 в 11:16)   личное сообщение
 
 

Телефоны - простая форма? или табличная/ленточная?
где эта функция прописана?
ME можно использовать только в модуле формы для обращения к этой самой форме

  Ответить  
 
 автор: dimonicss   (19.02.2008 в 16:45)   личное сообщение
 
 

Телефоны простая форма. Функция Function ТелефАдрес(x) прописана в Modules / Module1, то есть не в модуле формы, а в общих модулях. А вызов функции идет следующим образом: сначала нажатием на кнопку на одной из форм открывается обычная форма ВводТелефона, в которой одно поле для ввода номера телефона и копка Продолжить. После ввода номера телефона и нажатия на кнопку Продолжить одет следующая команда:

Private Sub Продолжить_Click()
x = Me![НомерТел]
DoCmd.Close
Call ТелефАдрес(x)
End Sub

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

  Ответить  
 
 автор: osmor   (19.02.2008 в 17:19)   личное сообщение
 
 


Function ТелефАдрес(x)
Dim MyCriteria As String
Dim MyRst As Recordset
MyCriteria = "[НомерТел] = '" & x & "'"
Set MyRst = CurrentDb.OpenRecordset("Телефоны", dbOpenDynaset)
With MyRst
.FindFirst MyCriteria
If Not MyRst.NoMatch Then
k = MyRst![Код]
DoCmd.OpenForm "Телефоны",, ,"[Код] = " & k, acFormEdit
Else
   DoCmd.OpenForm "Телефоны",,,,acFormAdd,,x

End If
End With
MyRst.Close
End Function


В форме телефоны на событие загрузка пишем:

Private Sub Form_Load()
If Me.DataEntry And Nz(OpenArgs, "") <> "" Then Me!НомерТел= OpenArgs
End Sub


Общие рекомендации вместо


MyCriteria = "[НомерТел] = '" & x & "'"
Set MyRst = CurrentDb.OpenRecordset("Телефоны", dbOpenDynaset)
With MyRst
.FindFirst MyCriteria
....


я бы использовал dlookup

Dim MyRst As Recordset - желательно указывать тип рекордсета во избежании скрытых ошибок
в вашем случае

Dim MyRst As dao.Recordset

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList