|
|
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Вот встала такая задача: В форме есть блок данных - ACC_BLOCK, в нем есть столбец с данными запроса ACCOUNTS, есть также CheckBox - ACC_CHECKBOX. Стоит задача выбрать для дальнейшей обработки определенные строки из ACCOUNTS - помечая соответсвенные позиции ACC_CHECKBOX. По виду что-то типа этого: ________ ________V ________ ________V Не подскажите в каких триггерах или не триггерах, что делать для выбора необходимых строк? Скажем нажимаю на кнопку "Обработать" - и как получить какие элементы помечены какие нет? Простенький примерчик плиз :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 14:21 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Можно примерно так: (триггер на кнопке "Обработать") -- идем по всем строкам GO_BLOCK('ACCOUNTS'); first_record; -- на первую while get_block_property('ACCOUNTS',Current_Record) <= :b_itg.cnt_pch loop if :ACCOUNTS.ACC_CHECKBOX!=0 then выполняем какие-то действия end if; next_record; end loop; При этом у эл-та :ACCOUNTS.ACC_CHECKBOX стоят св-ва: значение при выборе 1, при отмене выбора - 0 В переменной :b_itg.cnt_pch хранится число записей, выбранных по запросу в блоке (я обычно это считаю с помощь "подсчета предварительных итогов") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 14:31 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Но в предложенном Вами способе есть один неприятный момент - если в запросе слишком много строк, а пользователь отметил лишь малую их часть - то придется фетчить из базы весь результат запроса, что может занять много времени и ресурсов. Я лучше буду создавать список помеченых счетов в тригере CheckBoxChange (или что-то типа того). Но все равно спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 14:55 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Да, это точно, есть такой недостаток :-( Меня спасает лишь то, что пока не попадали большие выборки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 15:05 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Я делаю так. Создаю GLOBAL TEMORARY TABLE с необходимыми столбцами из исходной таблицы + поле REQUIRED типа VARCHAR2(1). В триггере WHEN_NEW_FORM_INSTANCE заполняю временную таблицу данными из исходной + поле REQUIRED значением 'N' или 'Y' в зависимости от логики. Создаю блок данных на временной таблице, причем поле REQUIRED отображаю как CheckBox. В триггере WHEN_BUTTON_PRESSED кнопки "Обработать" пишу declare cursor c is select * from <имя_временной_таблицы> where required = 'Y'; begin for rec in c loop ... end loop; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 15:46 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
А вот этот способ уже дя меня лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 15:56 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Если использовать GLOBAL TEMORARY TABLE . То какие привилегии пользователю надо дать для возможности этой операции? ( и хорошо ли это) А есть счетов 5000-10000 их тоже все во временную таблицу перегонять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 16:10 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
А зачем на клиенте столько записей. Отбирай только нужные. А привилегии такие же, как и для обычных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 16:15 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
т.е надо пользователю давать права на создания таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 16:24 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
парни! Я скомпилировал из предложенных вами способов свой. Он заключается в следующем. В формке создается пакет, в котором явно описывается таблица PL/SQL (ассоциативный масив если угодно) с именем SELECTED_ACC_TABLE. Когда срабатывает триггер WHEN_CHECK_BOX_CHANGED я пишу буквально следеующе: SELECTED_ACC_TABLE(get_block_property('CLIENT_ACC',Current_Record)) := :ACC_BLOCK.ACCOUNTS; (здесь показана обработка если состояние check_box = 1) А после нажатия кнопки срабатывает WHEN_BUTTON_PRESSED, где я спокойно с помощью операций FIRST, LAST, NEXT извлекаю помеченные счета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 17:07 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Ты явно раньше на Кларионе писал :-))). Правда все кларионщики так мыслят. Создать таблицу и записи туда складывать. Хреновый это подход. Ошибок только плодит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 17:20 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Ты лучше скажи зачем ты счета метишь. Так легче понят и сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 17:23 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2Никола Почитай доки про GLOBAL TEMPORARY TABLE, потом поговорим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 17:49 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2 Александр Б. Скачал ты значит данные 5000 во временную таблицу (а может и сегмента отката не хватило все рухнуло). Бох бы с ним. Работаешь в своей форме с ними. Нажимаешь конопку обработать. А бац а запись-то уже удалили. Вот аказия )). ( счет -то тоже удалить могут. Создаили по ошибке например. Проводок по нему не было. значит и удалит можно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 18:30 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2 Александр Б. А с 10 рабочих мест вызвали твою форму . Ты 10*5000 записей создавать будешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 18:39 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2Никола У меня клиенты не работают с 5000 записями :) Ты вообще представляешь, что такое GLOBAL TEMPORARY TABLE ? Такое впечатление, что первый раз слышишь об этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 18:48 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2 Александр Б. -- > У меня клиенты не работают с 5000 записями :) . Так и говори, что у тебя системка маленькая. В ней записей мало. А лучше скажи как быть если их 5000-100000. -- А если при обработке отмеченной записи должны поменяться ее атрибуды.( например поле статус или дата закрытия) . Ты потом все записи на экране изменять будешь? -- Да с временными таблицами я не работал. Но ты скажи лучше не про это . А просто ответь на каждый пункт. ( и про вопрос с удаленными в предудущий раз тоже ответь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2003, 19:11 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Попробуй организовать бва блока. Первый - не связан с БД; только для индикации результатов (тех, что посмотрели/пометили) Второй - скрытый; связан с БД. Синхронизация - триггерами (следующая/предыдущая запись). И гуляй по первому блоку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 06:14 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Нет Никола, на кларионе я раньше не писал, и мыслить я стараюсь как программер на С++ (потому как стараюсь писать все на нем), только вот на данный конкретный момент пишу формы для Oracle. И какими же такими ошибками череват предложенный мной метод? По моему он самый простой из всех (исключая самый первый с полным перебором записей). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 08:22 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Tak eto i est' v prinzipe, "GLOBAL TEMORARY TABLE ". Tol'ko ona u tebya odna na form, t.e. one-to-one, a "GLOBAL TEMORARY TABLE " one-to-many. "GLOBAL TEMORARY TABLE" ogranichivaetsya po bol'shomy schety, razmerami temporary tablespace. 5 - 10 mln rows per session - ne problema. Glavnoe, indexirui pravil'no columns. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 08:31 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Можно попробовать такой прием. 1.Строим дерево без ""веток и листьев" и разрешаем ему многострочную выборку. 2.Делаем кнопку и в триггере WHEN-BUTTON-PRESSED вызываем ---- PROCEDURE имя IS htree ITEM; node FTREE.NODE; num_selected number; current_node FTREE.NODE; val varchar2(3000) := null; pl_id ParamList; BEGIN SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'BUSY'); htree := Find_Item('tree_men.tree_men'); node := Ftree.GET_TREE_SELECTION('tree_men.tree_men',1); num_selected := Ftree.Get_Tree_Property(htree, Ftree.SELECTION_COUNT); if num_selected > 0 then FOR i IN 1..num_selected LOOP current_node := Ftree.Get_Tree_Selection(htree, i); if i=1 then val := '''(' || ltrim(rtrim(Ftree.Get_Tree_Node_Property( htree,current_node,Ftree.NODE_VALUE))); else val := val || ',' || ltrim(rtrim(Ftree.Get_Tree_Node_Property( htree,current_node,Ftree.NODE_VALUE))); end if; END LOOP; val := val || ')'''; SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'default'); END; --- процедура запоминает выбранные id в список {1,n} Выбор осуществляется мышкой и SHIFT или CTRL,как в Wind ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 09:01 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2 Oracle X-pert ты считаешь нормальным при подъеме формы переливать по 5000-100000 строк из одной таблицы в другую (или я что-то не понял)? 2 chp. Если ты пишешь на C++. Тогда все понятно. Подход Oracle Form сильно отличаеться от других. Самый простой способ следующий 1 способ) Если это твоя таблица. То добавляешь в нее поле MARK_Flag или еще какое-то EVENT. Строишь блок форме та таблице ACCOUNTS . Пользователь отмечает твои записи жмет F10. Ты в триггере на таблице делаешь необходимые действия. Если это таблица не твоя, то ты добавить поле в общем случае не можешь. Т.к если в формах могут используються процедуры?/функции параметры у которых типы основанные на таблицах, то они отваляться (в формах конечно такие функции лучше не использовать). 2 способ) Можно при клике/отметки записи в блоке менять ее статус с QUERY на CHANGED и обработку писать в триггере блока PRE-UPDATE. Когда пользователь выделил запись. Статус ее поменялся на CHANGED. Он навыделял несколько записей. Нажал Key-commit(F10) записи стали обновляться. В триггере PRE-UPDATE выполнились необходимые действия. В любом из этих случае все работу по commit/rollback и блокировкам записей берет на себя Формс. И если у тебя что-то меняеться со счетом (его состояние (ОТКРЫТ, ЗАКРЫТ ) т.е какие-то поля счета, то Форс их перечитает автоматически ( если тебе надо) Второй способ хуже. -- Совсем правильно - это сначала рассказать какую операцию ты собираешься выполнять над счетом. Тогда возможно есть и другие варианты. Потому что одно дело когда он поднял форму и выбелил 3-4 записи. Другое дело, когда ему надо отобрать 2000 записей. Подходы к построению форм в разных случаях разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 10:47 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
Konechno, ne sovsem, t.k. eto trebyet dostatochno moshnyh resources. Vse upiraetsya, v konechnom chete v postanovku zadachi:: Pri bol'shih nagruzkah na DB ( dopustim, prodaga biletov na air ) - eto opravdanno, Pri ogranicheniyah na LAN / Session - toge, takge recommended pri JDBC/ODBC client. 2 Nikola:: Ty predlagaesh vsu obrabotky vesti na clent side, t.e. dostatochno ser'eznye trebovaniya k client's hard, pregde vsego, RAM. A cho do "если в запросе слишком много строк, а пользователь отметил лишь малую их часть - то придется фетчить из базы весь результат запроса" - realizui option "select ... minus select..". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 11:33 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2 Oracle X-pert. <Konechno, ne sovsem, t.k. eto trebyet dostatochno moshnyh resources. Вот вот. Потом все тормозить начнет. И ими придеться скзать. Ребята- купите ссервер себе за кучу денег и тогда даже при 50-100 конектах работать сможете нормально :-) <Vse upiraetsya, v konechnom chete v postanovku zadachi:: Тут согласен Ничего не понял. Если значси <2 Nikola:: Ty predlagaesh vsu obrabotky vesti na clent side, t.e. dostatochno >ser'eznye trebovaniya k client's hard, pregde vsego, RAM. Я предлогаю в Pre- вызывать серверные процедуры. >A cho do "если в запросе слишком много строк, а пользователь отметил лишь >малую их часть - то придется фетчить из базы весь результат запроса" - >realizui option "select ... minus select..". Если он отметил то уже их профетчили на клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 12:16 |
|
||
|
Выбор определенных записей в блоке данных (Forms 6)
|
|||
|---|---|---|---|
|
#18+
2 Никола Я не говорил, что предложенное мной решение универсально. Все зависит от задачи. IMHO, в предложенной в топике задаче не может быть очень много записей, иначе как бы ты стал отмечать записи среди 5000 :=)). Я использую предложенное мной решение во многих формах и очень доволен (юзера тоже). Ну а не нравится, не ешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2003, 12:31 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=2785&tid=1990838]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
22ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 404ms |

| 0 / 0 |
