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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Помогите, пожалуйста! Очень очень нужно!!!
 
 автор: Санька   (13.04.2009 в 13:52)   личное сообщение
37 Кб.
 
 

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

Одним словом, очень нужна процедура добавления значения в поле со списком.

Перечень полей в источнике строк (таблице):

КодУчастника (счетчик, ключевое поле);
ФИОУчастника (текстовый);
ДатаРождения (дата/время);
НомерПаспорта (текстовый).

Наименование таблицы: ОсновныеДанные


Перечень полей в форме:
ФИОУчастника;
ДатаРождения;
НомерПаспорта.

Наименование формы: ОсновныеДанные

Все указанные поля являются ключевыми, то есть определяющими уникальность «Участника» по инициалам, дате рождения и номеру паспорта, тем самым снижая вероятность совпадений. Соответственно, процедура «Отсутствие в списке» должна обеспечивать обновление всех полей источника строк (таблицы ОсновныеДанные).
Пользуюсь Access 2000. "Кусочек" базы прикрепил.

Заранее благодарен и очень признателен!

  Ответить  
 
 автор: Дрюня   (13.04.2009 в 14:45)   личное сообщение
 
 


Все указанные поля являются ключевыми, то есть определяющими уникальность «Участника» по инициалам, дате рождения и номеру паспорта, тем самым снижая вероятность совпадений


вроде как пачпорта д.б. достаточно для ключа
это все Вашего задание или там целый "букет" ?

  Ответить  
 
 автор: Санька   (13.04.2009 в 16:44)   личное сообщение
 
 

осталсь только эта проблемка))

а по поводу пачпорта)) я предполагал, что поле "ФИОУчастника" будет основное, а "паспорт" и "дата рождения" не обязательными (не всегда есть возможность внести эти данные, когда создается новая запись). Но, наверное так не получится, если определять уникальность записи по всем полям. Или все же возможно?

На этом портале вот по этой ссылке http://hiprog.com/index.php?option=com_content&task=view&id=49&Itemid=35
уже есть аналогичная процедура, только она написана для добавления значения в список значений, а не в поле со списком (в таблицу - источник строк).
А в примечании под процедурой указана именно та задача, решить которую у меня не хватает знаний.

  Ответить  
 
 автор: Санька   (16.04.2009 в 00:04)   личное сообщение
 
 

Неужели никому неподсилу наисать такую процедуру?

  Ответить  
 
 автор: Denis V.   (16.04.2009 в 10:44)   личное сообщение
 
 

В общем, план обработки события отсутствия в списке с целью добавления записи в таблицу-источник, содержащую несколько полей для одной записи такой: необходимо запросить значения всех полей этой записи у пользователя, добавить запись в таблицу, обновить поле со списком.
А вот реализация целиком и полностью на Вас. Как Вы будете запрашивать значения полей у пользователя? По очереди с помощью окна ввода или разом через специальную форму? А добавлять запись в таблицу с помощью набора записей или соберёте и выполните запрос на добавление?.. Поиск по сайту Вам поможет. Пробуйте, если что-то будет не получаться, спрашивайте. :-)

  Ответить  
 
 автор: Санька   (17.04.2009 в 09:41)   личное сообщение
 
 

Спасибо, Денис. План я знаю, только писать процедуры сам не умею.

И по сайту я уже искал, нашел аналогичную процудуру, но она добавляет значения в список, а мне нужно добавление в поле со списком. Она находится по этой ссылке: http://hiprog.com/index.php?option=com_content&task=view&id=49&Itemid=35

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

  Ответить  
 
 автор: Goblin   (16.04.2009 в 14:25)   личное сообщение
 
 

Сделай на свою таблицу форму. В режиме конструктора щелкни поле ФИО и из миню Формат преобразуй его в поле со списком. В свойствах на вкладке Данные найди Источник строк. Нажми там на кнопку с 3-я точками откроется построитель запроса. Укажи в нем свою таблицу и выбери поле ФИО. Тобиш само на себя получится. В этом запросе задай условие отбора <>"" чтобы не вылезали пустые строки. Затем в этом же запросе щелкни правой клавишей и свойства (запроса). Установи "Уникальные значения" - Да. - Это на то, что бы каждая повторяющаяся запись вылезала только один раз.
После этого вводя первую букву в поле со списком, в нем будет появляться фамилия на указанную букву. По вводу второй буквы, соответственно фио по первым 2-м. Короче как в экселе.
Все поля ключевые делать не стоит. Могут быть разные товарищи с одинаковыми ФИО. (Иванов Иван Иванович и Иванов Илья Игнатьевич. А то оба и вовсе одинаковые с одним днем рождения. (близнецы Сергей и Семен) Завязки на них делай по коду (счетчик) "Код участника"
Обновлять поле можно после каждого ввода - Свойства поля - События - Потеря фокуса и создать макрос обновить поле. Это совсем просто.
И еще глянь ссылку http://hiprog.com/index.php?option=com_content&task=view&id=251661615&Itemid=35
И рядом с ней тут же на сайте. Там много чего интересного. И все работает.

  Ответить  
 
 автор: Санька   (16.04.2009 в 15:23)   личное сообщение
 
 

Спасибо, ребят!!! Ссылку обязательно посмотрю!

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

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

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

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

Я знаю, как она должна работать, но не знаю, как написать))) И времени у меня осталось не больше недели...

Вот и прошу Вас помочь.

С уважением,

  Ответить  
 
 автор: Goblin   (16.04.2009 в 22:08)   личное сообщение
34 Кб.
 
 

Я имел в виду вот так. Смотри в архиве. В VBA не силен, да и не нужно там ничего делать. Все составляется мышью. Для поиска есть запросы или поле специальное для поиска в заголовке формы можно поставить. Примерно так как отсылаю в твоей форме. Короче напиши техническое задание, может у меня что готовое найдется.

  Ответить  
 
 автор: Санька   (17.04.2009 в 09:34)   личное сообщение
 
 

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

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

А когда прописана эта процедура (добавление в поле со списком) то происходит следующее. Ставим курсор в поле со списком, начинаем вводить (например, фамилию имя и отчество), происходит автоматический поиск и подстановка наиболее подходящей записи. В случае, если такая запись уже есть, мы соглашаемся и она возвращается, то есть отражается во все полях (ФИО, Дата рождения и паспорт). Хотя, конечно, в идеальном варианте уникальность записи (значение ключевого пля - счетчика) необходимо определять по всем трем полям: ФИОУчастника, Дата роджение и Номер паспорта. Тогда вероятнось совпадений будет очень малой. И процедура события "Отсутствие в списке" должна вести поиск по всем указанным полям и предлагать дбавение во все три поля.

Если же такой записи нет, появляется сообщение "Значение отсутствует в списке. Добавить?" и кнопка "ОК". При нажатии "ОК" Аксесс (благодаря этой процедуре) создает новую запись в источнике строк (в таблице, к котрой присоединено поле со списком), автоматически добавляет набранное в поле со спискм значение в источник строк и после ввода значений в поле дата рождения и в поле номер паспорта обновляет форму.

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

Да и процедура эта небольшая, просто я не владею VBA и потому не могу сам это прописать. А для программстов, знающих язык - это пара пустяков. Лет семь назад, один такой программист прописал мне эту процедуру за 20 минут. И работала она очень красиво. Только, как я уже говорил, утерял я эту базу, а то взял бы процедуру оттуда и приспособил бы ее для этой базы.

В любом случае, спасибо за отклик.

  Ответить  
 
 автор: snipe   (17.04.2009 в 11:21)   личное сообщение
 
 

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

  Ответить  
 
 автор: Санька   (17.04.2009 в 11:29)   личное сообщение
 
 

Можно где-нибудь посмотреть пример такого решения? А то я слабо представляю, как это реализуется...

  Ответить  
 
 автор: Denis V.   (17.04.2009 в 11:58)   личное сообщение
 
 

Вы как-то не так представляете себе использование одиночной формы, основанной на таблице. Такая форма используется для просмотра, редактирования, удаления и добавления одной записи в один приём. Для поиска записей в таких формах можно применить отдельное дополнительное (!) поле для поиска, можно и со списком, у которого в свойстве "Данные" ничего не прописано, т.н. "свободное" поле, как Вы и делали. Только Вы сделали поле для поиска вместо поля данных, что вызывает путаницу: попробуйте выбрать что-то в списке, а потом перемещаться по записям с помощью кнопок перехода. Будет выглядеть смешно :-)
С использованием дополнительного "свободного" поля со списком для поиска записей, при обработке события NotInList с целью добавления новой записи план действий такой: отменить добавление, перейти на новую запись формы, вставить новые данные в поле для данных, пересчитать форму, обновить поле со списком (которое для поиска), добавить новые данные в поле со списком (которое для поиска).
И как обычно, HELP вам в помощь :-)

  Ответить  
 
 автор: FORMAT   (17.04.2009 в 13:07)   личное сообщение
20 Кб.
 
 

Поиск по форумам даст вам полно примеров. Вот один из них ( не помню с какого форума его взял)

  Ответить  
 
 автор: Санька   (17.04.2009 в 13:51)   личное сообщение
 
 

Спасибо! Просмотрел, если не найду того, что мне нужно))) попробую приспособить...
Но это все равно сложно работает...

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

  Ответить  
 
 автор: Санька   (17.04.2009 в 13:11)   личное сообщение
 
 

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

Неужели никто не знает, как ее написать? Или просто нет времени заниматься такими "пустяками"?

Вот нашел в инете нечто похожее:

Private Sub cbo"Name"_NotInList(NewData As String, Response as Integer)
Dim strMsg As String
Dim rst As DAO.Recordset
Dim db As DAO.Database

strMsg = "'" & NewData & "' is not in the list. "
strMsg = strMsg & "Would you like to add it?"
If vbNo = MsgBox(strMsg, vbYesNo + vbQuestion,"New Company") Then
Response = acDataErrDisplay

Else

Set db = CurrentDb()
set rst = db.OpenRecordset(tbl"Name")
rst.AddNew
rst("Company") = NewData
rst.update
Response = acDataErrAdded
rst.Close

End If
End Sub

Я ее приспособил и она работает, только не обновляет форму после добавления значения в таблицу. Приходится закрывать и открывать заново.

И еще проблема в том, что она выполняет поиск только по одному значению (только по значению поля со списком) и добавляет значение только этого поля со списком.

Наверное здесь еще нужно использовать RecordsetClone (насколько я понимаю, эта штуковина позволяет создать "виртуальный" источник записей или что-то вроде того, который может провести поиск по всем полям записи и добавить в источник строк (в таблицу) значения всех трех полей). Но с этим я еще не разобрался...
Только, насколько я понимаю, эта процедура написана для добавления нового значения в одно поле. А та, о которой я говорю, искала запись по трем полям и добавляла во все три поля.

  Ответить  
 
 автор: Goblin   (17.04.2009 в 18:37)   личное сообщение
 
 

Если эта штука работает, то добавь в конце кода на кнопку "ОК" код обновления формы.
В VBA не силен, поэтому делаю обходным путем.
В режиме конструктора ставлю на форму кнопку, через мастера указываю что ей надо делать, (в данном случае обновить форму) потом выдергиваю сердцевину кода на обновление и копирую его в нужное место в нужном мне коде. Все.
Обновить форму: DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
Сохранить запись: DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
Пока не подводило. А тема реальная. Именно сейчас и для меня актуальна.

  Ответить  
 
 автор: Санька   (17.04.2009 в 23:39)   личное сообщение
 
 

Вот и я о том же)))

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

Я пробовал ее в действии (жаль, что потом утерял базу даных) - это действительно работало просто и красиво.... без лишних полей и кнопок. И главное, очень быстро!

  Ответить  
 
 автор: Denis V.   (17.04.2009 в 21:14)   личное сообщение
49 Кб.
 
 

Так вот о чём я (смотри вложение), когда говорил, что форма смешная ;-)
Первая картинка: форму только что открыли, форма открылась на первой записи, правда не видно, что за человек родился 1.01.2000 с номером паспорта 23457364 (такой молодой, а уже с паспортом :-))
Вторая картинка: набрали пару букв фамилиии, список предложил всё ФИО, нажали Enter, получили то, что искали. Вроде работает как надо...
Третья картинка: перешли на другую запись и что мы видим? То что у человека каким-то образом поменялась дата рождения и номер паспорта! Нонсенс!

  Ответить  
 
 автор: Санька   (17.04.2009 в 23:33)   личное сообщение
 
 

Денис, грех смеяться над "убогими"))) я же не волшебник, я только учусь)))

То, что поле со списком не отражает значение записи при открытии формы - это потому, что поле "свободное", хотя наврное можно каким-то образом зделать так, чтобы запись отражалась. Но это не суть важно))

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

А вот третья картинка работала бы идеально, если бы я знал, как написать процедуру добавения в список с учетом поиска уникальной записи по всем трем полям. После завершения этой процедуры, так сказать "на выходе", мы бы имели обновленную форму с установленным фокусом в поле со списком на добавленной записи. Кроме того, в полях дата рождения и номер паспорта уже были бы значения именно этого добавленного ФИО. И это было бы очень красиво и вносить новые записи было бы очень легко и просто.

Но, к сожалению, я не знаю, как написать такую процедуру... я по образованию инженер механик, а не программист))

  Ответить  
 
 автор: Lukas   (18.04.2009 в 00:22)   личное сообщение
32 Кб.
 
 

Так?

  Ответить  
 
 автор: Denis V.   (18.04.2009 в 00:29)   личное сообщение
 
 

Lukas, что за хитрый архив? Я обленился постоянно ставить себе новые утилиты на компьютер. Можно в старом-добром rar? Спасибо. А то очень уж хочется взглянуть.
P.S. Я тоже не программист, а инженер-электроник ;-)

  Ответить  
 
 автор: Lukas   (18.04.2009 в 00:32)   личное сообщение
56 Кб.
 
 

ZIP

  Ответить  
 
 автор: Denis V.   (18.04.2009 в 00:47)   личное сообщение
 
 

Lukas, у Вас получилось даже лучше чем у меня! По-моему, это то, что нужно автору сего топика ;-)
Хотя, сама форма не лишена тех особенностей, про которые я упоминал, как "смешные" :-) Но, ведь она содержит ту заветную процедуру!
Поэтому я бы объединил два варианта формы с кодом от Lukas и дизайном от Goblin.

  Ответить  
 
 автор: Lukas   (18.04.2009 в 13:37)   личное сообщение
57 Кб.
 
 

Вариант с другим набором "смешилок":

  Ответить  
 
 автор: Denis V.   (18.04.2009 в 15:17)   личное сообщение
 
 

Нет, Lukas, этот вариант без "смешилок". Всё очень по-серьёзному :-)

  Ответить  
 
 автор: Goblin   (18.04.2009 в 09:59)   личное сообщение
 
 

Класс! Огромное спасибо. Это то, чего так не хватало и не хватает. Однако есть маленькие НО. Первое - надо бы что бы данные паспорта и даты рождения менялись сразу как вводятся первые буквы фамили типа как фильтрация http://hiprog.com/index.php?option=com_content&task=view&id=251661615&Itemid=35автор sample. Я у ж чего только не делал, что бы запись добавлялась если ее нет. Ну с этим можно как то смириться.
А второе - у меня уже почти готовая база есть, которая одобрена руководством. И тут Ваш код. Придется переделывать. Уж шибко понравилось. Надеюсь будут еще доработки в этой области.

  Ответить  
 
 автор: Санька   (18.04.2009 в 14:12)   личное сообщение
 
 

Спасибо огромное, Lukas!!! Это почти то, что мне нужно! На данном этаме, думаю, условия поиска записи только по полю со списком будет достаточно (в дальнейшем буду искать варианты усовершенствования - сейчас во времени ограничен).

Правда ведь, красиво и удобно работает?! И вот Goblin тоже оценил))) Насколько я понимаю, ему тоже очень понравилось!

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

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

Используя RecordsetClone можно ведь создать "виртуальный" источник строк, добавить в него значения всех трех полей и произвести поиск уникальной записи с учетом вновь введенных значений по всем трем полям? Или это не реально?

  Ответить  
 
 автор: Санька   (18.04.2009 в 15:15)   личное сообщение
53 Кб.
 
 

Вот "кусочек" базы с кодом от Lukasa. Может кому пригодится)))

Теперь будем стремиться к реализации поиска уникальной записи по ФИО, дате рождения и номеру паспорта так, чтобы работало аналогично...)))

Большое вам спасибо за помощь и участие, ребят!!!
Очень выручили!!!

  Ответить  
 
 автор: Goblin   (18.04.2009 в 17:32)   личное сообщение
56 Кб.
 
 

Присоединяюсь к заказу Санька по поводу полей в форме. Но это уж круто получится.
А кусочек Саньковой базы с календариком смотрится лучше. (форма "Мероприятия") Календарь стырен тут же на сайте.

  Ответить  
 
 автор: Санька   (19.04.2009 в 08:10)   личное сообщение
 
 

Спасибо, дорогой!!!))) Я тоже содрал календарик, только приспособить не успел))) теперь приспособлю)) Это действительно намного удобнее!))

Да, если бы парни смогли написать такую процедуру в одном поле со списком для поиска уникальной записи по трем полям - это было бы не просто круто, а СУПЕР КРУТО!!!

  Ответить  
 
 автор: Санька   (19.04.2009 в 13:21)   личное сообщение
 
 

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

  Ответить  
 
 автор: Goblin   (19.04.2009 в 14:16)   личное сообщение
 
 

Чувак, это даже я расшифровал со своими скудными знаниями VBA. Правда у меня получилось что не к кнопке цепляется, а к тому полю, в которое он вводит дату. Открой на кнопку свойство-события-нажатие кнопки. Там будет 3 строки кода.
DoCmd.OpenForm "frmCalendar", , , , , acHidden
Forms("frmCalendar").ExportControl(2) = Me.txtTest
Forms("frmCalendar").Visible = True
Увидишь цифирьку (2), которую я поставил вместо того, что было написано автором. (Там было поле с переключателем прописано.) Так вот. В начале процедуры на календарь прописано: 1 - в левый верхний. 2 - левый нижний. 3 - правый верхний, 4 - левый верхний. Ну может немного что-то напутал, но смысел в том.
Короче, в свойстве кнопки меняй цифирь в этом диапазоне.

  Ответить  
 
 автор: Санька   (20.04.2009 в 08:37)   личное сообщение
 
 

Значит мои знания VBA еще скуднее)))

Спасибо, дорогой!!! Разобрался...))))

  Ответить  
 
 автор: Goblin   (20.04.2009 в 13:59)   личное сообщение
37 Кб.
 
 

Мне тут удалось расшифровать кое что, что бы понять как это работает. Lucas взял поле со списком для поиска в поле ФИОУчастника. Ограничил его в свойстве (Ограничиться списком). Таким образом получился код в свойстве (после обновления) Это ясно. Далее добавил код в свойство (отсутствие в списке). Там тоже боле мене ясно. Если поставить на форму поле сортировки при вводе как у sample, и дублировать запись вводимую в поле ввода, то будем одновременно совмещать сортировку во всей форме и выбор в списке.
К сожалению тут проблема. В поле со списком в принципе прикреплен КодУчастника. А в поле как у sample не работает пробел. Хоть убей не пойму почему. Может кто подскажет?
Короче проблема решается косвенно. В поле со списком врезал запрос, что бы собирались данные по 3 полям и показывались в поле ввода. Далее все работает. Подредактировал код ввода данных в строку, а то с паспортами и датами не очень красиво получается. Лучше пусть пустые ячейки будут.
strSQL = "INSERT INTO ОсновныеДанные ( ФИОУчастника, ДатаРождения, НомерПаспорта ) VALUES ('" & NewData & "', '""', '""');"
Или еще проще:
strSQL = "INSERT INTO ОсновныеДанные ( ФИОУчастника) VALUES ('" & NewData & "');"
Неплохо бы после ввода данных, фокус поставить в поле ввода номера паспорта.
Глянь что получилось, раз уж сразу все поля не отсеивает, то хоть так.

  Ответить  
 
 автор: Санька   (20.04.2009 в 21:07)   личное сообщение
 
 

Поле со списком у меня было ограничено изначально - это необходимо, чтобы сработало "отсутствие в списке", и код процедуры "после обновления" для этого поля у меня тоже был прописан . Но Lukas туда дописал строку для обновления (правда я пока не разобрался, для какой цели..). И поцедуру "отсутствие в списке" он написал.

В принципе тебе удалось сосредоточить в одном поле уникальность записи по трем полям)) правда смотрится не очень красиво, когда в поле ФИО появляются дата рождения и паспорт)) Но над этим можно поразмышлять...

Я представляю, как оно должно сработать, но не знаю, как это реализовать программно.

Если это в принципе возможно, то код процедуры должен "выйти за рамки" поля со списком. После обновления поля со списком "ФИОУчастника" должен быть отложен перехват ошибки до того момента, пока не будут введены значения в поле "дата рождения" и "номер паспорта", и только после обновления поля "номер паспорта" она должна сработать и выполнить поиск уникальной записи по всем трем полям. (Set rs = Me.Recordset.Clone
rs.FindFirst "[КодУчастника] = .................) И уж тогда, если такая запись отсутствует, сообщить об этом и предложить сделать добавление новой записи.

И все это должно происходить в "клоне" источника строк.

А в завершении процедуры добавление производится в таблицу - источник строк. При этом добавление сделать очень легко, поскольку записи на тот момент уже будут внесены во все три поля формы. Затем делается обновление формы и фокус необходимо оставить в поле "номер паспорта". Вот это было бы то, что надо!

И если мне не изменяет память, именно такую процедуру "отсутствие в списке" с поиском по трем полям мне и написали 7 лет назад. Только вместо поля "ФИОУчастника" было поле "ФИОПеревозчика" и также поля "дата рождения" и "номер паспорта". Я делал базу данных для регистрации нарушений международных автомобильных перевозок по территории Казахстана и она ставилась на постах транспортного контроля.

  Ответить  
 
 автор: Goblin   (20.04.2009 в 21:38)   личное сообщение
 
 

Самое смешное, что я в данный момент работаю над базой по учету пациентов. Поля Фамилия, Инициалы, ДатаРождения. Тема та же самая. Именно все это и мне на данное время надо. Есть идея простой подмены полей. Сначала вводим в поле поиска одно, другое, третье. И уж если нет, то добавляем в поля соответственно, скрываем поле поиска и показываем поле таблицы. Ну типа того. Поле поиска - поля фильтрации. Но вот беда - фильтр по одному полю работает нормально. А как только по второму - первый сбивается. Как будто его и не было. Palarm посоветовал пробежаться по всем полям фильтра, собрать общий. А как это сделать примера не оставил. Будут соображения в этом вопросе, прошу выложи мне в моем: "Все. Сдался. SOS."

И зайди по ссылке http://hiprog.com/index.php?option=com_content&task=view&id=693

  Ответить  
 
 автор: Санька   (21.04.2009 в 08:35)   личное сообщение
 
 

Конечно, если смогу найти решение задачи - обязательно выложу и здесь и в твоем топе...

Только сейчас уже нет времени искать... Через несколько дней уеду в командировку на две недели. А как вернусь продолжу работу над этой темой)

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

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

  Ответить  
 
 автор: Goblin   (25.04.2009 в 12:56)   личное сообщение
40 Кб.
 
 

У меня кое что получилось!
Даю пример на ленточной форме, что бы было наглядней. Для решения задачи не надо никаких поисковых полей, полей с ограничением по списку, модулей и функций. Принцип слизал у sample. (Поиск по полю со списком) Фишка в следующем.
Форма делается не на саму таблицу, а на таблицу через запрос, встроенный в форму. SQL, Это делается через конструктор. В запрос входят все интересующие поля и условие. В условие входят свободные поля, ПолеСоСписком10 - Поле1, ПолеСоСписком12 - Поле2 и ПолеСоСписком16 - Поле3.
Далее каждое полесосписком взаимосвязано. В каждом инфа зависит от того, что в предыдущем поле. Поэтому после каждого изменения инфы в поле, ставим код обновления следующих полей. Форму обновлять обязательно, иначе не получим результат.
Lucas поставил код Me.Requery в код после обновления не зря.
Принцип работы следующий. Вводить данные инициалы, дату рождения, и прочее лучше через маску ввода. Но маска в поле со списком почему-то работает не корректно. Последнюю точку выделяет и требует вводить с клавы. (инициалы) Посиму инициалы вводить без пробела, а в таблице маска сделает свое дело.
После каждого ввода форму приходится перезапускать, что бы сбросить все, что нашли. Но если фамилии нет, то лучше всю остальную инфу вводить в поле таблицы, поэтому курсор перебрасывается. Короче посмотри что получилось.
Поля можно скрыть и показывать только после всплывающего запроса, если нажали "Да"
Кароче, поэксперементируй с вводом фамилии, когда такой нет, потом с инициалами, потом с датой. Вроде все работет и добавляет. Только требует доработки. Но принцип уже вскрыт. И без функций и модулей.

  Ответить  
 
 автор: Санька   (25.04.2009 в 19:45)   личное сообщение
 
 

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

Как раз в этой поездке обкатаю базу как есть - процедуру пристроил по одному полю (полю со списком), пока попробую обойтись этим. А там будем пробовать совершенствовать))

А ты молодец! На полпути не останавливаешься) Это отличное качество характера!

Успехов тебе!

  Ответить  
 
 автор: Goblin   (01.05.2009 в 23:01)   личное сообщение
40 Кб.
 
 

Привет. Даю все свои наработки в этой области. Это применю у себя. В базе 3 формы. Одна поиск с отображением по умолчанию. Вторая - поиск с добавлением инфы по 3 полям. Третья - просто так. Заполнение дат. (может пригодится).
Форму с добавлением инфы приходится перезапускать для обнуления запроса (выключить и включить) так как она сама запрос. Отображать по умолчанию что-то в полях нельзя. (не работает как надо) поэтому делаю ленточной. (Найдя кого надо. можно 2щелчком открыть основную форму или сделать что бы открывалась основная, а эта закрывалась) - дело техники.
Может получится сделать так, что бы не перезапускать форму, тогда будет лучше. Как сбрасывать данные запроса не знаю.

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