Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FindFirst или бесконечный цикл, правильный синтаксис 
V
    Опции темы
Laky
Дата 15.12.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



В общем-то задача до боли проста: находить запись в таблице, удовлетворяющая условию, а в другую заносить значение какого-либо поля этой записи.
Используем FindFirst с условием для нахождения
начинаем цикл Do с условием прекращения: конец файла
делаем все, что нам хочется
используя FindNext переходим на следующую запись

Код

Dim db As DAO.Database
Set db = CurrentDb()
Dim tb As DAO.Recordset
Set tb = db.OpenRecordset("M", dbOpenDynaset)

Dim a As Long

tb.FindFirst "[SS] = True"
Do Until tb.EOF
    
        a = tb![NN]
        
                    Dim tbl As DAO.Recordset
                    Set tbl = db.OpenRecordset("X", dbOpenDynaset)
                      tbl.AddNew
                      tbl!XX = a
                    tbl.Update
                    tbl.Close

tb.FindNext "[SS] = True"            
Loop

a=0
tb.Close
db.Close
   
End Sub


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

Просьба не предлагать запрос) задача нужна именно для понимания правильности составления подобного цикла. Заранее говорю большое спасибо

PM   Вверх
Akina
Дата 15.12.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



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

Do Until tb.NoMatch



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 16.12.2008, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



EOF при поиске будет работать только для библиотеки ADODB.
PM MAIL WWW ICQ Skype GTalk   Вверх
Laky
Дата 16.12.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата

Надо справку читать не по диагонали, а всю. Особенно примеры.


Очень много времени ушло в пустых поисках. Если есть хорошая ссылка на примеры (касательно любой области VBA), большая просьба поделиться, ибо много еще предстоит найти и сделать.

Цитата

EOF при поиске будет работать только для библиотеки ADODB. 


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

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

Код

Dim db As DAO.Database
Set db = CurrentDb()
Dim tb As DAO.Recordset
Dim tbX As DAO.Recordset

Dim varBookmark As Variant

Dim a As Long
a = 0
Dim b As Long
b = 0

Set tb = db.OpenRecordset("tb", dbOpenSnapshot)

tb.FindLast ("[c] = True")

Do Until tb.NoMatch
varBookmark = tb.Bookmark
    a = tb!a
        
    tb.MoveFirst
    Do Until tb.EOF
     
    If tb!b = a Then
           b = tb!a
           Set X = db.OpenRecordset("X", dbOpenDynaset)
           X.AddNew
           X!b = b
           X.Update
           X.Close
     End If
    
    tb.MoveNext
    Loop

tb.Bookmark = varBookmark

tb.FindPrevious ("[c] = True")

Loop

tb.Close
db.Close



Есть ли замечания? Все мысли и комментарии приветствуются, нужны и ценны



Это сообщение отредактировал(а) Laky - 16.12.2008, 21:03
PM   Вверх
bopoha
Дата 16.12.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(Laky @  16.12.2008,  20:56 Найти цитируемый пост)
Можно ли этот момент поподробнее, ибо как раз хотелось уточнить, что tb.NoMatch действительно очень логично, но почему же конец файла игнорировался... 


Потому что FindFirst ищет всегда сначала, если нужно с текущей, то это FindNext.


Цитата(Laky @  16.12.2008,  20:56 Найти цитируемый пост)
Есть ли замечания? Все мысли и комментарии приветствуются, нужны и ценны

Помойму эту задачу можно решить запросом, просто и красиво. И, наверное, быстрее.

Добавлено через 3 минуты и 5 секунд
Как-то так:
Код

INSERT INTO Table1 ( Field1 )
SELECT Table2.data
FROM Table2 INNER JOIN Table2 AS Table2_1 ON Table2.k1 = Table2_1.k2;

PM MAIL WWW ICQ Skype GTalk   Вверх
Laky
Дата 16.12.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата(bopoha @ 16.12.2008,  21:19)
Цитата(Laky @  16.12.2008,  20:56 Найти цитируемый пост)
Можно ли этот момент поподробнее, ибо как раз хотелось уточнить, что tb.NoMatch действительно очень логично, но почему же конец файла игнорировался... 


Потому что FindFirst ищет всегда сначала, если нужно с текущей, то это FindNext.



Не понятно, зачем вы это пишете)
Конечно, для последовательного нахождения начинаем с помощью FindFirst, в потом продолжаем с помощью FindNext.
И, по сути, к FindFirst не обращаемся до следующеговызова.


Что касается сделать это запросом.....ну мне, честно, проще кажется делать это аккуратным циклом с тройным вложением (каким он и будет чуть позже)
Ибо подготовительные запросы, потом итоговые....да и потом....я делаю поиск в 1 таблице 2 раза...а для этого надо, как вы абсолютно правильно подсказали, таблицу к самой себе inner join если так можно выразиться, простите)) слишком сложный запрос получится, согласитесь

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

Это сообщение отредактировал(а) Laky - 16.12.2008, 21:54
PM   Вверх
Akina
Дата 16.12.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Laky @  16.12.2008,  21:56 Найти цитируемый пост)
Если есть хорошая ссылка на примеры (касательно любой области VBA)

MSDN собсно... да и встроенной справки вполне достаточно - NoMatch, например, там описан, и пример есть.

Цитата(Laky @  16.12.2008,  21:56 Найти цитируемый пост)
почему же конец файла игнорировался

А потому что он НЕ ДОСТИГАЕТСЯ! Логика FindNext какая? Искать заданное, если найдено, изменить указатель... а если не найдено? он остается там, где и был! Вот в АДО логика иная - сместить указатель, проверить, если подошло, остановиться и сообщить. Вернее, дело не в АДО/ДАО, а в том, что АДО, если не указано иначе, использует Forward-like, а ДАО - Dynaset-like рекордсеты. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Laky
Дата 16.12.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Спасибо! теперь ясность во всем.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.