Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
02.04.2010, 11:13
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Добрый день. Хотел бы узнать у опытных коллег рекомендации по разработке функционала следующей производственной задачи (примерный вид целевой страницы приведен на картинке): Есть список процедур, которые нужно выполнить пользователю последовательно, дождавшись выполнения предыдущей. Эти процедуры могут работать минуты или десятки минут, так что они вызываются с использованием APEX_PLSQL_JOB.SUBMIT_PROCESS(); и поэтому ведется лог запуска и завершения задачи. Собственно в связи с этим вопросы: 1) Было бы изящнее список задач держать в таблице и формировать его в изображенном регионе, подтягивая из логов время выполнения задач. Но как правильнее навесить выполнение кода SQL скриптов на кнопки "Выполнить", считав их из поля типа VARCHAR2(4000)? 2) Опробовав технику создания ITEM+BUTTON, не ясно, как их включить в таблицу (изображенную на картинке)? 3) Как правильнее организовать обновление региона с новыми данными статуса задач без перерисовки всей страницы? Представляется, что сабмиты здесь не нужны... т.е. вся работа осуществляется на одной странице. Заранее спасибо. За по-шаговые указания - отдельный респект. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 11:45
|
|||
---|---|---|---|
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
DrunvaloЕсть список процедур, которые нужно выполнить пользователю последовательно, дождавшись выполнения предыдущей. 0. Поясните следующий момент: пользователь самостоятельно запускает очередную процедуру P i после выполнения процедуры P i-1 , или формирует цепочку Код: plaintext
1. Процедуры действительно лучше держать в таблице вида (Айдишник, Имя процедуры, Описание процедуры, PL/SQL-блок). Соответственно, в лог выполнения можно заносить айдишник этой процедуры, период выполнения, результат выполнения, сообщение об ошибке etc. Кроме того, можно создать таблицу для конкретных запусков вида (Айдишник запуска, Айдишник процедуры, Пользователь, Состояние). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 12:15
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
suPPLer, спасибо за оперативность. Список процедур предопределен, конечные пользователи к его формированию отношения не имеют, только могут осуществлять запуск процедур. Полагаю, что Apex представляет отличный интерфейс для организации взаимодействия с конечным пользователем (запуск задач и мониторинг хода расчётов). Поскольку задачи представляют собой большие пакеты, написанные на PL/SQL, то логично и запускать из дружественной среды (Apex, например), так что shell-подход не рассматривали. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 12:33
|
|||
---|---|---|---|
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
DrunvaloПоскольку задачи представляют собой большие пакеты, написанные на PL/SQL, то логично и запускать из дружественной среды (Apex, например), так что shell-подход не рассматривали. Возникло недопонимание. :) Я за то , чтобы решение делалось в БД, потому что задача это позволяет. Меня интересует, как Вашим пользователям удобнее и правильнее работать: 0. Подход "В ручном режиме". Пользователю выдаётся на экран список задач (Ваших процедур) и кнопок "Выполнить". Активна/отображается только кнопка рядом с первой задачей. Пользователь ждёт кнопку, смотрит в потолок. Процедура выполнилась. Отображается результат выполнения, галочки-флажочки и подобное оформление. По результатам выполнения, если ошибок нет, становится активной/видимой кнопка рядом со второй задачей. Если ошибки есть - исправляем. Операция "жмём кнопку-смотрим в потолок" повторяется до успешного выполнения всего набора задач. 1. Подход "Конвеер". Это тот, к которому я привёл аналогию с шеллом в *nix. Пользователю выдаётся список задач и одна кнопка "Выполнить". Пользователь жмёт её и занимается дальше своими делами. Время от времени он может заходить на страницу с текущим выполняющимся списком задач и смотреть промежуточные и конечные результаты. Отчёт со списком задач, например, можно раз в 10 с обновлять без сабмита ($a_report для обычного отчёта / gReport.pull() для интерактивного). Можно создать HTML-регион на странице #0, который выводится при выполняющемся списке задач, в нём создать div для отображения информации о выполнении, и обновлять информацию через JS раз в 10 с. Туда же добавить ссылку / кнопку для перехода к странице с текущим выполняющимся списком задач. Можно ещё всяких вкусностей наворотить... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 13:29
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
suPPLer, В конечном счёте нужны будут оба варианта: 0) "Ручной режим" - для того, чтобы по результатам выполнения каждой задачи просматривать промежуточные производственные отчёты, анализировать данные, если всё хорошо - продолжать дальше; если что-то не так - возможно начинать всё с запуска первой процедуры (она сбрасывает систему в исходное состояние) 1) "Автоматический" - типа большая кнопка: "Запустить все". Поэтому для упрощения возможны два вида страницы, соответственно под эти варианты, или вообще 2 страницы разных (к ним перейдёт пользователь по ссылке в зависимости от выбранного сценария). Хотя есть соображение, чтобы пользователю предоставить возможность пару-тройку задач выполнить "вручную", а последующие - "автоматически", нажать кнопку "Запустит все". Конечно, логика работы программы должна отследить это (по логу, например, или по некой метке, хранимой тоже в какой-нибудь таблице). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 13:56
|
|||
---|---|---|---|
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Drunvalo, по сабжу я уже упомянул, обновляйте отчёты на страницах через JavaScript и функции $a_report / gReport.pull(). Вопросы ещё какие-то есть? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 15:22
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
suPPLer, нюансы, видимо, в деталях... ;-) Т.е. последовательность построения такой страницы видится следующей: 0) создаем таблицу со списком процедур (TBL_PROCEDURES), таблицу логов работы процедур (TBL_LOGS); 1) создаём пустую страницу; 2) создаём регион (Report) где указываем SELECT, объединяющий таблицу со списком процедур и таблицу логов (TBL_PROCEDURES+TBL_LOGS); 3) добавляем колонки с кнопками "Выполнить", вытаскиваем SQL-код (из поля таблицы TBL_PROCEDURES) и приворачиваем к этим кнопкам (как? здесь, видимо, не хватает ещё практических навыков у меня); 4) навешиваем функционал обновления этого региона вручную или автоматически по механизму, описанному на "http://apex.oracle.com/pls/otn/f?p=11933:40" или по механизму, приводимому вами: "...JavaScript и функции $a_report..." (надо будет посмотреть эту фичу...). - что-то типа такого? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 15:47
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Одно из возможных решений для ручного запуска: в выборке отчёта добавляете элемент-кнопку, например: Код: plaintext 1.
Javascript функция doIt(procid) устанавливает значение какого-нибудь скрытого элемента P_PROC_ID равным ID вашей процедуры, затем делает doSubmit с определённым запросом. Процедура, которая отрабатывает по этому запросу, запускает job c процедурой, в которой использован execute immediate + код вашей процедуры, извлечённый по значению P_PROC_ID из blob. Как-то так, если не использовать AJAX. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 16:22
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
non-apexoidОдно из возможных решений для ручного запуска: в выборке отчёта добавляете элемент-кнопку, например: Код: plaintext 1.
Javascript функция doIt(procid) устанавливает значение какого-нибудь скрытого элемента P_PROC_ID равным ID вашей процедуры, затем делает doSubmit с определённым запросом. Процедура, которая отрабатывает по этому запросу, запускает job c процедурой, в которой использован execute immediate + код вашей процедуры, извлечённый по значению P_PROC_ID из blob. ... На этот SELECT Apex выдаёт: "...failed to parse SQL query: ORA-00972: слишком длинный идентификатор...". Может синтаксис не верен... Чуть подробнее этот момент, плз. Или если можно, ссылку на пример какой-либо... Я предполагаю, записывать в поле таблицы TBL_PROCEDURES описания типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 16:57
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Да, забыл про алиас. После '< .... >' нужно добавить алиас. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 17:06
|
|||
---|---|---|---|
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Drunvalo, в качестве примера, как делать из столбцов в отчёте что-нибудь посложнее, RTFBlog Roels Blog - Handling information overload: Showing data on demand in an IR , там столбец превращается в картинки, при наведении на которые показывается div подробной информацией. Вам понадобится столбец превратить в кнопки / ссылки (тут и Column Attributes->Link подойдёт) / картинки, по клику на которые будут запускаться процедуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 17:20
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
non-apexoid ...Javascript функция doIt(procid) устанавливает значение какого-нибудь скрытого элемента P_PROC_ID равным ID вашей процедуры, затем делает doSubmit с определённым запросом. Процедура, которая отрабатывает по этому запросу, запускает job c процедурой, в которой использован execute immediate + код вашей процедуры, извлечённый по значению P_PROC_ID из blob... . Если не затруднит, по-шагово прокомментируете? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 17:22
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
suPPLerDrunvalo, ...RTFBlog Roels Blog - Handling information overload: Showing data on demand in an IR , там столбец превращается ... в кнопки / ссылки (тут и Column Attributes->Link подойдёт) / картинки, по клику на которые будут запускаться процедуры. Спасибо за ссылку. Будем изучать матчасть... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 17:31
|
|||
---|---|---|---|
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
non-apexoidПроцедура, которая отрабатывает по этому запросу, запускает job c процедурой, в которой использован execute immediate + код вашей процедуры, извлечённый по значению P_PROC_ID из blob . Два небольших замечания: из CLOB и начиная с 11g. DrunvaloЕсли не затруднит, по-шагово прокомментируете? Вам, КМК, больше подойдёт вызов процесса приложения через AJAX и htmldb_Get. Только первым делом запускаемая процедура должна где-нибудь отмечать, что в наборе уже есть выполняемая задача, и последним - снимать пометку. А запрос, формирующий список задач для отчёта, эту пометку должен учитывать и вместо ссылок / картинок / кнопок выдавать что-нибудь некликабельное у всех процедур, кроме той, что выполняется. У выполняющейся может выводить анимированный gif вроде такого... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.04.2010, 22:25
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
И действительно, при таком подходе никакой blob/clob не нужен. Итак: 1. процедуры можно держать в varchar; 2. использование htmldb_Get красиво, но как быстрое и лёгкое в отладке решение пойдёт и предложенный мной вариант; 3. А вот обновление отчёта со списком задач лучше сразу сделать через $a_report по таймеру. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 00:01
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
suPPLernon-apexoidПроцедура, которая отрабатывает по этому запросу, запускает job c процедурой, в которой использован execute immediate + код вашей процедуры, извлечённый по значению P_PROC_ID из blob . Два небольших замечания: из CLOB и начиная с 11g. DrunvaloЕсли не затруднит, по-шагово прокомментируете? Вам, КМК, больше подойдёт вызов процесса приложения через AJAX и htmldb_Get. Только первым делом запускаемая процедура должна где-нибудь отмечать, что в наборе уже есть выполняемая задача, и последним - снимать пометку. А запрос, формирующий список задач для отчёта, эту пометку должен учитывать и вместо ссылок / картинок / кнопок выдавать что-нибудь некликабельное у всех процедур, кроме той, что выполняется. У выполняющейся может выводить анимированный gif вроде такого... Был не в сети... В продолжении темы, коллеги, не сочтите за назойливость (в учебных целях и многим моим коллегам по работе будет интересно, осваивающим Apex). По реализации подробнее бы хотелось услышать. (Кстати, среда Oracle 10.2). Я остановился на этапе вывода отчета, как на картинке показано. В hidden поле имеется для каждой строки считанная текстовка SQL-процедур (VARCHAR2(4000)) и в еще одном hidden procedure_id (нужен ли? ведь текст уже считан...). В заголовке страницы добавляем типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Собственно, далее что делаем? Как это в динамике с процессами и doSubmit увязываем? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 09:41
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Ну очень кратце. Действительно, есть 2 подхода: с асинхронным обменом с использованием htmldb_Get (ну или jApex, с этим не знаком) +pl/sql процедура уровня приложения и 2-й путь - всё-таки с сабмитом и выполнением процедуры уровня страницы. Пару слов о втором способе. Вообще, сам текст процедуры именно в отчёте вам не нужен совсем, так просто вы его _не_выполните_. Итак, doSubmit('REQUEST'). При этом по условию этого запроса у вас должна сработать процедура уровня страницы, в которой и будет выполнена уже ваша процедура. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 11:11
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
non-apexoid...Пару слов о втором способе. Вообще, сам текст процедуры именно в отчёте вам не нужен совсем, так просто вы его _не_выполните_. Итак, doSubmit('REQUEST'). При этом по условию этого запроса у вас должна сработать процедура уровня страницы, в которой и будет выполнена уже ваша процедура. Итак, 1) создаём процесс: Application xxx>Page xxx>Create Page Process Выбираем тип: "PL/SQL" Point: "On Submit - After Computations and Validations" Enter PL/SQL Page Process: "..." - вот тут мы должны изобрести некую оболочечную процедуру, которая по передаваемому параметру найдет текст выполнения соответствующей задачи в таблице TBL_PROCEDURES и запустит его... Так? Кстати, из какой переменной считать этот параметр procedure_id? 2) А сейчас как привязать нажатие какой-либо кнопки с вызовом этой процедуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 11:45
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Drunvalo, 1. В отчёте делаем поле '<input type="button" value="Выполнить" onClick="doIt('||procedure_id||')>" - т.е. при нажатии кнопки должен отработать javascript:doIt(ID_ПРОЦЕДУРЫ) 2. Сам скрипт должен запомнить значение ID процедуры в скрытом элементе P1_PROC_ID и сделать submit с определенным запросом, например, 'DOIT': Код: plaintext 1. 2. 3. 4.
4. В этой процедуре по ID выбираем текст процедуры в строку и т.д. Пара замечаний: -действительно, можно работать и не с ID, а с текстом процедуры - а лучше, хранить не текст процедуры-обёртки, а наименование вызываемой внутри неё процедуры и описание параметров, обёртку формировать динамически, так универсальнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 12:31
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Да, всё-таки ID процедуры, в противном случае получится такая дырища для sql injection ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 13:08
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
non-apexoid 2. Сам скрипт должен запомнить значение ID процедуры в скрытом элементе P1_PROC_ID и сделать submit с определенным запросом, например, 'DOIT': Код: plaintext 1. 2. 3. 4.
4. В этой процедуре по ID выбираем текст процедуры в строку и т.д. Хорошо, уточните, плз, - по пункту 2) P1_PROC_ID - эту вещь нужно завести как отдельный ITEM на странице (в регионе)? - по пункту 4): а) Создаём процедуру-оболочку (для вызова собственно задач, примерный вид которых был выше приведен...) в Edit Page Process>Source: "MY_PACKAGE.Main(:P1_PROC_ID);" б) Её примерный текст: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 13:37
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
1. Да, P1_PROC_ID -скрытое поле с сохранением session state 2. С процедурой не понял. Создаем процедуру уровня страницы с срабатыванием по условию, как писал выше. А вот аргументы как вы нарисовали ей не передать. Примерный каркас, если хранить текст процедуры- оболочки в БД: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2010, 15:45
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
non-apexoid 2. С процедурой не понял. Создаем процедуру уровня страницы с срабатыванием по условию, как писал выше. А вот аргументы как вы нарисовали ей не передать. Примерный каркас, если хранить текст процедуры- оболочки в БД: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Так вот эта "общая" процедура-оболочка считывает SQL-код (из таблицы) для каждой из задач и динамически его запускает: Код: plaintext 1. 2. 3. 4. 5. 6.
В целом, пристрелка прошла удачно, общий сценарий работает (правда пока по сценарию перерисовки страницы, перерисовка только региона - отложим пока на потом), пару процедур уже отладил, далее шлифовка... Была мысль всё это расписать по шагам, с картинками и выложить где-то... Всё-таки как не хватает учебника (русскоязычного лучше), типа: "Apex: Советы бывалых" или подобного ;-). Спасибо всем за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.07.2010, 11:43
|
|||
---|---|---|---|
|
|||
Последовательность запуска процедур без перерисовки всей страницы |
|||
#18+
Вернулся к задаче и обнаружил, что вызов процесса уровня страницы, вызываемый DoSubmit('DOIT') ("On Submit - After Computations and Validations" c Condition Type=request=Expresion1, в Expression1 пишем DOIT) отрабатывает из JavaScript чётко ($x('P_PROC_ID').value - присваивается нормально), но вот параметр P1_PROC_ID этот процесс не видит (значение его 0). Код: plaintext 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Перетряс настройки страницы - не помогает. (P1_PROC_ID - скрытое поле, "Source Used": "Always, replacing any existing value in session state", "Source Type": "Always null") Что ещё проверить? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=50&mobile=1&tid=1876884]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 190ms |
0 / 0 |