Можо записи считывать порциями?

Badim
Дата: 01.09.2005 15:08:31
Я незнаю как правильно сформулировать вопрос, посему такой корявый заголовок.

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

Можно конечно сотворить некое шаманство, скажем запросы по 100 записей. Но может есть средство это все сделать интеллегентно, может какой специальный инструмент есть под это дело.

заранее спасибо
msn13
Дата: 01.09.2005 16:07:15
Badim

Таблицы физически расположены на сервере (связанные таблицы)
Сервер не дает обработать все записи в таблице сразу, не разрешает заблокировать для обработки более 200-300 записей.

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


а как ты делаешь?

и почему запросы ты называешь шаманством, неужели через рекордсеты все делаешь?
Badim2
Дата: 01.09.2005 17:27:23
Скажем есть временная таблица, (осколок от чего то) в ней записей скажем тыщ 5 или 10. Надо ее полностью зачистить. Для одного раза, что то писать, или создовать запрос...
Открываем таблицу руками, выделяем все записи, и клавишу "дел", тут же с сервера прилетает сообщение, записи заблокированы и не могут быть обработаны.
Тогда начинаются мучения: выделяю по 200-300 записей и по клавише "дел"

10000 записей разделить на 300 выделенных примерно получается 33 раза надо выделить и удалить

Тут надо было после очередного апгрейта таблицу привести к новому виду:
в таблице 14 с половиной тыщ записей и в поле "фирма" поставить "1" вместо NULL
На басике быстренько слепил ремонтную програмку, завел ее под кнопку.
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb

Set rs = db.OpenRecordset("SELECT * FROM табОплата WHERE (((табОплата.Firma)<1)) OR (((табОплата.Firma) Is Null))")
   
    If rs.RecordCount > 0 Then
   
    Do Until rs.EOF
      rs.Edit
      rs!Firma = 1
      rs.Update
      rs.MoveNext
     Loop

   end if

Loop

Сервер отказал в доступе в таком виде,
тогда началось шаманство:
Dim db As DAO.Database
Dim rs As DAO.Recordset
dim a as Byte

a=1
Set db = CurrentDb

do Until a=0

Set rs = db.OpenRecordset("SELECT * FROM табОплата WHERE (((табОплата.Firma)<1)) OR (((табОплата.Firma) Is Null))")
   
    If rs.RecordCount > 0 Then
   
      rs.Edit
      rs!Firma = 1
      rs.Update

     set rs=Nothing  
  
    else
         a=0
    end if

Loop
Беру по одной записи, вношу изменения, отключаюсь, потом снова...
через 10 мин. было обработано 500 записей!

Потом подкурутил, чтобы отключался через 100 записей, и за оставшиеся 15 мин он обработал все остальные 13500 записей.

Но это же не дело, так не должно быть!
вадя
Дата: 01.09.2005 18:39:50
а такое не пробовал?

db.execute ("update....

db.execute ("delete...
Страдалецъ
Дата: 02.09.2005 22:06:50
Блин мне способ стирания автора сразу напомнил историю, как одной даме потребовалось удалить 10 текстовых файлов. Она открывала последовательно каждый и с помощью клавиши бэкспейс посимвольно стирала его. Представляете работоспособность какая?