powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Окно загрузки файла
96 сообщений из 96, показаны все 4 страниц
Окно загрузки файла
    #36727565
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед запуском проги идет загрузка большого объема данных. Примерно 10 секунд.

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

Толи гуглить не могу, толи нет такой инфы. В нете нашел только как закрыть свое окно. А как его изменить в процессе не нашел. С решением, которое нашел можно сделать так, форма, на ней надпись загрузка. По завершению loading-а закрыть окно. Но это некошер. Кто подскажет кошер.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727583
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusПеред запуском проги идет загрузка большого объема данных. Примерно 10 секунд.
DoEvents
или описывай подробно, что такое загрузка данных.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727794
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

загрузка данных это последовательность SQL запросов в базу. Их 14 штук. Каждый отрабатывает разный период времени часть полсекунды, некоторые около 5 секунд

Код такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub  MYSUB
 
Вот тут хочу запустить вывод формы на экран

Процедура выполнения SQL запроса  1   '0,1 сек выполнения
Процедура выполнения SQL запроса  2   '5 сек выполнения
Процедура выполнения SQL запроса  3   '1 сек выполнения
Процедура выполнения SQL запроса  4   '0,5 сек выполнения
...
Процедура выполнения SQL запроса  14  '3 сек выполнения

Вот тут хочу закрыть форму


end sub

проблема в том как запаралеллить процес и рисования на форме всяких картинок и загрузку, если приложение в момент загрузки запроса виснет.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727815
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать асинхронное соединение.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727824
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusпроблема в том как запаралеллить процес и рисования на форме всяких картинок и загрузку, если приложение в момент загрузки запроса виснет.
а тебе пауз между запросами недостаточно?
Если нет - тогда асинхронное выполнение запроса
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727880
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, Antonariy

Сейчас попробую, но есть подозрение, что и вся проблема выполнения запроса это не само время sql, а именно задрежка в процессе в загрузке данных в массив.

У меня по итогам выполнения массив возвращает 300тыс записей,он и выполняется 5 секунд.

В общем сейчас попробую
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727893
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusа именно задрежка в процессе в загрузке данных в массив.
я ж с самого начала попросил пояснить, что такое "загрузка данных"...

а вообще, загрузка такого объема данных в массив наводит на мысль об ошибках проектирования системы
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727937
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

в общем асинхронное соединение не помогло.

Shocker.Proв массив наводит на мысль об ошибках проектирования системы

ну может подскажешь как верно спроектировать с такой задачей.

Пользователь вносит в систему информацию о товаре. Если товар в базе данных существует, то система должна быстро сказать об этом пользователю.

Справочник товаров 300 тыс записей. Пользователь вносит инфу в ТекстБокс.
На каждый change этого текстбокса нужно просмотреть 300 тыс записей и найти нет ли сходного товара.

Варианта реализации я вижу 2.
Первый - sql запрос к источнику данных в момент заполнения поля. Время работы запроса 3-7 секунд.
Второй - полная загрузка данных и поиск в массиве. Время работы 7-10 секунд. Время поиска записи в массиве менее 0,5 секунд.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727958
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusВарианта реализации я вижу 2.
Первый - sql запрос к источнику данных в момент заполнения поля. Время работы запроса 3-7 секунд.

Неверная индексация БД

ShamanusВторой - полная загрузка данных и поиск в массиве. Время работы 7-10 секунд. Время поиска записи в массиве менее 0,5 секунд.

И куча занятой памяти под массив.

Идиотское решение (пойдем в категоричности стопами Антонария)


Кроме того, проверку при таком объеме надо делать на на Change, а на окончание ввода: потерю фокуса, нажатие Enter, нажатие кнопки сохранить и т.п.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727959
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел вот такое решение
сейчас попробую, вроде то, что нужно....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36727972
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusнашел вот такое решение
сейчас попробую, вроде то, что нужно....
это и есть асинхронный запрос.

Но еще раз - не надо грузить в массив 300к записей! Для этого существует БД!!!!!
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36728215
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proэто и есть асинхронный запрос.
Я не по поводу запроса, тут есть ещё и фишка с количеством обработанных данных.

Shocker.ProИдиотское решение (пойдем в категоричности стопами Антонария)
ну весьма категорично я бы сказал :)

Shocker.ProНо еще раз - не надо грузить в массив 300к записей! Для этого существует БД!!!!
Все таки не всегда быстрее запрашивать. Индексы нельзя построить если обращение идет к объединению таблиц. (не партициям, а именно множеству таблиц)
что именно и есть в моем случае
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36728230
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus Все таки не всегда быстрее запрашивать. Индексы нельзя построить если обращение идет к объединению таблиц. (не партициям, а именно множеству таблиц)
что именно и есть в моем случае
Это что еще за глупость?
Допускаю, что ты просто недостаточно внятно выразил мысль....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36728235
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShamanus Все таки не всегда быстрее запрашивать. Индексы нельзя построить если обращение идет к объединению таблиц. (не партициям, а именно множеству таблиц)
что именно и есть в моем случае
Это что еще за глупость?
Допускаю, что ты просто недостаточно внятно выразил мысль....
Кроме того, всегда существует возможность физической реализации плоской таблицы с нужными данными и ее индексирование
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36728455
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Есть база Access. База подключена к внешним файлам, которые содержат фрагменты большой единой таблицы.

Например
Таблица.part1
Таблица.part2
Таблица.part3

База содержит union запрос из нескольких запросов к этим таблицам. Которые объединяют её в одну.

У меня обращение из программы идет к этому запросу, с целью получения общей картины.

Почему таблица фрагментирована?
- местоположение программы, структурное подразделение компании не имеющее доступа в центральную БД, им приходится скидывать БД. Т.к. таблица весит 15 метров, и 7 в архиве, из-за каждого update в одну строку, высылать всю таблицу с нуля некошер. Высылаем обновленный фрагмент.
- сама база Access тоже периодически обновляется, поэтому сливать фрагменты при каждом обновлении в кучу и строить индексы тоже неверно. Автоматизировать этот процесс нельзя.
+ есть лимит на размер почтового вложения 2 мб. - нужно чтобы фрагмент и база вкладывались в этот лимит.

Ну, а если я начну расписывать причины, почему так сделано, ты начнешь категорично утверждать, что компания у нас гиблая и подход неверный :)
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36728473
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus

А если сделать так:
Пользователь вводит как минимум две(три) буквы, после этого делаешь запрос с фильтром на введённые буквы, полученный
рекордсет показываешь в выпадающем листбоксе, и при допечатке символов фильтровать уже полуенный рекордсет?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36728550
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusБаза содержит union запрос из нескольких запросов к этим таблицам. Которые объединяют её в одну.
У меня обращение из программы идет к этому запросу, с целью получения общей картины.
Ну это не отменяет использования индексов.... хотя.... union в аксессе дурной и тормознутый, это я проходил. Может быть можно использовать обращения отдельно к индексам каждой таблицы?
Shamanus
Почему таблица фрагментирована?
- местоположение программы, структурное подразделение компании не имеющее доступа в центральную БД, им приходится скидывать БД. Т.к. таблица весит 15 метров, и 7 в архиве, из-за каждого update в одну строку, высылать всю таблицу с нуля некошер. Высылаем обновленный фрагмент.
Ну, конечно, по-хорошему, это делается на MSSQL с дистрибуцией транзакций, но причин, по которым вы не используете MSSQL может быть конечно же много.
Shamanus- сама база Access тоже периодически обновляется, поэтому сливать фрагменты при каждом обновлении в кучу и строить индексы тоже неверно. Автоматизировать этот процесс нельзя.
+ есть лимит на размер почтового вложения 2 мб. - нужно чтобы фрагмент и база вкладывались в этот лимит.
Я намекал на то, что можно теоретически, вместо памяти сливать эти данные в локальный mdb-файл. Тогда во-первых эту операцию можно будет проделывать не при каждом запуске программы, а только по необходимости, ну и, соответственно, нет проблем с индексированием.
Лично я довольно косо смотрю на процесс, который отжирает от 15-ти мегов оперативки....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729464
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus
А если сделать так:
Пользователь вводит как минимум две(три) буквы, после этого делаешь запрос с фильтром на введённые буквы, полученный
рекордсет показываешь в выпадающем листбоксе, и при допечатке символов фильтровать уже полуенный рекордсет?

like запрос к этой таблице отрабатывает 3-5 секунд. Или я неправильно что то делаю?


Shocker.Pro
Ну это не отменяет использования индексов.... хотя.... union в аксессе дурной и тормознутый, это я проходил. Может быть можно использовать обращения отдельно к индексам каждой таблицы?
Вот тут поподробнее, вообще не пойму о чем речь. Думал построить индексы на union запрос нельзя в принципе.

Shocker.ProЯ намекал на то, что можно теоретически, вместо памяти сливать эти данные в локальный mdb-файл. Тогда во-первых эту операцию можно будет проделывать не при каждом запуске программы, а только по необходимости, ну и, соответственно, нет проблем с индексированием.

я вот чето не пойму, как это при необходимости? Все равно нужно будет при запуске проверять изменилось ли чего. А count по количеству записей будет отрабатывать также долго.
или хранить дату/время создания фрагментов? А откуда прога знает сколько фрагментов?

Shocker.ProЛично я довольно косо смотрю на процесс, который отжирает от 15-ти мегов оперативки.... Ну это ты пользователю будет сугубо лично индифферентно.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729559
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusДумал построить индексы на union запрос нельзя в принципе.
Индексы строятся на таблицы, а не на запросы (материализованные представления в MSSQL опустим). Запросы используют эти индексы. Другой вопрос, что аксесс плохо (по крайней мере лет 5 назад, щас не знаю) работал с UNION-ами в плане скорости.

другой вопрос, что ты ищешь Like-ом. Тут индексы - да, не помогут.

Shamanusя вот чето не пойму, как это при необходимости? Все равно нужно будет при запуске проверять изменилось ли чего. А count по количеству записей будет отрабатывать также долго.
или хранить дату/время создания фрагментов? А откуда прога знает сколько фрагментов?
Почему также долго? Если Like не использует индексы, то Count-то - вполне.

Насчет фрагментов - не знаю, как у тебя устроены изменения этой структуры. Твой UNION-запрос как-то ведь об этом узнает...
ShamanusShocker.ProЛично я довольно косо смотрю на процесс, который отжирает от 15-ти мегов оперативки.... Ну это ты пользователю будет сугубо лично индифферентно.
А что база по размеру не расширяется постоянно?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729639
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНасчет фрагментов - не знаю, как у тебя устроены изменения этой структуры. Твой UNION-запрос как-то ведь об этом узнает...
запрос "узнает" при обновлении самой базы аксесс

Shocker.ProА что база по размеру не расширяется постоянно? скорость роста маленькая. За месяц прирастает 1-1,5 тыс записей. Или рост за год 4,3% или 20Мб+5%=21МБ через год. Метром больше, метром меньше ..


Shocker.Pro, такой ещё вопрос в рамках этой же задачи.

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

вот скрин
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729640
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729641
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри интернет тупит
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729656
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus


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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729657
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Среда разработки VB6
код такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Form1.Show

Form1.Label1( 0 ).Caption = Название
Выполнение запроса  1 
Form1.Label1( 0 ).Caption = Название
Выполнение запроса  2 

....

Form1.Label1( 0 ).Caption = Название
Выполнение запроса  14 

Unload Form1

в коде формы 1 никаких процедур нет
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729661
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus


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


Я уже понял, что из моих слов не следует, что я её рисую. Вставил код в прошлом посте.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729708
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus

Ты забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729725
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus

Ты забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса



Сделал doevents все заработало. Спасибо Игорь.

а что значит рефреш для лейбла,
разве строка
Код: plaintext
Form1.Label1( 0 ).Caption = Название

не есть рефреш? или должна быть какая то команда типа .update
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729809
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus
> а что значит рефреш для лейбла,

Код: plaintext
Me.Label1.Refresh


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36730658
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus
> а что значит рефреш для лейбла,

Код: plaintext
Me.Label1.Refresh




Игорь спасибо, Вы очень помогли
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36730671
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще AutoRefresh форме поставить
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731398
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса
получается что запрос будет работать в фоне?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731403
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admИгорь Горбонос,
Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса
получается что запрос будет работать в фоне?
Да.
Только не из-за DoEvents, а из-за асинхронного его запуска.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731408
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
а если обычным запросом разве не будет в фоне?
вы говорили что в 1с grid догружается , а не разом заполняется
это и есть асинхронный метод , или это что то другое?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731442
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admИгорь Горбонос,
Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса
получается что запрос будет работать в фоне? Что значит в фоне? Собственно выполнятся будет именно запрос, а форма будет болтатся перед глазами в фоне. Это если запрос синхронно выполнять. А DoEvents нужен для отрисовки всего что нужно и больше ни для чего :)
А если запрос выполнять асинхронно, то там другая(событийная) схема работы будет. Собственно ничего сложного, но код будет выглядеть по другому
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731448
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносЧто значит в фоне?
не будет зависшего окна , пока не выполнится запрос
так как насколько понял DoEvents активным делает окно ,
а запрос делается и не тормозит работу
Игорь ГорбоносА DoEvents нужен для отрисовки всего что нужно и больше ни для чего :)
ну тоже самое про что я сказал выше?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731461
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа если обычным запросом разве не будет в фоне?
Что ты понимаешь под фоновым выполнением?
Как правило есть пользовательский интерфейс, который всегда должен быть доступен и откликатся на реакцию пользователя. Для достижения этих требований всякие долгоиграющие вычисления стараются выполнять в отдельном потоке и называют этот отдельный поток - фоновым. Из-за сложностей с реализацией отдельных потоков на VB, да и не только на VB, при долгой первоначальной загрузке программы используют метод называемый SplashScreen. Его суть заключается в следующем: при старте программы показывается обычная форма с красивым рисунком и если нужно с объяснительным текстом. Эта форма и будет имитировать работу, но на самом деле будет фоном для реальных действий, которые выполняются не в фоне, но без видимых последствий. По окончании всех первоначальных загрузок форма прячется и показывается уже окно, с которым будет работать пользователь.

aduka05admвы говорили что в 1с grid догружается , а не разом заполняется
это и есть асинхронный метод , или это что то другое?
Это что-то другое и не асинхронное. Можно сделать свой класс-datasource который будет постепенно получать данные от сервера или читать из файла и грид, присоединенный к объекту этого класса будет отображать полученные данные. А асинхронность это реализация АДО, в 1с врядли используют АДО.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731463
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admне будет зависшего окна , пока не выполнится запрос
так как насколько понял DoEvents активным делает окно ,
а запрос делается и не тормозит работу
Зависшее окно как раз будет, пока будет выполнятся запрос, но т.к. на форме ничего важного нет, это не важно. Именно для этого окно и показывается. А DoEvents всего лишь дает отрисовать новую информацию. И все.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731473
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносЕго суть заключается в следующем: при старте программы показывается обычная форма с красивым рисунком и если нужно с объяснительным текстом. Эта форма и будет имитировать работу, но на самом деле будет фоном для реальных действий, которые выполняются не в фоне, но без видимых последствий. По окончании всех первоначальных загрузок форма прячется и показывается уже окно, с которым будет работать пользователь.
спасибо , просто я думал запрос в фон отправляется , а оказывается все наоборот
Игорь ГорбоносА DoEvents всего лишь дает отрисовать новую информацию. И все.
просто читал где то что DoEvents передает работу Windows , не совсем понял что имелось ввиду,
щас понял спасибо
только не понятно зачем его ставить перед запросом , а не перед
Код: plaintext
Form1.Label1( 0 ).Caption = Название
короче че то я не понял зачем этот DoEvents
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731477
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admкороче че то я не понял зачем этот DoEvents
уже пишу свои попытки объяснить....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Адука запутался. Попробую я его еще больше запутать или распутать.

Давай только откажемся от термина "фоном" - это понятие относительное и диалектическое.

Итак. Синхронные действия (обычные для VB). Код выполняется последовательно, друг за другом, если выполняется долгая операция, весь остальной код тупо ждет (даже если это запрос к серверу БД, выполнение которого зависит от сервера, а не от твоей программы). Закончилась одна команда - началась следующая.
События при этом встают в очередь. Любые, кнопки, клавиши, клики, таймер. Если у тебя сработал таймер, событие от него не будет немедленно выполнено, а встанет в очередь и дождется завершения твоего текущего кода.
То есть заканчивается выполнение текущего кода (а это тоже в 99,9 случаев обработка события), начинает выполняться следующие, остальные ждут.
Вот. Это обычный синхронный режим.

А есть такая интересная штука - DoEvents. Она вовсе не вводит асинхронность и многопоточность. Она просто берет и твой текущий код переносит в конец очереди событий. То есть ты делаешь DoEvents, твоя текущая процедура останавливается, начинают выполняться все события, которые ждали своей очереди. Потом управление вернется к твоей процедуре. Если событий в очереди не было - ничего как бы не произойдет.

пока вникай, пишу далее....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731490
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С помощью DoEvents можно сымитировать многопоточность.
К примеру, у тебя прыгает по экрану чертик. Тупо в цикле:
Код: plaintext
1.
2.
3.
While True
  'команда - нарисовать чертика в следующем месте
  'проверить, не нажималась ли кнопка "отмена", если нажималась - выйти из цикла
Wend
В этом случае код зациклится, будет рисовать чертика, но с точки зрения пользователя не будет реагировать ни на какие раздражители, включая закрытие формы. Почему? Потому что события от пользователя ждут, когда закончится твой код, а он не закончится никогда.
Как сделать, чтобы реагировало.
Код: plaintext
1.
2.
3.
4.
While True
  'команда - нарисовать чертика в следующем месте
  DoEvents
  'проверить, не нажималась ли кнопка "отмена", если нажималась - выйти из цикла
Wend
Пока событий нет, цикл крутится, как и крутился. Пользователь нажал на кнопку "отмена" - после очередной прорисовки чертика управление будет передано кнопке "Отмена". Кнопка просто установит флажок (переменную), что она была нажата. Цикл увидит, что кнопка была нажата и завершится.
Кроме того, чертик будет себе прыгать, а пользователь может переключаться на другие формы того же приложения и делать там все, что хочет. Можно даже запустить несколько таких циклов, они все друг другу будут передавить управление и все чертики будут прыгать.

теперь про асинхронность....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731502
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асинхронное выполнение запроса напоминает работу с таймером. Ты дал команду серверу выполнить запрос (завел таймер), сервер сказал "ок" и пошел думать. Твоя же программа получает управление взад и можешь дальше делать, что хочешь. Обрабатывать нажатия кнопок и т.п. Или рисовать на экране прыгающего чертика.
Когда сервер закончит возиться с твоим запросом (когда у таймера настанет время), он выдаст событие - завершил. Вот для этого и важен в рисовании чертика DoEvents - иначе ты просто не поймаешь событие от ADO, когда твой запрос будет готов.

Но лучше пойти дальше - не рисовать чертика с использование DoEvents, а рисовать его по таймеру. то есть заводишь таймер на 300 мс, и по каждому событию рисуешь новое положение чертика. Тогда у тебя программа вообще не занята ерундой. Она просто сидит в ожидании событий. Пришло событие от таймера - перерисовал чертика. Пришло событие от ADO - начинаем обрабатывать результаты запроса - вот и вся асинхронность.

ЗЫ:
Кстати, я не использую тот метод, пример которого ты нарыл. После того, как я получил от сервера событие, что данные готовы, я начинаю заполнять этими данными сетку. Но в цикле после каждой строки делаю DoEvents. В результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731520
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm,

И немножко про многопоточность (мультизадачность). С помощью DoEvents ты создаешь псевдомультизадачность (но выглядит она как настоящая). С помощью асинхронного выполнения запроса - уже реальная мультизадачность. Кроме того, не очень сложно запустить в VB второй поток, и параллельно выполнять два своих кода.

Самый большой гемор - это синхронизация и изоляция потоков. Это жуткая головная боль. Хорошо сделанных многопоточных программ очень мало (могу привести в пример The Bat! - там реально отрисовка письма, проверка почты, проверка антиспамом, пересчет и индексирование папок идет независимо и при этом не глючит - это дает пользователю нормально работать, а не ждать, пока закончится какая-то операция).

В чем головная боль: вот к примеру ты сейчас организуешь, что твой пользователь может что-то делать, пока выполняется запрос. А если он пойдет, откроет еще одну форму и запустит на выполнение еще один запрос. А не выполнится ли он в том же комманде (тогда первый запрос может оказаться сброшенным). А не перепрограммирует он какие-то глобальные переменные, которые еще понадобятся первому запросу. В конце-концов, а не закроет ли пользователь форму, которая ожидает, когда закончит работать запрос? А то, если он закроет форму, а после этого придет событие от ADO - форма может загрузиться обратно без твоего желания :). То есть надо предусмотреть отмену выполнения запроса, если пользователь закрыл форму. А не может ли пользователь поменять какие-то контролы на форме, пока выполняется запрос, что окажется критичным при получении данных. А не запустит ли пользователь запрос повторно... В общем головной боли с этой многопоточностью хватает....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731522
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.ProВ результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки.
то есть у вас здесь также как в цикле с чертиком , если наступает событие то передается управление пользователю?
если стоит DoEvents перед строкой кода то, она помещается в конец очереди
как например
Код: plaintext
1.
2.
DoEvents
запрос
то есть мы можем далее работать с формой
Код: plaintext
Form1.Label1( 0 ).Caption = Название
только вот еще вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DoEvents
запрос1
Form1.Label1.Caption = Заполняем GRID1
DoEvents
запрос2
Form1.Label1.Caption = Заполняем GRID2
......
DoEvents
запрос n
Form1.Label1.Caption = Заполняем GRID n
здесь как это все будет работать
здесь все лэйблы будут поочереди срабатывать, пока запросы очереди ждут?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731526
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.ProВ чем головная боль: вот к примеру ты сейчас организуешь, что твой пользователь может что-то делать, пока выполняется запрос. А если он пойдет, откроет еще одну форму и запустит на выполнение еще один запрос. А не выполнится ли он в том же комманде (тогда первый запрос может оказаться сброшенным). А не перепрограммирует он какие-то глобальные переменные, которые еще понадобятся первому запросу. В конце-концов, а не закроет ли пользователь форму, которая ожидает, когда закончит работать запрос? А то, если он закроет форму, а после этого придет событие от ADO - форма может загрузиться обратно без твоего желания :). То есть надо предусмотреть отмену выполнения запроса, если пользователь закрыл форму. А не может ли пользователь поменять какие-то контролы на форме, пока выполняется запрос, что окажется критичным при получении данных. А не запустит ли пользователь запрос повторно... В общем головной боли с этой многопоточностью хватает....
читал где-то люди тоже говорили , что его надо использовать осторожно)))
но и без этого тоже трудно наверно , хотя можно вешать progressbar пусть пользователь ждет))
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731538
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm
только вот еще вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DoEvents
запрос1
Form1.Label1.Caption = Заполняем GRID1
DoEvents
запрос2
Form1.Label1.Caption = Заполняем GRID2
......
DoEvents
запрос n
Form1.Label1.Caption = Заполняем GRID n
здесь как это все будет работать
здесь все лэйблы будут поочереди срабатывать, пока запросы очереди ждут?
Ща почитал повнимательней, о чем вы переписывались с Игорем....
Там DoEvents не служит никакой асинхронности и лучше его, наверное, не использовать...
просто после каждого
Form1.Label1.Caption =
поставить
Form1.Label1.Refresh или Form1.Refresh
Просто, как правило, отрисовка экрана не происходит, пока не закончатся все события в очереди или кто-нить не даст DoEvents или Refresh. Но так как имеет другие побочные эффекты, можно обойтись Refresh для ясности.

Однако, насколько я помню, что твои запросы выполняются разное время, а ты хотел, чтобы твоя форма отображала процесс равномерно. Тогда нужно запускать запросы асинхронно, а на форме рисовать то, что тебе нравится....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731545
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admShocker.Pro,
Shocker.ProВ результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки.
то есть у вас здесь также как в цикле с чертиком , если наступает событие то передается управление пользователю?
Не пользователю - а событию, которое мог вызвать пользователь (нажать кнопку, закрыть форму...)

aduka05admесли стоит DoEvents перед строкой кода то, она помещается в конец очереди
как например
Код: plaintext
1.
2.
DoEvents
запрос
то есть мы можем далее работать с формой
Код: plaintext
Form1.Label1( 0 ).Caption = Название


Нет, недоразобрался ты....
Не строка, которая следует за DoEvents помещается в конец очереди, а вся твоя процедура. То есть последовательность выполнения строк в твоей процедуре никак измениться не может.
Будут выполняться другие события, но не код твоей процедуры. До тех пор, пока другие события не закончатся.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731546
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
спасибо большое , еще вопрос задать хотел
в этой процедуре я заношу данные в две таблицы
код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
FlexGridPlus4.FixedRows =  0 
strsql = "insert into documents (name) values ('" + Text1.Text + "')"
query strsql
strsql = "Select * from documents"
query strsql
rs.MoveLast
naklnum = rs.Fields("id")
strsql = ""
'Debug.Print "массив цена " & massprice(FlexGridPlus4.TextMatrix(1, 4)) & " usluga_id " & FlexGridPlus4.TextMatrix(1, 4) _
'& " amount " & Str(FlexGridPlus4.TextMatrix(1, 2))
For i =  1  To FlexGridPlus4.Rows -  1 
strsql = "insert into registr (doc_id,client_id, usluga_id, price , amount,date, time) values " _
+ "(" + Str(naklnum) + "," + Str(Combo1.ItemData(Combo1.ListIndex)) + "," + Str(FlexGridPlus4.TextMatrix( 1 ,  4 )) + "," _
 + Str(massprice(FlexGridPlus4.TextMatrix( 1 ,  4 ))) + "," + Str(FlexGridPlus4.TextMatrix( 1 ,  2 )) + "," + _
 "'" + Text2.Text + "'" + "," + "'" + Text3.Text + "')"
Debug.Print strsql
query strsql
FlexGridPlus4.RemoveItem  1 
Next i
Debug.Print strsql
FlexGridPlus4.Rows = FlexGridPlus4.Rows +  1 
FlexGridPlus4.FixedRows =  1 
Set rs = Nothing
Combo2.Visible = False

так вот может быть ситуация что какой сбой и в первую таблицу данные занеслись
а во вторую нет (как вы сами такое реализуете )?
то есть хочется все или ничего (транзакция называется по мойму)
но как это на VB реализуется
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731549
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm
так вот может быть ситуация что какой сбой и в первую таблицу данные занеслись
а во вторую нет (как вы сами такое реализуете )?
то есть хочется все или ничего (транзакция называется по мойму)
но как это на VB реализуется
Напомни, какой СУБД ты пользуешься?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731551
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
все понял поэтому Shamanus говорил что у него никаких процедур
Shamanusв коде формы 1 никаких процедур нет
только еще вопрос
ИгорьТы забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса

Shocker.ProТам DoEvents не служит никакой асинхронности и лучше его, наверное, не использовать...
просто после каждого
Form1.Label1.Caption =
поставить
Form1.Label1.Refresh или Form1.Refresh
то есть в данном случае он не помогает
есть смысл его использовать если есть куча процедур которые должны срабатывать в то же время что и запрос с DoEvents(работа с контролами , другими гридами , или игра самописная )))
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731552
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
MYSQL
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731553
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
еще меня смущает что я в цикле запрос выполняю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
For i =  1  To FlexGridPlus4.Rows -  1 
strsql = "insert into registr (doc_id,client_id, usluga_id, price , amount,date, time) values " _
+ "(" + Str(naklnum) + "," + Str(Combo1.ItemData(Combo1.ListIndex)) + "," + Str(FlexGridPlus4.TextMatrix( 1 ,  4 )) + "," _
 + Str(massprice(FlexGridPlus4.TextMatrix( 1 ,  4 ))) + "," + Str(FlexGridPlus4.TextMatrix( 1 ,  2 )) + "," + _
 "'" + Text2.Text + "'" + "," + "'" + Text3.Text + "')"
Debug.Print strsql
query strsql
FlexGridPlus4.RemoveItem  1 
Next i
вдруг не успеет отработать
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731555
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
strsql = "Select * from documents"
query strsql
rs.MoveLast
naklnum = rs.Fields("id")

Что-то глупость наблюдаю....
Ты перегружаешь на клиента ВСЕ документы только для того, чтобы посмотреть номер последнего?

Ну, во-первых, кто сказал, что "Select * from documents" выдаст их в порядке возрастания????? Как СУБД на душу положит, так и выдаст, для сортироки обязательно надо использовать "order by".
Во-вторых, зачем грузить ВСЕ ЗАПИСИ И ВСЕ ПОЛЯ? Это может быть огромный объем данных. Используй Max(id).
В третьих - этот способ все равно неправильный. Что будет, если два пользователя одновременно вставят документ? Какой номер ты получишь, свой или чужой?....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731558
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admесть смысл его использовать если есть куча процедур которые должны срабатывать в то же время что и запрос с DoEvents(работа с контролами , другими гридами , или игра самописная )))
Фраза "запрос с DoEvents" выдает, что ты опять не понял. Почитай еще несколько раз мой текст...

Если запрос будет выполнен синхронно, одновременно с ним ты ничего не сделаешь.
Если запрос будет выполнен асинхронно, DoEvents у тебя будет не рядом с запросом, а совершенно в другом коде (если вообще он будет нужен).
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731561
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.Pro третьих - этот способ все равно неправильный. Что будет, если два пользователя одновременно вставят документ? Какой номер ты получишь, свой или чужой?....
ну да ошибка будет, в итоге ниче не вставится
Shocker.ProЕсли запрос будет выполнен асинхронно, DoEvents у тебя будет не рядом с запросом, а совершенно в другом коде (если вообще он будет нужен).
типо этого?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731565
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admтак вот может быть ситуация что какой сбой и в первую таблицу данные занеслись
а во вторую нет (как вы сами такое реализуете )?
то есть хочется все или ничего (транзакция называется по мойму)
но как это на VB реализуется
Я работаю с MSSQL. SQL-команд из VB не выполняю вообще. Все отдаю серверу и он сам там уже выполняет. В том числе, открывает и закрывает транзакции.
Если бы ты работал с MSSQL, впрочем я бы посоветовал передать обе команды одним пакетом сразу с транзакцией. В MySQL тоже можно выполнить два запроса в одной строке, разделив их ";", но как и можно ли там открыть транзакцию - не знаю.

ADO поддерживает транзакцию на своем уровне: BeginTrans, CommitTrans в коннекшне. Но я это не люблю, если у тебя прога рухнет, транзакция останется открытая на какое-то время (пока по таймауту не отвалится), таблицы останутся заблокированными для других пользователей....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731571
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.ProВ MySQL тоже можно выполнить два запроса в одной строке, разделив их ";"
так и буду делать
Shocker.ProSQL-команд из VB не выполняю вообще. Все отдаю серверу и он сам там уже выполняет
отдаете так же ?
Код: plaintext
rs.Open "Select * from uslugi"
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731573
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admвдруг не успеет отработать
Что значит "не успеет"? Кто не успеет?
Здесь все синхронно работает, пока предыдущая команда не выполнится, следующая не начнется.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731575
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admShocker.Pro третьих - этот способ все равно неправильный. Что будет, если два пользователя одновременно вставят документ? Какой номер ты получишь, свой или чужой?....
ну да ошибка будет, в итоге ниче не вставится
Почему не вставится? Вставится. Только ты вставишь содержимое в другой документ, не в свой, потому что получишь чужой идентификатор.

aduka05admShocker.ProЕсли запрос будет выполнен асинхронно, DoEvents у тебя будет не рядом с запросом, а совершенно в другом коде (если вообще он будет нужен).
типо этого?
там вообще нет DoEvents
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731582
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admShocker.Pro,
Shocker.ProВ MySQL тоже можно выполнить два запроса в одной строке, разделив их ";"
так и буду делать

Можно собрать все в одну строку и скопом отправить на сервер.
Только надо смотреть ограничение по длине выполняемой строки.
И еще. В MSSQL есть команды для получения номера очередного ID-а, вставленного лично твоей сессией. Не знаю, можно ли это с MySQL.

aduka05admShocker.ProSQL-команд из VB не выполняю вообще. Все отдаю серверу и он сам там уже выполняет
отдаете так же ?
Код: plaintext
rs.Open "Select * from uslugi"

Вопрос не понят. Еще раз - я НЕ ВЫПОЛНЯЮ SQL-команд из VB. В MSSQL есть свой внутренний язык и такое понятие, как процедура. Я отдаю данные процедуре, а она уже сама разбирается, какие SQL-команды дать для записи в базу и как организовать транзакции.

===================
ЗЫ: Еще совет (и, кажется, я тебе его уже давал ранее). Перед rs.Open обязательно делай rs.Close и Set rs = Nothing.

ЗЗЫ: А вообще процедура query организована криво. Представь, что тебе надо открыть рекордсет, а у тебя один уже открыт. Или еще хуже - вызываешь внутри цикла какую-нить функцию, а она тоже вызывает query, которая подпортит тебе rs для вышестоящей функции.
И вообще, логично не объявлять глобальную переменную rs, а переделать query с процедуры на функцию, которая возвращает ADODB.Recordset.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731583
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ушел спать. тебе тут хватит пока для внимательного изучения....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731585
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
транзакцииMYSQLТранзакцией называется такая последовательность SQL-запросов, которая выполняется как единая, неделимая операция. Транзакция может быть либо выполнена целиком, либо не выполнена совсем. Третьего не дано. Доступ к записям таблиц, которые подвергаются изменению в ходе транзакции, блокируется для всех клиентов (кроме того, разумеется, который непосредственно инициировал транзакцию).
Транзакции поддерживаются СУБД MySQL только для таблиц типа InnoDB (а также BDB — BerkeleyDB; это не обсуждавшийся нами ранее физический тип таблиц MySQL, разработанный фирмой Sleepycat).
По умолчанию MySQL работает в режиме немедленного выполнения операторов SQL. Иными словами, любой SQL-запрос, модифицирующий таблицу, выполняется сразу же, и все изменения тут же фиксируются на диске.
Этот режим контролируется системной переменной AUTOCOMMIT, которая по умолчанию принимает значение 1.
Для того, чтобы отключить режим немедленного выполнения SQL-запросов, нужно установить переменную AUTOCOMMIT в 0:
SET AUTOCOMMIT = 0;
Результаты выполнения последующих SQL-запросов не будут фиксироваться на диске. Для того, чтобы завершить транзакцию, т. е. единомоментно зафиксировать результаты выполнения всех запросов, необходимо использовать оператор COMMIT. Для того же, чтобы отменить при необходимости действие SQL-операторов, составляющих транзакцию, т. е. вернуть базу данных в исходное состояние, применяется команда ROLLBACK. (После фиксации результатов транзакции при помощи оператора COMMIT использование оператора ROLLBACK уже не будет иметь смысла — транзакция завершена.)
Вот как может выглядеть описание транзакции для перевода денег со счета на счет:
SET AUTOCOMMIT = 0;
UPDATE account SET balance = balance – 1000 WHERE id = 32768;
UPDATE account SET balance = balance + 1000 WHERE id = 65536;
COMMIT;
SET AUTOCOMMIT = 1;
А вот пример использования оператора ROLLBACK:
SET AUTOCOMMIT = 0;
UPDATE account SET balance = balance – 1000 WHERE id = 32768;
UPDATE account SET balance = balance + 1000 WHERE id = 65536;
ROLLBACK;
SET AUTOCOMMIT = 1;Операция перевода средств со счета на счет, которую пытались выполнить два запроса UPDATE, будет отменена.
В ряде случаев прибегать к изменению системной переменной AUTOCOMMIT не слишком удобно. Язык SQL предусматривает оператор START TRANSACTION, отключающий режим немедленного выполнения SQL-операторов. Этот режим остается выключенным до момента явного завершения транзакции при помощи оператора COMMIT или ROLLBACK. Пример нашей транзакции, осуществляющей перевод средств со счета на счет, таким образом, можно перефразировать:
START TRANSACTION;
UPDATE account SET balance = balance – 1000 WHERE id = 32768;
UPDATE account SET balance = balance + 1000 WHERE id = 65536;
COMMIT;
Примечание
Некоторые операторы SQL неявно завершают транзакцию, как если бы был вызван оператор COMMIT. В их числе CREATE DATABASE, DROP DATABASE, CREATE TABLE, DROP TABLE, START TRANSACTION, SET AUTOCOMMIT = 1 и ряд других, не рассмотренных нами.

Shocker.Proтам вообще нет DoEvents
ну да) поищу ка я примеры с DoEvents плюс ваша информация и все встанет по полочкам
Shocker.ProЗдесь все синхронно работает, пока предыдущая команда не выполнится, следующая не начнется.
точно
Shocker.ProПочему не вставится? Вставится. Только ты вставишь содержимое в другой документ, не в свой, потому что получишь чужой идентификатор.
точно
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731591
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proушел спать. тебе тут хватит пока для внимательного изучения....
это точно
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731832
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admтранзакцииMYSQL
ага, ну все то же самое

важно собрать все команды в одну большую строку, обрамить началом и концом транзакции и выполнить разом. Но тут возникает вопрос о максимальной длине этой строки
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732770
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь голову поломал на абсолютно обратной ситуации

Код: plaintext
1.
2.
Form_SelectDate.Show
Iskl.TextBox8.Value = dt_1

при этом форма Form_SelectDate меняет константу dt_1

почему этот засранец... нехороший VB не дожидается пока форма не закроется, а меняет сразу величину поля на текущее значение dt_1
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732781
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Жарко.
Ты сам понял, чего спросил?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732786
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusтеперь голову поломал на абсолютно обратной ситуации

Код: plaintext
1.
2.
Form_SelectDate.Show
Iskl.TextBox8.Value = dt_1

при этом форма Form_SelectDate меняет константу dt_1

почему этот засранец... нехороший VB не дожидается пока форма не закроется, а меняет сразу величину поля на текущее значение dt_1


Код: plaintext
Form_SelectDate.Show vbModal
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732787
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёпрст. Вчера всю ночь с Адукой тут общался, а это оказывается топик Шамануса.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732796
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

А, вот Костя догадался...
В общем, то, что ты открыл форму, никак не запрещает твой программе дальше выполняться. Иначе какая ж многозадачность.

Исключение из этого Костя привел.
Но тогда ты не сможешь переключаться на другие формы.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732818
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneShamanusтеперь голову поломал на абсолютно обратной ситуации

Код: plaintext
1.
2.
Form_SelectDate.Show
Iskl.TextBox8.Value = dt_1

при этом форма Form_SelectDate меняет константу dt_1

почему этот засранец... нехороший VB не дожидается пока форма не закроется, а меняет сразу величину поля на текущее значение dt_1


Код: plaintext
Form_SelectDate.Show vbModal


Спасибо Konst_One, но это не то,
Если форма Form_SelectDate (это календарь) будет модальной, то на ней должны быть управляющие конструкции, которые сами будут менять значение текстбокса в форме iskl. А этот вариант не подходит, т.к. эту форму могут вызывать другие формы. Мы же не можем каждую форму прописать в коде календаря.

А я хочу так, есть глобальная переменная с датой, вызываем диалог календаря, в диалоге меняем переменную, при закрытии диалога устанавливаем значение даты в текстбокс.

в VBA если я из одной формы вызывал другую, то выполнение кода прерывалось до закрытия вызванной формы

т.е вот так
Код: plaintext
1.
2.
3.
Form_SelectDate.Show
' тут VBA ждет пока закроем форму Form_SelectDate
Iskl.TextBox8.Value = dt_1

VB не ждет, а считает, что если он сделал Show, то и ждать пока форма закроется не стоит.

Shocker.Pro Жарко.
Ты сам понял, чего спросил?

трудности перехода с VBA на VB, помнишь я тебя спрашивал как оно :)
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732828
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusKonst_OneShamanusтеперь голову поломал на абсолютно обратной ситуации

Код: plaintext
1.
2.
Form_SelectDate.Show
Iskl.TextBox8.Value = dt_1

при этом форма Form_SelectDate меняет константу dt_1

почему этот засранец... нехороший VB не дожидается пока форма не закроется, а меняет сразу величину поля на текущее значение dt_1


Код: plaintext
Form_SelectDate.Show vbModal


Спасибо Konst_One, но это не то,
Если форма Form_SelectDate (это календарь) будет модальной, то на ней должны быть управляющие конструкции, которые сами будут менять значение текстбокса в форме iskl. А этот вариант не подходит, т.к. эту форму могут вызывать другие формы. Мы же не можем каждую форму прописать в коде календаря.

А я хочу так, есть глобальная переменная с датой, вызываем диалог календаря, в диалоге меняем переменную, при закрытии диалога устанавливаем значение даты в текстбокс.

в VBA если я из одной формы вызывал другую, то выполнение кода прерывалось до закрытия вызванной формы

т.е вот так
Код: plaintext
1.
2.
3.
Form_SelectDate.Show
' тут VBA ждет пока закроем форму Form_SelectDate
Iskl.TextBox8.Value = dt_1

VB не ждет, а считает, что если он сделал Show, то и ждать пока форма закроется не стоит.

Shocker.Pro Жарко.
Ты сам понял, чего спросил?

трудности перехода с VBA на VB, помнишь я тебя спрашивал как оно :)


тогда делайте через событие класса и вызывайте метод, в котором будет ожидание получения инфы из данного события вашей формы.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732834
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Тебе нужно разнести вызов формы и программирование поля в любом случае в разные места. Далее надо получить событие от вызванной формы. Это можно сделать миллионом способов. К примеру, форма может сгенерировать событие, может вызывать метод вызвавшей формы. Может сама поменять тебе поле и т.п.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732854
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
Form_SelectDate.Show
' тут VBA ждет пока закроем форму Form_SelectDate
Iskl.TextBox8.Value = dt_1


вот так:

Код: plaintext
1.
dt = MyPublicModule.ShowAndWaitValue
Iskl.TextBox8.Value = dt


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
'Module MyPublicModule
Public Function ShowAndWaitValue() as Date
Dim cls as MyClass 'класс вашей формы

  Set cls = New MyClass
  cls.Show
  Do while Not cls.Result 'boolean проперти, устанавливается в True когда меняете значение исходящей даты на форме 
      DoEvents
  Loop
  ShowAndWaitValue = cls.ResultDate 'исходящее значение даты на вашей форме
  Set cls = Nothing
   
End Function
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732856
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One, Shocker.Pro

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

Спасибо
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732860
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

Еще и готовый код сразу. Спасибо большое.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732889
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusKonst_One,

Еще и готовый код сразу. Спасибо большое.

А я вот не люблю такой подход. Зачем гонять процессор в дурном цикле? Пользователь может год там будет возиться. Проще тогда уж просто перехватить закрытие формы.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732894
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShamanusKonst_One,

Еще и готовый код сразу. Спасибо большое.

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

я не знаю причину зачем что-то там ждать на label, но если автор так хочет и понимает зачем ему это надо, то пусть циклы гоняет процессор
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732897
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneя не знаю причину зачем что-то там ждать на label, но если автор так хочет и понимает зачем ему это надо, то пусть циклы гоняет процессор
Ага. А потом из-за таких программ гонка вооруженийапгрейдов и новые супермощные процессоры и закон Мура
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732901
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneя не знаю причину зачем что-то там ждать на label, но если автор так хочет и понимает зачем ему это надо, то пусть циклы гоняет процессор
Ага. А потом из-за таких программ гонка вооруженийапгрейдов и новые супермощные процессоры и закон Мура

мы работаем на интел+микрософт
даёшь гонку процессоров и ОС
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732910
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
даёшь гонку процессоров и ОС

согласен, пусть ОС, думает КАК эту конструкцию циклическую можно упростить, чтобы не грузить проц. За что платятся деньги?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732928
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusKonst_One
даёшь гонку процессоров и ОС

согласен, пусть ОС, думает КАК эту конструкцию циклическую можно упростить, чтобы не грузить проц. За что платятся деньги?

если будет плохо, то в цикле можно так извратиться:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Declare Function GetTickCount Lib "kernel32" () As Long

Public Sub Idle(Optional msec As Long =  0 )
Dim EndTime As Long
  EndTime = GetTickCount() + msec
  Do
    DoEvents
    Sleep  1 
  Loop While GetTickCount() < EndTime
End Sub

...
do while not cls.Result
    Idle  100 
Loop
...
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732955
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаманус, не слушай его, он засланец билла гейтса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private WithEvents frmSelDat As Form
...

Form_SelectDate.Show
End Sub

...

Private Sub frmSelDat_Unload
  Iskl.TextBox8.Value = dt_1
End Sub
Все. И не надо никуда бегать.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732960
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProШаманус, не слушай его, он засланец билла гейтса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private WithEvents frmSelDat As Form
...

Form_SelectDate.Show
End Sub

...

Private Sub frmSelDat_Unload
  Iskl.TextBox8.Value = dt_1
End Sub
Все. И не надо никуда бегать.

это самый лучший вариант, но нам так и не ответили зачем ему нужно ждать закрытия формы?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732961
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, ошибся при копипасте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private WithEvents frmSelDat As Form
...

Set frmSelDat=Forms.Add("Form_SelectDate")
frmSelDat.Show
End Sub

...

Private Sub frmSelDat_Unload
  Iskl.TextBox8.Value = dt_1
End Sub
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732964
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneэто самый лучший вариант, но нам так и не ответили зачем ему нужно ждать закрытия формы?
Затем, что форма меняет ему эту переменную dt_1
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732970
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneэто самый лучший вариант, но нам так и не ответили зачем ему нужно ждать закрытия формы?
Затем, что форма меняет ему эту переменную dt_1

а зачем она ему её меняет и почему надо ждать программе пока не поменяется эта дата? может в этом весь фокус?

ТС переходи на событийное объектное программирование
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732983
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа зачем она ему её меняет и почему надо ждать программе пока не поменяется эта дата? может в этом весь фокус?
ТС переходи на событийное объектное программирование
Дык. Календарь для ввода даты пользователем....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36732988
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneа зачем она ему её меняет и почему надо ждать программе пока не поменяется эта дата? может в этом весь фокус?
ТС переходи на событийное объектное программирование
Дык. Календарь для ввода даты пользователем....

тогда я вообще перестал понимать логику. чем vbModal не подошло?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733006
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, что-то они лишнего понаписал.

ShamanusЕсли форма Form_SelectDate (это календарь) будет модальной, то на ней должны быть управляющие конструкции, которые сами будут менять значение текстбокса в форме iskl.
Как эти два предложения связаны, вообще непонятно. Не видно причинно-следственной связи.

ShamanusА этот вариант не подходит, т.к. эту форму могут вызывать другие формы. Мы же не можем каждую форму прописать в коде календаря.
Можем. Для этого в вызываемую форму отдается ссылка на вызывающую форму.

ShamanusА я хочу так, есть глобальная переменная с датой, вызываем диалог календаря, в диалоге меняем переменную, при закрытии диалога устанавливаем значение даты в текстбокс.
А вот это как раз криво. Пользователь может одновременно из разных форм вызвать календарь, а переменная у них на всех одна
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733010
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShamanusА этот вариант не подходит, т.к. эту форму могут вызывать другие формы. Мы же не можем каждую форму прописать в коде календаря.
Можем. Для этого в вызываемую форму отдается ссылка на вызывающую форму.
Вот тут я автору рассказывал основы этого дела
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733013
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДа, что-то они лишнего понаписал.

ShamanusЕсли форма Form_SelectDate (это календарь) будет модальной, то на ней должны быть управляющие конструкции, которые сами будут менять значение текстбокса в форме iskl.
Как эти два предложения связаны, вообще непонятно. Не видно причинно-следственной связи.

ShamanusА этот вариант не подходит, т.к. эту форму могут вызывать другие формы. Мы же не можем каждую форму прописать в коде календаря.
Можем. Для этого в вызываемую форму отдается ссылка на вызывающую форму.

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

так а я о чём и толкую. ему просто надо сделать свою форму календаря с public function:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
'form
Public Function SelectCalendar() as Date
  Me.Show vbModal
  SelectCalendar = me.calendarcontrol.value
End Function


'вызов извне
me.labeldate.caption = FormCalendar.SelectCalendar
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733045
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

Сейчас проверил насчет vbModal, кажется действительно сморозил глупость

если использую vbModal при закрытии формы календаря возврат идет не на форму, которая календарь вызвала, а на её материнскую форму.

Я сейчас попробую оптимизировать эту часть кода и возможно vbModal устроит.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733055
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusKonst_One,

Сейчас проверил насчет vbModal, кажется действительно сморозил глупость

если использую vbModal при закрытии формы календаря возврат идет не на форму, которая календарь вызвала, а на её материнскую форму.

Я сейчас попробую оптимизировать эту часть кода и возможно vbModal устроит.


Код: plaintext
Me.Show vbModal, [OwnerForm]


2-й параметр - это ссылка на вызывающий объект. можете указать тот , который вам нужен. модальная форма откроется в рамках указанного объекта
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733090
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Подумай. Если у тебя в проекте будет хотя бы полтора десятка форм, неплохо бы написать себе небольшой движок работы с ними, который будет обеспечивать передачу параметров туда и обратно, активацию форм в порядке, обратном открытию и т.п....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733218
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShamanus,

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

Я согласен, у меня уже есть многие элементы движка для стандартной проги. (календарь один из них) Пока проблема в знаниях. А систематическим изучением заниматься времени не хватает.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36733233
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusА систематическим изучением заниматься времени не хватает.
Ну на таких вещах экономить нельзя. Потратив сейчас день завтра выиграешь месяц.
...
Рейтинг: 0 / 0
96 сообщений из 96, показаны все 4 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Окно загрузки файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]