Запуск долгой SP

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 425
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 87 раз
Поблагодарили: 5 раз

Запуск долгой SP

Сообщение ingasoftplus »

Есть у нас Stored Procedure, надо запустить ее из программы на Кларе. Не проблема.

Проблема в том, что SP может долго работать - 5-10-...30 минут. И как быть? Как взаимодействовать с юзером? Сейчас программа как-будто подвисает, пока СП не отработает. Как лучше сделать?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Запуск долгой SP

Сообщение Дед Пахом »

запускать её в отдельном потоке.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Запуск долгой SP

Сообщение kreator »

Если эта Stored Procedure не связана с действиями пользователя, то можно поставить запуск на расписание самими серваком, или чем-то другим. А если связана, то нужно отображать ход процесса, иначе плохо. Отдельный поток может не прокатить, процесс займёт все ресурсы компа, и всё равно в другом окне программы (в другом потоке) работать не получится.
We are hard at work… for you. :)
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 425
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 87 раз
Поблагодарили: 5 раз

Запуск долгой SP

Сообщение ingasoftplus »

связана! нужно отображать ход процесса - хотя СП никакого фидбека не дает, пока не закончит работать. Что показывать юзеру чтоб он не волновался???
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

Запуск долгой SP

Сообщение Aragorn »

Можно использовать асинхронное выполнение процедуры, а на время работы прогресс бар запустить с бесконечным циклом (т.е. как 100% набежит, так в обратку с шагом -1 до нуля, и т.д.
А можно гифку показывать :idied: :cat:
-------------------------------
В истинном золоте блеска нет...
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 425
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 87 раз
Поблагодарили: 5 раз

Запуск долгой SP

Сообщение ingasoftplus »

идея хорошая. но как узнать, что процедура еще работает или уже отработала?

file{prop:sql} = 'exec SP....'

и что дальше? можно конкретики? код, например, :shock:
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

Запуск долгой SP

Сообщение Aragorn »

А если

Код: Выделить всё

 
Comm &cCommand
dumm &cCWAdo
Hr HResult
Cmd String(255)

Comm &= new(cCommand)
Cmd = 'exec dbo.pr_Proc'
Comm.SetConnection(Conn1)
Hr = Comm.Init()
Hr = Comm.putcommand( Cmd)
dumm &= Comm._execute(, Hr)
if Hr != s_ok then dumm.showerror(Cmd) end
 
пардон писал с мобильника спля одним глазом и на память. Явно что-то наврал и ошибся, но гдето перед путкоммандом надо выставить свойства executeoptions типа adasyncexecute а как ловить окончание пока не знаю. все. засыпаю...
-------------------------------
В истинном золоте блеска нет...
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Запуск долгой SP

Сообщение kreator »

ingasoftplus писал(а):идея хорошая. но как узнать, что процедура еще работает или уже отработала?
Например, вариант такой. Сделать хранимку, которая возвращает что-нибудь. Тогда так:
file{prop:sql} = 'exec SP....'
next(file)
if file.id=1
"выполнено удачно"
else
"выполнено с ошибкой"
end

В таком варианте, я так понимаю, программа будет ждать отработки next и будет как бы висеть. Самый простой вариант - перевести курсор в часы до вызова хранимки. Не простой вариант - заставить хранимку писать промежуточный результат, например, во временную таблицу и считывать в программе.
Посмотри ещё свойство PROP:SQLRowSet, о том же.
We are hard at work… for you. :)
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Запуск долгой SP

Сообщение Shur »

Что если так:
- Основная хр. пр-ра что-нибудь своевременно пишет во вспомогательную таблицу, например шаг, на котором она находится (или количество записей в итоговом датасете).
- Вспомогательная хр.пр-ра читает из этой таблицы текущий шаг и отображает это в окне ползунком или ещё как-нибудь.
- Основная хр. пр-ра запускается асинхронно. Вторая - синхронно по таймеру.
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

Запуск долгой SP

Сообщение Ал »

В основной программе вызвать доп.exe - в которой и запускаем для выполнения хранимки, в доп. пишем лог до и после после отработки - по нему в основной или других можно всегда проверить - ещё работает доп.exe или уже всё сделано. Если вызывать в основной например RUN доп.ехе - то по флагу ожидания можно либо вывесить транспарант "работаю.." перед запуском и ждать пока закончит, или ехать дальше, но проверять периодически что там с логом и сообщить когда доп.exe отработает.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Запуск долгой SP

Сообщение Admin »

В табличку кидаешь @@SPID, @@PROCID и процент выполнения. Параллельно читаешь.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

Запуск долгой SP

Сообщение Aragorn »

Это все хорошо только если в хранимке работать с курсорами - иначе как процент выполнения вычислять? А курсоры есть зло имхо. Чем вам мой вариант не понравился? там есть кстати метод что-то типа cCommand.MsgWait и указывается с какой частотой. А асинхронность указывается в опциях _execute...

Вообще хорошо бы знать, чем эта процедура занимается. Там, глядишь, еще б идеи возникли.
-------------------------------
В истинном золоте блеска нет...
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 425
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 87 раз
Поблагодарили: 5 раз

Запуск долгой SP

Сообщение ingasoftplus »

спасибо всем за советы.
Только со СП - засада. В ней просто

Код: Выделить всё

INSERT  from  (select from table)
и ни каких интервенций тут не получишь - пока не отработает ВСЕ! может быть 1000 записей, а может и 20000...
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

Запуск долгой SP

Сообщение Aragorn »

Да тут просто море вариантов!
Например, сначала в кларик получить число записей исходной таблицы через Select Count, в хранимку добавить два параметра для указания диапазона выборки и в цикле в кларике вызывать эту хранимку с шагом для изменения диапазона. Отображая все это в прогресс баре...

Или вот еще: табличка с одним полем и одной записью Char(1), там нолик. Или с двумя полями, во втором suser_sname (сорри, мсскул :D), для многопользовательской реализации. Когда хранимка отрабатывает (асинхронно!!!), пусть пишет туда единичку. А вызвавший код крутит туда-сюда прогресс, опрашивая содержимое записи таблички иногда. Если хранимка работает асинхронно, код провалится дальше в этот цикл с прогресс баром и вывалится по завершению.

Что мне не нравится во втором способе - надо часто (т.е. чаще чем в первом) дергать сервак запросом к табличке состояния.
-------------------------------
В истинном золоте блеска нет...
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Запуск долгой SP

Сообщение kreator »

ingasoftplus писал(а):спасибо всем за советы.
Только со СП - засада. В ней просто

Код: Выделить всё
INSERT from (select from table)


и ни каких интервенций тут не получишь - пока не отработает ВСЕ! может быть 1000 записей, а может и 20000...
Есть такое понятие, как триггер. В триггер на Insert вставляешь Update какой-нибудь записи какой-нибудь таблицы, а в программе читаешь её. Например, перед Insert вычислить кол-во записей, которое нужно добавить. А в триггере плюсовать добавленные записи. И сравнивать два значения.
Но мне кажется это всё костыли какие-то. Лучше поработать над оптимизацией этого Insert, чтобы запрос происходил быстро, не вызывая у пользователя проблем.
We are hard at work… for you. :)
Ответить