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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Щас я буду вас мучать... Исключение повторов в записях
 
 автор: Скорп   (28.03.2008 в 10:11)   личное сообщение
 
 

имеем:
1. форму, основанную на запросе
2. в заголовке формы поле поиска записей, находящихся в области данных (ленточная форма)

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

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

так вот вопрос: можно ли в форме сделать так, чтобы не выводились повторы?
в форме и, соответственно в запросе, есть поле "№_Заказа"
или в запросе, убрав группировку, сделать так, чтобы эти повторы не выводились...

  Ответить  
 
 автор: ГлазастыйМышь   (28.03.2008 в 10:20)   личное сообщение
 
 

а не проше на функцию поиска повесить обработчик ошибок с выводом нужной информации "Звиняйте, но ничего не найдено"

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

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

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 10:47)   личное сообщение
 
 

Например так:

Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = номер выдаваемой ошибки Then
MsgBox("Нельзя ")
Response = False
End If

End Sub

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

не работает
та же табличка выскакивает
может обработчик повесить не на форму, а на поле поиска?

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 11:15)   личное сообщение
 
 

Попробуйте еще If Err.Number вместо If DataErr

Ну и попробуйте на поле повесить. Да и вообще ACCESS это не минное поле, не бойтесь допустиь ошибку, пробуйте смело. Ощущение "ЭВРИКА" тоже не плохое.

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 11:22)   личное сообщение
 
 

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

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

FORMAT спасибо
но пока не работает

Private Sub Поле64_Change()
DoCmd.ApplyFilter , "Название_Фирмы like '" & Me.Поле64.Text & "*'"
Me.Поле64.SelStart = Len(Me.Поле64.Text)
If Err.Number = 2185 Then
MsgBox ("Нельзя ")
End If

End Sub

на счет "Эврики" полностью с вами согласен
99% своей разработки на этом ощущении и было сделано :-)

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 12:11)   личное сообщение
 
 

Private Sub Поле64_Change()

On Error GoTo Err_Поле64_Change

DoCmd.ApplyFilter , "Название_Фирмы like '" & Me.Поле64.Text & "*'"
Me.Поле64.SelStart = Len(Me.Поле64.Text)

Err_Поле64_Change:
if MsgBox Err.Description = 2185 Then
MsgBox ("Нельзя ")
End If
Resume Exit_Поле64_Change

End Sub

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 12:32)   личное сообщение
 
 

Зарапортовался. Событие обработки ошибки нужно вешать на форм_еррор. Просто с соблюдением синтаксиса по аналогии с полем.

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 12:16)   личное сообщение
 
 

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

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

>... ИМХО в вашем случае лучше сделайте так
>как было до момента, пока вожжа под хвост не попала...
я тоже склоняюсь к этому варианту уже
оставлю поиск как в "Борее" - кнопочки с буквами А, Б, В....
и с кодами

Private Sub Кнопка21_Click()
DoCmd.ApplyFilter "", "[Название_Фирмы] Like ""[А]*"""
End Sub
Private Sub Кнопка24_Click()
DoCmd.ApplyFilter "", "[Название_Фирмы] Like ""[Б]*"""
End Sub
Private Sub Кнопка25_Click()
DoCmd.ApplyFilter "", "[Название_Фирмы] Like ""[В]*"""
End Sub
и т.д.

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 12:48)   личное сообщение
 
 

Ну таким макаром вам нужно повесить на форму все кнопки с русским алфавитом. После чего их останется только раскрасить в белые и черные цвета поочередно и назвать форму РОЯЛЕМ

Попробуйте что-то вроде этого:

Dim rst1 As Object
Set rst1 = Me.Recordset
Dim strok1 As String
DIM strok2 as string
strok1 = Forms!Ваша_форма!.Поле_для_поиска.value

Do While Not rst1.EOF
strok2= Forms!Ваша_форма!Имя_поля_для_сравнения
If InStr(strok1, strok2) <> 0 Then выполняем к.л. действия
rst1.MoveNext
Loop

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 14:54)   личное сообщение
 
 

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

  Ответить  
 
 автор: ГлазастыйМышь   (28.03.2008 в 13:32)   личное сообщение
 
 

повесить на обработчик кнопки? что-то вроде того

Private Sub Кнопка21_Click() 
on error goto err_debug
   me.Filter = "[Название_Фирмы] Like ""[А]*""" 
   me.FilterOn = true
exit_here:
   exit sub
err_debug:
   msgbox ("Есть ошибка")
   resume exit_here
End Sub 

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

не..не кнопки
а обработчик поля "Поиск"
с кнопками как раз все нормально...как сказал Format - у меня рояль сейчас
вот я и хотел заменить этот рояль на поисковое поле...

  Ответить  
 
 автор: ГлазастыйМышь   (28.03.2008 в 14:47)   личное сообщение
 
 

и что мешает привесить подобный код на обработку изменения поля
пусть есть поле [Нужное поле], вводишь туда чего надо найти а рядом кнопку RunFilter и на кнопку след код.

Private Sub RunFilter_Click()  
on error goto err_debug 
   me.Filter = "[Название_Фирмы] Like ""*" & [Нужное поле] & "*""  
   me.FilterOn = true 
exit_here: 
   exit sub 
err_debug: 
   msgbox ("Есть ошибка") 
   resume exit_here 
End Sub  

Ну или повесить на обновление самого поля

Private Sub Нужное_поле_UfterUpdate() 

  Ответить  
 
 автор: FORMAT   (28.03.2008 в 14:55)   личное сообщение
 
 

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

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