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

Форум: MS ACCESS

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

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

 
 

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

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

тема: работа со списками
 
 автор: joka   (16.03.2009 в 12:09)   личное сообщение
 
 

помогите пожалуйста решить несколько вопросов:

исходные данные: есть форма, источник данных (select * from сотрудники).
на форме есть поля которые связаны с полями таблицы "сотрудники".
и сверху есть выкидной список, в нем источник строк (select id, ФИО from сотрудники), при этом первый столбец ширины 0, т.е. в списке видны только фамилии. При выборе фамилии в списке, поля формы заполняются в соответствии с выбранной фамилией.

вопросы:
1. если например есть два Петровых, можно ли сделать так чтобы когда я набираю "петров" в поле списка, он открывался и показывал этих двух петровых чтобы можно было выбрать, а то поиучмолчанию он подставляет верхнего из двух Петровых.
2. я объединил источник строк списка с пустой записью, можно ли сделать так чтобы при открытии формы по умолчанию в списке стояла пустая запись и форма содержала пустые(незаполненные поля).
3. если в выкидном списке осущствляется выборка двух столбцов из таблицы, при этом первый скрывается установкой ширины "0". как задавать значение по умолчанию в таком списке?

  Ответить  
 
 автор: Анатолий (Киев)   (16.03.2009 в 13:20)   личное сообщение
 
 

Допустим, ваш "выкидной список" называется Combo.
1. На его событие KeyDown выполняйте Me![Combo].DropDown и список будет открываться при вводе символа.
3. Значение по умолчанию всегда задается для связанного столбца.
2. "я объединил источник строк списка с пустой записью" - тут я не понял. Это UNION запрос?
Как вы это сделали и зачем? ИМХО на событие Form_Load вам нужно выполнить перемещение на новую запись (например - метод DoCmd.GoToRecord ...), а Combo, если не задано значение по умолчанию, и так будет пустым. Это действие можно выполнить и после очистки Combo.

  Ответить  
 
 автор: joka   (16.03.2009 в 16:00)   личное сообщение
 
 

спасибо.

  Ответить  
 
 автор: joka   (16.03.2009 в 16:01)   личное сообщение
 
 

Это UNION запрос?
да был UNION запрос... теперь попробую последовать вашему совету.

  Ответить  
 
 автор: joka   (16.03.2009 в 16:30)   личное сообщение
 
 

Анатолий (Киев)

воспользовался вашим советом, использовал DoCmd.GoToRecord ,,acNewRec
только вот косячок остался маленький у меня написана функция
Private Sub ПолеВыбораСотрудника_AfterUpdate()
If Me.FilterOn Then Me.FilterOn = False ' это я сбрасываю фильтры если они выставлялись, чтобы получить весь набор записей.
Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
Me.Bookmark = Me.RecordsetClone.Bookmark
RecCount.Caption = Me.Recordset.RecordCount

так вот, на форме присутствует стандартная кнопка, "создать новую запись", когда я загружаю форму все хорошо, т.е. все поля формы пустые и ПолеВыбораСотрудника тоже.
а при нажатии данной кнопки все поля формы становятся пстыми для ввода, а ПолеВыбораСотрудника не сбрасывается и хранит последнее значение:(

как это исправить? (раньше я принудительно выбирал пустое значение прицепленое UNION'ом)...

  Ответить  
 
 автор: Анатолий (Киев)   (16.03.2009 в 17:15)   личное сообщение
 
 

Me![ПолеВыбораСотрудника] = Null

И еще:

Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
Me.Bookmark = Me.RecordsetClone.Bookmark

Здесь вы не проверяете NoMatch, а зря.


RecCount.Caption = Me.Recordset.RecordCount

Пока вы не попадете в последнюю запись, св-во RecordCount может вернуть неправильный результат.

  Ответить  
 
 автор: joka   (16.03.2009 в 17:30)   личное сообщение
 
 

с Null уже сам разобрался:) а вот с остальным:)?
может и глупый вопрос но как проверять NoMatch? это я так понял на отсутстсвие данных???


Пока вы не попадете в последнюю запись, св-во RecordCount может вернуть неправильный результат.

а с этим тогда как быть?

и кстати попробовал На событие KeyDown установть Me![Combo].DropDown
список то открывается а еще като тонадо отобрать записи.. а фильтра у списка вроде нет, он только для формы бывает...

  Ответить  
 
 автор: joka   (17.03.2009 в 09:09)   личное сообщение
 
 


Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
Me.Bookmark = Me.RecordsetClone.Bookmark
Здесь вы не проверяете NoMatch, а зря.



я правильно понял так надо проверять?
If Not Me.RecordsetClone.NoMatch Then
Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
Me.Bookmark = Me.RecordsetClone.Bookmark
End If

а чем все таки грозит отсутствие такой проверки? просто это событие стоит на апдейт списка, который ограничен по своим значениям - точно СУЩЕСТВУЮЩИМИ значениями из таблицы...


RecCount.Caption = Me.Recordset.RecordCount


а тут надо что то типа?

RecCount.Caption = 0
Me.Recordset.MoveFirst
while not Me.Recordset.EOF
RecCount.Caption = RecCount.Caption + 1
Me.Recordset.MoveNext
wend

так?

  Ответить  
 
 автор: joka   (17.03.2009 в 09:47)   личное сообщение
 
 

и кстати нашел ошибку которая возникает в следующем случае.
ввожу билеберду в поел списка, access ругается и говорит выбери из списка правильное значение, стираю то что набрал в поле списка и давлю на ввод, вываливается в дебуг на строке Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
то есть NoMatch не работает у меня? или он не предотвращает такой ошибки? надо дополнительно ее ловить?

  Ответить  
 
 автор: Анатолий (Киев)   (17.03.2009 в 11:34)   личное сообщение
 
 


стираю то что набрал в поле списка и давлю на ввод, вываливается в дебуг на строке Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]

Естественно вывалится, т.к. Me![ПолеВыбораСотрудника] в этот момент равно Null.
Можно сделать так: "id = " & NZ(Me![ПолеВыбораСотрудника],0), но лучше вообще не выполнять поиск, если IsNull(Me![ПолеВыбораСотрудника])

  Ответить  
 
 автор: joka   (17.03.2009 в 11:36)   личное сообщение
 
 

понял спасибо еще раз!

остался вопрос открытым только с открывающимся списком отбирающим значения по введенным буквам, я так понимаю что там на лету RecordSource списка надо менять???

  Ответить  
 
 автор: Анатолий (Киев)   (17.03.2009 в 10:29)   личное сообщение
 
 


я правильно понял так надо проверять?
If Not Me.RecordsetClone.NoMatch Then
Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
Me.Bookmark = Me.RecordsetClone.Bookmark
End If

Нет, неправильно.

  Me.RecordsetClone.FindFirst "id = " & Me![ПолеВыбораСотрудника]
If Not Me.RecordsetClone.NoMatch Then
  Me.Bookmark = Me.RecordsetClone.Bookmark
End If
А так - красивше:

With Me.RecordsetClone
   .FindFirst "id = " & Me![ПолеВыбораСотрудника]
 If Not .NoMatch Then Me.Bookmark = .Bookmark
End With


а тут надо что то типа?

RecCount.Caption = 0
Me.Recordset.MoveFirst
while not Me.Recordset.EOF
RecCount.Caption = RecCount.Caption + 1
Me.Recordset.MoveNext
wend
так?

Можно и так, но это как-то через ж... Лучше так:

With Me.RecordsetClone
 If Not .BOF Or Not .EOF Then .MoveLast
   RecCount.Caption = .RecordCount
End With

ЗЫ. Мой вам совет - не ленитесь заглядывать в HELP по любому случаю. Если не дружите с английским, найдите в инете Help на A97 rus. Была ссылка и на этом сайте.

  Ответить  
 
 автор: joka   (17.03.2009 в 11:07)   личное сообщение
 
 

Спасибо за коментарии и помощь! Хелп читаю, но видимо не умею в нем нормально искать то что надо:) как написали вы про то что есть NoMatch сразу нашел и уже понял что не правильно привел свой пример:)
Спасибо еще раз вроде все работает.. поправлю и в остальных местах в коде,
но вот с ошибкой проблема осталась!!!! ее надо ловить отдельно? КАК ВЫ ДУМАЕТЕ?

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