Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 6

Поиск значения в ленточной форме средствами VBA

04.09.2016, 10:02. Показов 5952. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ленточная форма со списком товаров и их количеством. В одно поле формы считывается штрих код, далее необходимо, что бы происходил поиск товара и списывание его количества. Это я реализовал. Поиск через FindRecord, списыание количества через inputbox. Но в том случае, если товара нет, access ничего не сообщает, и находит мне первый по списку товар. Источник записей формы - запрос.
Вопрос - как сделать, что бы access сообщал, что не нашел вобще введенного товара?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.09.2016, 10:02
Ответы с готовыми решениями:

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

Сложный поиск в форме Access Средствами VBA
Здравствуйте, подскажите если есть возможность. Ситуация такая, есть форма, на ней отображаются данные одной записи, переход между записями...

Быстрый поиск в ленточной форме
Прошу помочь по такому вопросу: Как сделать быстрый поиск для выбора контрагента. Поле со списком не подходит так как в названиях...

13
Эксперт MS Access
 Аватар для ltv_1953
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
04.09.2016, 10:12
С сайта MSDN:
"Метод FindRecord не возвращает значение , указывающее , его успех или неудачу. Для того, чтобы определить , существует ли значение в наборе записей, используйте метод FindFirst, FindNext, FindPrevious или FindLast объекта Recordset. Эти методы устанавливают значение свойства NoMatch Истина , если spcified значение не найдено."
1
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.09.2016, 10:15
Лучший ответ Сообщение было отмечено ltv_1953 как решение

Решение

С помощью FindRecord долго. Быстрее сделать поиск по рекордсету формы. И использовать свойство NoMatch для определения найдено/не найдено. Примерно так (с точностью до имен)
Visual Basic
1
2
3
4
5
6
7
8
With Me.Recordset
  .FindFirst "[ИмяПоля]=" & Me.[ПолеТовара]  'Если поле текстовое, то в апострофах ='" & Me.[ПолеТовара] & "'"
  If .NoMatch Then
    msgbox "Не найдено"
  Else
    'Здесь действия когда товар найден
  End If
End With
Добавлено через 15 секунд
Аппаздал
4
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 6
04.09.2016, 16:32  [ТС]
Спасибо за совет, но многократные попытки не увенчались успехом
Поле в которое вводится штрих код - BBF (оно существует только в форме, с таблицей не связано)
Поле в котором искать Barcode
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub BBF_AfterUpdate()
With Me.Recordset
    .FindFirst "[BBF]='" & Me.[Barcode] & "'"
If .NoMatch Then
MsgBox "Not found"
Else
MsgBox "Found"
End If
End With
End Sub
Дает ошибку 3070 "BBF" не распознается ядром СУБД...
Возможно, что этого поля как бы не существует? Можно ли в FindFirst загрузить значение переменной поля BBF?
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.09.2016, 16:45
Цитата Сообщение от Dombrock Посмотреть сообщение
Поле в которое вводится штрих код - BBF (оно существует только в форме, с таблицей не связано)
Поле в котором искать Barcode
Левое поле где ищем, а справа от равенства что ищем
Visual Basic
1
.FindFirst "[Barcode]='" & Me.[BBF] & "'"
1
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 6
04.09.2016, 17:43  [ТС]
Да, все работает. Глупая ошибка. Спасибо.
0
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
17.11.2016, 16:39
Цитата Сообщение от mobile Посмотреть сообщение
Левое поле где ищем
А если левое поле находится на ленточной подформе, то как изменить имя поля подформы?
Так не выходит:
Visual Basic
1
.FindFirst "Me![Внедренный12]![КодПоступления]=" & Me.[КодПоступления]
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.11.2016, 16:52
В FindFirst параметр это выражение или переменная используемая для поиска записи. Этот аргумент аналогичен предложению WHERE в инструкции SQL (без зарезервированного слова WHERE). И его левая часть (до символов =, >,< и аналогичных) это поле рекордсета. В Вашем примере в левой части используете поле формы, что конечно неверно. Я не знаю как должно быть, но примерно так
Visual Basic
1
.FindFirst "[КодПоступления]=" & Me.[КодПоступления]
1
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
17.11.2016, 17:41
Visual Basic
1
.FindFirst "[КодПоступления]=" & Me.[КодПоступления]
Так пробовал, но записывает в каждую запись, что не верно.

У меня форма, с ленточной подформой. На форме есть кнопка, по нажатии на которую, должна считаться стоимость во всех записях ленточной формы, связанных с записью главной формы, через поле КодПоступления.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Кнопка170_Click()
Dim s
s = "[КодПоступления]=" & Me.[КодПоступления]
     With Me.Recordset
        .MoveFirst                      'перейти к первой записи
        .FindFirst s                   'Найти первую
        Do While True                   'Цикл пока не закончатся записи, соответствующие фильтру
            If Not .NoMatch Then        'Если запись найдена
                Me![Внедренный12]![ЦенаПродажи] = Me![Внедренный12]![ЦенаЗакупа] * Me![Внедренный12]![Кол-во]
                .FindNext s             'Искать следующую запись соответствующую фильтру
                .MoveNext
            Else
                Exit Do                 'Больше нет записей с заданным фильтром, выходим из цикла
            End If
        Loop
    End With
End Sub
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.11.2016, 18:02
Цитата Сообщение от sana555 Посмотреть сообщение
У меня форма, с ленточной подформой. На форме есть кнопка, по нажатии на которую, должна считаться стоимость во всех записях ленточной формы, связанных с записью главной формы, через поле КодПоступления.
Но тогда, как мне кажется и искать надо в рекордсете подформы? А не главной формы
Попробуйте вместо With Me.Recordset использовать
Visual Basic
1
With Me.[Внедренный12].Form.Recordset
1
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
18.11.2016, 00:56
Спасибо, так работает..) У меня еще вопрос по поводу .MoveNext, в данном случае он не нужен?, просто с ним пишет что текущая запись не найдена..., а в другом примере данная строчка не вызывает ошибки...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub Посчитать_Click()
Dim s, x
s = "[КодПоступления]=" & Me.[КодПоступления]
     With Me.[Внедренный12].Form.Recordset
        .MoveFirst                      'перейти к первой записи
        .FindFirst s                   'Найти первую
        Do While True                   'Цикл пока не закончатся записи, соответствующие фильтру
            If Not .NoMatch Then        'Если запись найдена
                .Edit
                'Высчитываем цену продажи, исходя из наценки
                x = Me.[Внедренный12].Form.[ЦенаЗакупа] + Me.[Внедренный12].Form.[ЦенаЗакупа] * Me.[Наценка] / 100
                'Присваиваем 1, если в поле 0, иначе ошибка: деление на 0
                If IsNull([Округлить]) Or [Округлить] = 0 Then
                    [Округлить] = 1
                End If
                'Округляем
                x = [Округлить] * Round(x / [Округлить], 0)
                .Fields("ЦенаПродажи") = x
                .Update
                .FindNext s             'Искать следующую запись соответствующую фильтру
'                .MoveNext
            Else
                Exit Do                 'Больше нет записей с заданным фильтром, выходим из цикла
            End If
        Loop
    End With
End Sub
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.11.2016, 01:10
FindNext перемещает курсор на найденную запись. Если найденная последняя в наборе, то перемещение на следующую запись (Movenext) вызовет EOF и сообщение об ошибке. Видимо в других примерах чисто случайно найденная запись была не последней. Иначе и там были бы ошибки. При поиске FindNext команда Movenext не нужна.
1
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
18.11.2016, 01:20
Теперь понятно, уберу в других примерах..) Вы можете объяснить или дать ссылку, где просто и понятно рассказано, что такое рекордсет? А то много где использую, а понятия особого не имею...
Цитата Сообщение от mobile Посмотреть сообщение
И его левая часть (до символов =, >,< и аналогичных) это поле рекордсета
То есть получается поле возникает на определенное время (как бы виртуально что ли..), и это поле не таблицы?
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.11.2016, 01:43
Рекордсет это набор данных в оперативной памяти из данных таблицы/запроса-источника. DAO-рекордсет существует только на данных таблиц, запросы тоже ведь на таблицах. ADODB-рекордсет может быть и не табличный, свободный.
Набор полей рекордсета может отличаться от полей таблицы если источником ему запрос, где могут быть вычисляемые выражения и константы.
У рекордсетов есть свои свойства, методы и функции. Большинства которых, разумеется нет у таблицы/запроса.

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

Литературы отдельно по рекордсетам не встречал. Но очень подробно они описаны у Гетца - Access 2002 Разработка настольных приложений, это часть 1. Часть 2 - Разработка корпоративных приложений. Авторы Пол Литвин, Кен Гетц, Майк Гунделой. Очень рекомендую эти книги для изучения Access. Хотя написаны для версии 2002, фактически они ничуть не устарели.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2016, 01:43
Помогаю со студенческими работами здесь

Поиск в ленточной форме по полю Дата
Добрый день! Есть ленточная форма Договора. В ней с помощью фильтра проводим поиск по определенным полям. Поиск по тестовому полю: ...

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

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

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

Добавление и удаление полей в форме средствами VBA
Есть запрос Есть форма, созданная на основании этого запроса Форма открывается в табличном виде Нужно средставами VBA...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru