powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выбор определенных записей в блоке данных (Forms 6)
25 сообщений из 32, страница 1 из 2
Выбор определенных записей в блоке данных (Forms 6)
    #32146750
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот встала такая задача:
В форме есть блок данных - ACC_BLOCK, в нем есть столбец с данными запроса
ACCOUNTS, есть также CheckBox - ACC_CHECKBOX. Стоит задача выбрать для дальнейшей обработки определенные строки из ACCOUNTS - помечая соответсвенные позиции ACC_CHECKBOX. По виду что-то типа этого:
________
________V
________
________V

Не подскажите в каких триггерах или не триггерах, что делать
для выбора необходимых строк? Скажем нажимаю на кнопку "Обработать" -
и как получить какие элементы помечены какие нет? Простенький примерчик плиз :-).
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146768
Sto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sto
Гость
Можно примерно так:
(триггер на кнопке "Обработать")

-- идем по всем строкам
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 хранится число записей, выбранных по запросу в блоке (я обычно это считаю с помощь "подсчета предварительных итогов")
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146798
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ. Но в предложенном Вами способе есть один неприятный момент - если в запросе слишком много строк, а пользователь отметил лишь малую их часть - то придется фетчить из базы весь результат запроса, что может занять много времени и ресурсов. Я лучше буду создавать список помеченых счетов в тригере CheckBoxChange (или что-то типа того). Но все равно спасибо.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146810
Sto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sto
Гость
Да, это точно, есть такой недостаток :-(
Меня спасает лишь то, что пока не попадали большие выборки...
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146852
Александр Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю так.
Создаю 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;
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146864
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот этот способ уже дя меня лучше.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146878
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если использовать GLOBAL TEMORARY TABLE . То какие привилегии пользователю надо дать для возможности этой операции? ( и хорошо ли это)

А есть счетов 5000-10000 их тоже все во временную таблицу перегонять?
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146882
Александр Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем на клиенте столько записей. Отбирай только нужные.
А привилегии такие же, как и для обычных таблиц.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146886
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е надо пользователю давать права на создания таблиц?
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146946
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
парни! Я скомпилировал из предложенных вами способов свой. Он заключается в следующем.

В формке создается пакет, в котором явно описывается таблица 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 извлекаю
помеченные счета.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146969
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты явно раньше на Кларионе писал :-))). Правда все кларионщики так мыслят. Создать таблицу и записи туда складывать. Хреновый это подход. Ошибок только плодит.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32146976
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты лучше скажи зачем ты счета метишь. Так легче понят и сказать.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147017
Александр Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Никола
Почитай доки про GLOBAL TEMPORARY TABLE, потом поговорим
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147078
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Александр Б.

Скачал ты значит данные 5000 во временную таблицу (а может и сегмента отката не хватило все рухнуло). Бох бы с ним. Работаешь в своей форме с ними. Нажимаешь конопку обработать. А бац а запись-то уже удалили. Вот аказия )).

( счет -то тоже удалить могут. Создаили по ошибке например. Проводок по нему не было. значит и удалит можно)
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147090
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Александр Б.

А с 10 рабочих мест вызвали твою форму . Ты 10*5000 записей создавать будешь?
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147105
Александр Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Никола
У меня клиенты не работают с 5000 записями :)
Ты вообще представляешь, что такое GLOBAL TEMPORARY TABLE ?
Такое впечатление, что первый раз слышишь об этом.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147135
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Александр Б.

--
> У меня клиенты не работают с 5000 записями :) .

Так и говори, что у тебя системка маленькая. В ней записей мало.

А лучше скажи как быть если их 5000-100000.
--
А если при обработке отмеченной записи должны поменяться ее атрибуды.( например поле статус или дата закрытия) . Ты потом все записи на экране изменять будешь?
--

Да с временными таблицами я не работал.

Но ты скажи лучше не про это .
А просто ответь на каждый пункт.
( и про вопрос с удаленными в предудущий раз тоже ответь)
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147261
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй организовать бва блока.
Первый - не связан с БД; только для индикации результатов (тех, что посмотрели/пометили)
Второй - скрытый; связан с БД.
Синхронизация - триггерами (следующая/предыдущая запись).
И гуляй по первому блоку...
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147291
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет Никола, на кларионе я раньше не писал, и мыслить я стараюсь как программер на С++ (потому как стараюсь писать все на нем), только вот на данный конкретный момент пишу формы для Oracle.
И какими же такими ошибками череват предложенный мной метод? По моему он самый простой из всех (исключая самый первый с полным перебором записей).
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147295
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147323
Фотография Serenada
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать такой прием.
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
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147457
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 записей. Подходы к построению форм в разных случаях разные.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147527
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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..".
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147603
Никола
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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..".

Если он отметил то уже их профетчили на клиента.
...
Рейтинг: 0 / 0
Выбор определенных записей в блоке данных (Forms 6)
    #32147626
Александр Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Никола

Я не говорил, что предложенное мной решение универсально. Все зависит от задачи.
IMHO, в предложенной в топике задаче не может быть очень много записей, иначе как бы ты стал отмечать записи среди 5000 :=)).
Я использую предложенное мной решение во многих формах и очень доволен (юзера тоже).
Ну а не нравится, не ешь
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выбор определенных записей в блоке данных (Forms 6)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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