|
|
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
В таблицу Main добавляю данные в поля (не новые записи!) из табл.Other. В упрощённом виде(синтаксис не проверять): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Есть такие наборы записей, что на строке ссылки на них программа заметно притормаживает, а если ещё и в цикле...... -------------- На возможный вопрос "а зачем вообще?". При открытии базы создаётся некая таблица, с которой потом и работают. В принципе, всё проделывается одним запросом, но: - запрос с большим числом таблиц - огромное число записей - медленные машины - база сетевая В итоге несколько минут задержки, когда на экране висит заставка "Ждите...". Пользователь царапает ногтями экран, рвёт на себе одежду и т.д. Бывает ситуация, когда после "ожидания" выясняется, что комп висит. Вот я и разбил процедуру создания таблицы на этапы, первыми заносятся "базовые" данные - ключи и т.п., а потом - остальные. Всё в коде, сплошное Insert и Update. Это позволило вывести на экранн ProgressBar (не ActiveX, а самодельный) и сообщения об текущем этапе. Теперь, может в сумме и помедленней, но не так тоскливо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 11:55 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
по нормальному надо использовать запросы на обновления, а не циклы гонять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 11:59 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
По нормальному надо иметь машины >> чем 500MHz.... и много чего ещё. В случае же использования запросов проблематична индикация процесса. А псевдо-ПрогрессБар, когда индицируется не реальный процесс, а нечто с потолка, не дают пользователю "эффекта присутствия". Или, проще: на экране что-то крутится, а хрен знает может комп и висит! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 12:57 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
"еффект присутствия" у меня никогда не бывает. хоть дай прогресс=бар хоть песочные часы в обоих вариантах комп с тобой не разговаривает а занимается сам собой. и ты никогда не узнаешь то ли он висит, то ли он считает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 13:03 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
и ты никогда не узнаешь то ли он висит, то ли он считает Как это? А если ПрогрессБар "самописочный" и обновляется из того же кода, его остановка и есть признак зависания программы(при условии, конечно, что программа изначально разбита на "не долгие" отрезки, иначе замирание ПрогрессБара можно расценить как "машина думает"). ----------------------------------- Что-то мы всё о своём, да о своём... Сам вопрос так и "неотвеченный". Так можно ли обойтись без присвоения Set rst=... в цикле или никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:04 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
можно открывать в рекордсет все записи и делать поиск или фильтрацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:07 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
Ну дык обойдись. Кто ж тебе мешает. Открой один раз рекордсет и бегай по нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:07 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
но лучше поставить хотябы MSDE2000 , запихнуть обработчик в хранимую процедуру или в триггер формирующий результат на стадии ввода и навсегда забыть про ЖДИТЕ , прогресбар, песочные часы, анимации и зависания )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:11 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
поставить хотябы MSDE2000 , запихнуть обработчик в хранимую процедуру или в триггер формирующий результат на стадии ввода Тёмный лес....... можно открывать в рекордсет все записи и делать поиск или фильтрацию А код? Хотя бы условный. Как у меня это происходит, я в первом сообщении описал. Не соображу как должен Ваш совет выглядеть в программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:20 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
можно открывать в рекордсет все записи и делать поиск или фильтрацию А код? Хотя бы условный. Как у меня это происходит, я в первом сообщении описал. Не соображу как должен Ваш совет выглядеть в программе. Dim rs As DAO.Recordset фильтр rs.Filter "F1" поиск rs.FindFirst ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:26 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
Прочитал про св-во Filter, насколько понял фильтр ограничивает данные в новом Recordset, который открыт на базе исходного Recordset-a. Опять получается Set... в цикле. И ещё и исходный надо "засетить", пусть и один раз. -------------------------- Из того же Хелпа вычитал, что " при использовании больших динамических объектов Recordset, пользователь может обнаружить, что выполнение методов Find , а также использование свойств Sort или Filter является достаточно медленным. Для повышения быстродействия пользуйтесь запросами SQL со специализированными предложениями ORDER BY или WHERE" ---------------------------- Вобщем, хоть мне прямо об этом и не сказали(огорчать не хотели?), но выходит, что от Set в цикле мне никуда не деться. :((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 15:55 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
А почему ЛП не слушаем? Set rst = ... ("SELECT Main.Поле, Other.Поле1 FROM Main INNER JOIN Other ON Main.ID = Other.ID") и дальше бегай себе сколько хошь. Вот только rst.MoveFirst - зачем??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 16:05 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
2 АндрейК Фильтр фильтрует - мы увидим ограниченное число записей, потом сбрасываем фильтр и видим всё - зачем SET в цикле? Set rstNew = ...("Select Other.Поле1 From Other") А в цикле уже фильтруем rstNew, после каждого шага по внешнему набору просто удаляем фильтр из внутреннего и фильтруем с новым значением. Ну уж где только не сказано - для изменения большого количества записей надо использовать запросы типа UPDATE, Insert - т.е. запросы действия, а не рекордсеты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2003, 16:12 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
К Hummer: 1.Так в Хелпе пример приведён, там 2 присвоения. 1 - сам набор, потом создаётся его Filter, а 2 это Set rstNew = rst. Filter. Что-то вроде этого. В моём случае поскольку фильтр будет каждый раз меняться, то и присвоение Set rstNew = rst. Filter опять выходит в цикле? 2. Согласен, может надо не бегать по recordset-y. Может сохранёнными запросами и правильнее. Я уже писал, что в моём случае всё делается одним запросом на добавление, но... (см. сообщение №1) -------------------------- к AlexJuice: rst.MoveFirst - я написал, rst.MoveLast забыл. А всё это, чтобы получить корректное значение RecordCount (для организации цикла) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 14:31 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
2 АндрейК А почему AlexJuice не слушаем? Хочешь бегать - бегай. Не хочешь миллион раз рекордсет открывать - не открывай. Открой один раз, по нему беги и его же апдейть. Всего то делов - засунуть в один рекордсет и то, чем обновлять, и то, что обновлять. Если рекордсет обновляемым получится - считай победил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 14:47 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
Цикл можно организовать и так: Код: plaintext 1. 2. Работа с фильтрами: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 14:53 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
АндрейКrst.MoveFirst - я написал На самом деле при открытии рекордсета указатель автоматически устанавливается на первую запись (если они есть, конечно ;0) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 15:45 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
Прочёл всю ветку - кажется мы в итоге о разном стали говорить. 1. На данный момент есть запрос на добавление начального набора записей в таблицу. Всего 15 таблиц. Набор возвращает 17 полей, 2 из них - расчётные. Всё нормально работает, с точки зрения результата, которого приходится ждать до нескольких минут. Результата можно и не дождаться. Ситуация зависания программы определяется эмпирически - после n минут ожидания выдвигается предположение: "что-то очень долго сегодня".... 2. Хотел сделать индикатор, который скрашивал бы пользователю ожидание. Полазил по форумам, выяснил, что либо применяют псевдо-индикатор, который показывает невесть что, либо привычную "линейку". Стандартный ActiveX решил не применять(надо, чтоб на каждой машине он был установлен и т.п.). Сотворил самоклёп - 50 прямоугольников (1прям. = 2% процесса). 3. Тут же возникла проблема - к чему привязать обновление индикатора? 4. Начал с того, что исходный 15-и табличный запрос записал в виде запроса на выборку SQL - строкой (жуткий монстр!). А потом построчно, инструкцией Update записывал его записи в таблицу. Индикация была, но перед ней - большая пауза. Выяснилось, что задержка на строке Set rst = <вот этот монстр с 15-ю таблицами>. А собственно запись идёт "бодро". 5. Разделил "монстра" на смысловые части. Получилось 3 куска. Задержка при Set значительно меньше, тем более, что в это время надпись на индикаторе гласит: "готовлю данные" (на своём компе прочесть не успеваю - 2,4 Ггц). Потом начинается "дёргаться" индикатор. Короче, пользователь не чувствует себя брошенным, наоборот - процесс виден. -------------------------------------------------------- Теперь о сути темы: При добавлении данных на этапах 2 и 3, когда отбор идёт по ключам уже находящимся в табл.Main, выражения типа: Код: plaintext 1. у меня не проходили: 1. Я так и не сообразил как объяснить программе куда она должна добавить записи? В сообщении №1 видно, что в каждый данный момент фокус в Main стоит на конкр.записи. Из этой же записи берётся ID, по нему отбирается запись из Other и данные пишутся в конкр.Поле записи табл.Main. Остаётся только обработать ошибку №3021(в Other вообще нет записи соответствующей ID табл.Main). 2. При попытке включить в выражение Set... таблицу Main, опять возникает значительная задержка на строке Set rst.... Замкнутый круг! ------------------------------------------- Из опыта: если при выполнении чего-то очень долгого, на экране присутствует нечто, реально отражающее процесс - пользователь спокойнее это переносит. Вроде загрузка "Одинэсины" по такому принципу устроена. Не видел ни одного бухгалтера, который вчитывался бы в сообщения программы, мелькают надписи серьёзного содержания - процесс идёт. А если убрать эти сообщения(условное предложение)? Сразу не поймёшь - грузит или висит? ----------------------------------------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 16:07 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
авторВ таблицу Main добавляю данные в поля ( не новые записи! ) из табл.Other ............. прошло 15 постов, и авторЯ так и не сообразил как объяснить программе куда она должна добавить записи? Я х..ею дорогая редакция... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 16:14 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
тебе же сказали что вместо set rst в цикле делай фильтр, будет лучше rst.Filter = "ID = " & ГЛАВНЫЙРЕКОРДСЕТ!Id а прогрессбар можно и в строке состояния показывать максимальное значение прогрессбара - число записей главного рекордсета текущее - absolutepositon ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 16:23 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
2 АлексейК Ему уже много чего сказали. Но он до сих пор уверен, что "выходит, что от Set в цикле мне никуда не деться. " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 16:29 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
бывают такие люди или состояния души когда человек спрашивает - ему отвечают но он настолько занят созерцанием своей проблемы что даже не слышит что ему отвечают Диалог немого с глухим один : мне так плохо, неуютно , ничего не получается второй: дык пойди прими душ, сделай зарядку - глядишь полегчает первый: мне так плохо, настроения нет, никто меня не любит, прогресбары из прямоугольников рисую - мерзкое зрелище )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 16:41 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
:) Просто пипец:) 2 АлексейК Именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 17:40 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
ЛП: Всего то делов - засунуть в один рекордсет и то, чем обновлять, и то, что обновлять. Если рекордсет обновляемым получится - считай победил. Не получается обновляемым - считаю проиграл -> способ не подходит. По поводу фильтра: Фильтр имеет смысл, когда в recordsete есть что отбирать. Я ж уже 2 раза описал ход работы. В табл. Main ecть поля Дата_Max и Проц_Оплаты. Данных в них нет. Данные расчитываются в запросе из 3 таблиц и включаются в табл.Main программой. Включить в этот запрос саму табл.Main - опять столкнуться с задержкой. Поэтому и приходится изгаляться. Ну попробовал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Пример из Хелпа к св-ву Фильтр: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Здесь создаются два рекордсета - как раз второй и получается в цикле, если названия стран брать из какого-то набора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2003, 17:05 |
|
||
|
Set rst = ... в цикле. А по-другому можно?
|
|||
|---|---|---|---|
|
#18+
Не получается обновляемым Запихни одним инсертом во временную таблицу данные, которыми надо обновлять. Потом сджойни то, что надо обновлять со временной таблицей. Джойн получится обновляемым (первичный ключ не забудь во временной). На джойне открой один рекордсет, и беги по нему - Edit - Update - MoveNext - прогрессбар отрисовал. Правда сначала будет длинный затык (вставка данных во временную таблицу), но возможно не такой уж и длинный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2003, 17:17 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32361068&tid=1677445]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 453ms |

| 0 / 0 |
