Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизDBGrid Найти похожие ветки
← →
Svin (2003-11-20 08:54) [0]Как выбрать все записи в DBGrid
DBGrid связана с DataSource
← →
Zacho (2003-11-20 09:07) [1]В каком смысле выбрать ? Если отметить - то так:
DBGrid.DataSource.DataSet.First;
while not DBGrid.DataSource.DataSet.Eof do
begin
TDBGrid.SelectedRows.CurrentRowSelected:=true;
DBGrid.DataSource.DataSet.Next;
end;
← →
don-do (2003-11-20 09:19) [2]>>Zacho © (20.11.03 09:07) [1]
В этом случае будет использовано много памяти, особенно если таблица большая, лучше использовать переменную, например
Tform1.AllSelected
И самому окрашивать записи.
Правда получать список нужно в этом случае самому, по нужде, а не позволять пользователю играть со свапом.
← →
Zacho (2003-11-20 09:28) [3]
> don-do © (20.11.03 09:19) [2]
А толку их просто окрашивать ? Посмотри, что такое TBookmarkList. И выбирать тысячи записей для отображения в гриде - моветон и издевательство над пользователем.
← →
Svin (2003-11-20 09:32) [4]2Zacho
А без пробега по DBGrid никак нельзя?
← →
Johnmen (2003-11-20 09:39) [5]А смысл ?
← →
Zacho (2003-11-20 09:40) [6]
> Svin (20.11.03 09:32) [4]
Разве что, действительно, окрашиванием записей вручную. Но смысл ?
И пробег не по DBGrid, а по подключенному к нему DataSet"у. Разница принципиальная.
← →
Svin (2003-11-20 09:42) [7]Да это понятно, что по DataSet, только ведь долго это, если у меня там 600000 записей, взбесишься...
← →
ЮЮ (2003-11-20 09:47) [8]>если у меня там 600 000 записей
А ты хочешь, чтобы пользователь "выбрав все" затем по одной снимал выделение с 599 000 записей? Что ты вообще хочешь добиться с помощью выделения?
← →
Johnmen (2003-11-20 09:47) [9]>Svin
А смысл ?
← →
mtihonov (2003-11-20 09:50) [10]Просто реплика!
Ну когда-же Вы, народ уйдете от DBFского мышления.
Есть SQL язык! Выбери что надо в запросе и делай все что надо с этой группой записей. Какой, извините идиот, будет просматривать в DBGrid с 600000 записей, вылавливать и отмечать нужные...
← →
Danilka (2003-11-20 09:51) [11][7] Svin (20.11.03 09:42)
а нафига ему столько? сколько рабочих месяцав понадобится, чтобы их все только просмотрть?
← →
Svin (2003-11-20 09:52) [12]А если надо все, а пару не надо? :-(
← →
Наталия (2003-11-20 09:58) [13]>Svin (20.11.03 09:52) [12]
>А если надо все, а пару не надо? :-(
"Не верю!" (с) Станиславский
Данные какого рода необходимо отобразить пользователю?
← →
Svin (2003-11-20 10:01) [14]Телефоны
← →
Danilka (2003-11-20 10:03) [15]если он не псих, то ему столько не надо.
← →
Danilka (2003-11-20 10:03) [16]что он с таким кол-вом будет делать?
← →
Наталия (2003-11-20 10:04) [17]И что пользователь будет делать с 600 000 телефонов? Просматривать их список на экране? Наверняка можно показывать не весь список этих телефонов, а выбирать их по какому-нибудь условию?
← →
Svin (2003-11-20 10:07) [18]Нельзя... это программа-интерфейс для обновления базы данных по абонентам... если не нужно добавлять пару телефонов, а остальные добавить... и вообще вопрос не в этом, а в том, можно ли выбрать все сразу...?
← →
Sergey13 (2003-11-20 10:09) [19]2Наталия © (20.11.03 10:04) [17]
>И что пользователь будет делать с 600 000 телефонов?
Звонить всем подряд. 8-)
← →
Наталия (2003-11-20 10:10) [20]это программа-интерфейс для обновления базы данных по абонентам... если не нужно добавлять пару телефонов, а остальные добавить...
Вот с этого места поподробнее... Зачем для обновления БД показывать её в Grid?
← →
Zacho (2003-11-20 10:11) [21]
> Svin (20.11.03 10:07) [18]
Не делаются так интерфейсы. По крайней мере нормальные. Во-первых, можно сделать наоборот - отмечать ненужные записи, а во-вторых - такое кол-во записей в наборе данных все равно не нужно, да просто не сможет нормальный человек с таким нормально работать. Обычно делаются всяческие многоуровневые классификаторы, фильтры и т.п. Ведь все равно пользователь отбирает эти телефоны по каким-то критериям.
← →
Svin (2003-11-20 10:20) [22]Да нет тут критериев, тут они чисто визуальные, это для администратора Call-Center"а.. ну не буду же я вам щас рассказывать полностью задачу, да и не могу... нельзя... вообщем пойду по пути №1
← →
Danilka (2003-11-20 10:25) [23]бедные админы калл-центра. Svin надеюсь, тебя ждет легкая смерть, сразу задушат, без пыток.
а если серьезно, то с таким подходом, в лучем случае они промучаются недолго и закажут где-нибудь в другом месте решение задачи, а тебя выгонят.
В худшем для них случае - они будут мучиться долго, пока где-нибудь не увидят человечью альтернативу. Результат, правда, для тебя все равно будет одинаковым.
← →
Zacho (2003-11-20 10:29) [24]
> Svin (20.11.03 10:20) [22]
Не верю. Не бывает так, что бы критериев не было. Ни разу в жизни не видел, ни для какой задачи. Бывает, конечно, что просто надо выбрать записи по какому-то уникальному идентификатору и т.п., но для этого вовсе не нужно показывать всю таблицу в гриде, такие задачи по другому решаются.
← →
Svin (2003-11-20 10:32) [25]Блин, ну прям гении все.. SQL ипользуй и т.д., а то я его совсем не использую, пользуюсь примитивным select * from Table1... :-) при воможностях-то Transact SQL :-)
Нет, чтобы подсказать, начинают спрашивать фигню всякую и хамят...
>а если серьезно, то с таким подходом, в лучем случае они промучаются недолго и закажут где-нибудь в другом месте решение задачи, а тебя выгонят.
То-то я дурак такой.. столько лет тут работаю.. :-(
← →
Zacho (2003-11-20 10:39) [26]
> Svin (20.11.03 10:32) [25]
Да при чем тут гении - не гении ? Ты вот сам попробуй визуально найти нужную запись из 600000. Сколько дней на это уйдет ? Лично у меня такая программа сразу же в Recycled Bin оказалась бы.
И что подсказывать ?
Ну вот, например, решение: возьми TDBGridEh, там можно выделить/снять выделение со всех записей одним щелчком мышки. А толку ?
← →
Svin (2003-11-20 10:50) [27]Говорю же надо.. несколько человек обсуждали, все инженеры.. не найден нами другой способ решения.. нашли бы, я и спрашивать не стал.. все вообщем... извините, сорвался..
← →
Danilka (2003-11-20 10:57) [28]>если не нужно добавлять пару телефонов, а остальные добавить
почему-бы просто не вывести стринг-лист, куда-бы они ручками забили эту пару телефонов?
зачем тащить все на клиента и вываливать в грид, когда нужна только пара телефонов?
← →
Кулюкин Олег (2003-11-20 10:59) [29]2 Svin
Ну если уж они уперлись и хотят заставить человека отсматривать 600000 записей, разбейте набор данных на маленткие группы (записей по 1000-2000 :)
Пускай частями заливают.
+ добавьте кнопку "Залить все".
← →
Zacho (2003-11-20 11:08) [30]
> Danilka © (20.11.03 10:57) [28]
Был у меня эпизод, когда директор долго и настойчиво убеждал меня, что просто необходимо видеть всю номенклатуру товаров в гриде. В конце концов оказалось, что просто он имел в виду, что нужен поиск по штрих-коду по всей номенклатуре. И добавление найденого товара в накладную. Естественно, для этого грид вообще не нужен. :)
Может и в этом случае что-то аналогичное ?
← →
Sergey13 (2003-11-20 11:10) [31]2Svin (20.11.03 10:20) [22]
>ну не буду же я вам щас рассказывать полностью задачу, да и не могу...
При таких условиях, чего ты хочешь. Мы же твоих условий не знаем.
>нельзя...
Военная тайна? 8-)
>вообщем пойду по пути №1
А мы пойдем другим путем. (с) В.И.Ульянов (Ленин) 8-)
← →
Danilka (2003-11-20 11:12) [32][30] Zacho © (20.11.03 11:08)
:))
наверняка, что-то подобное. наверняка список пары телефонов которые не надо обновлять уже где-то есть, не только у оператора в голове.
← →
Svin (2003-11-20 11:15) [33]Не надо ему все записи просматривать, просто может быть ситуация, когда ему надо только две занести, а если все сразу, то надо сначала их выделить, потому что писать другой код не хочется, хотя придется все-таки...
← →
Danilka (2003-11-20 11:17) [34][33] Svin (20.11.03 11:15)
а нафига грид???
пусть ручками напишет эти две, хоть в мемо-поле, хоть в лист-боксе.
и радиобуттон: "обновить выбранные телефоны"/"обновить все, кроме выбранных телефонов".
← →
Наталия (2003-11-20 11:17) [35]Svin (20.11.03 11:15) [33]
А если ему не нужно их просматривать, зачем их тогда в гриде отображать?
← →
Svin (2003-11-20 11:27) [36]>а нафига грид???
>пусть ручками напишет эти две, хоть в мемо-поле, хоть в лист-боксе.
Хм...
А если он их не знает.. даже без если.. он из НЕ знает..
>А если ему не нужно их просматривать, зачем их тогда в гриде отображать?
диапазон от 1 до 600000... надо отображать..
← →
Danilka (2003-11-20 11:34) [37][36] Svin (20.11.03 11:27)
>он из НЕ знает..
А как тогда он глянув на номер узнает надо его обновлять или нет???
← →
Кулюкин Олег (2003-11-20 11:35) [38]
> А как тогда он глянув на номер узнает надо его обновлять
> или нет???
Вспомнит, что залил его вчера :))
2 Svin
600000 это максимум или обычное рабочее число?
← →
Svin (2003-11-20 11:38) [39]>600000 это максимум или обычное рабочее число?
максимум...
>А как тогда он глянув на номер узнает надо его обновлять или нет???
Гы.. :-) по твоему а я только с телефонами работаю, а адреса, организации кому он принадлежит тут отсутствуют?
← →
Zacho (2003-11-20 11:44) [40]
> Svin (20.11.03 11:38) [39]
Значит критерии для выбора все-таки есть ! Вот и делайте фильтр по ним. Например, по конкретной улице, и/или по организациям, название которых начинается с такого-то слога и т.д.
← →
Кулюкин Олег (2003-11-20 11:45) [41]
> а адреса, организации кому он принадлежит тут отсутствуют?
Оператор будет их видеть, но как он определит, что такой адрус уже есть?
Он их помнит?
← →
Danilka (2003-11-20 11:46) [42]хе-хе, вот и подошли, таки к критериям :))
← →
Danilka (2003-11-20 11:47) [43][41] Кулюкин Олег © (20.11.03 11:45)
самое страшное не это, а то, что ему придется просматривать 600"000 адресов, чтобы найти из них пару.
← →
_sulent (2003-11-20 11:48) [44]Да не нужно париться, просто воспользоваться TbookMark, он все отметит записи, и связать его с таблицей. И никаких проблем не будет. Очень даже удобная штукенция
← →
Кулюкин Олег (2003-11-20 11:52) [45]
> Danilka © (20.11.03 11:47) [43]
> самое страшное не это, а то, что ему придется просматривать
> 600"000 адресов, чтобы найти из них пару.
Да, тяжно ему. :(
← →
Zacho (2003-11-20 11:54) [46]
> _sulent © (20.11.03 11:48) [44]
И как же это сделать ? :-)
← →
_sulent (2003-11-20 14:58) [47]хм... это просто делается, дай бог памяти, у меня сейчас нету делфи на компе, но попробую воспроизвести все это безобразие :)))
... Хотя можно попробовать вот так, ставишь в DBGRid"е флажок Muliselect и можно работать с выбором данных, т.е. зажимаешь Ctrl и тыкаешь по записям, он их выбирает. Если нужно выбрать все записи, то тогда нажимаешь Ctrl+A. Выбирает все записи в сетке. Или можно воспользоваться TTable(Sender).SelectAll - тоже вариант, а потом обращаться к выбранным записям при помощи TBookMark, как это сделать, если нужно, я могу сказать завтра, потому как уже не помню как делал
← →
_sulent (2003-11-20 15:00) [48]тьфу, перепутал TDBGrid(Sender).SelectAll;
← →
Anatoly Podgoretsky (2003-11-20 15:38) [49]Ты когда ни будь пробовал просто прокрутить в гриде 600000 записей, допустим колесиком, у вас что мышки лишнии есть?
← →
Anatoly Podgoretsky (2003-11-20 15:39) [50]Хотя если хочешь, то select phone from table
← →
Danilka (2003-11-20 15:41) [51][50] Anatoly Podgoretsky © (20.11.03 15:39)
ему этого мало. ему надо еще адреса и названия фирм - т.к. по ним оператор должен найти 2 из 600"000 вручную! :))
← →
Zacho (2003-11-20 15:43) [52]
> _sulent © (20.11.03 15:00) [48]
Нету такого. И не было никогда. Так что или вручную тыкаться по всем записям, или проходить по всему датасету в цикле. Использрвать что-нибудь типа TDBGridEh.
А "просто воспользоваться TbookMark, он все отметит записи" - не получиться. Все равно цикл по набору данных, иначе - никак.
Тем более, что TBookmark: string;
← →
_sulent (2003-11-21 08:10) [53]Ну как нету, я делал, и у меня все работает! А зачем прокручивать, если просто выделить такое количество записей, то зачем мучиться, и глаза портить. Поставить Table.DisableControls, а по завершении включить, и все будет чпок!
← →
Zacho (2003-11-21 09:23) [54]
> _sulent © (21.11.03 08:10) [53]
Чего делал ? TDBGrid(Sender).SelectAll; ?
Да нету, нету у TDBGrid метода SelectAll !
← →
Юрий (2003-11-21 11:54) [55]Svin, по моему решение должно быть таким (я и сам его использую.
правда на множестве 10-20 тысяч записей)
В Gride выводишь весь необходимый список, а под гредом делаешь строку
для задания условия поиска (только не нужно вызывать ее по комбинации
клавишь типф Ctrl-F, это поле должно быть постоянно доступным)
Далее если это Тел база, то однозначно нао искать по номеру,
вот в это поле номер и забиваешь, и вызываешь Locate (или что-то еще)
В Gride, если эта запись будет найдена, курсор сразу установится
на нее, дальше уже можешь делать с ней что угодно -:
сразу редактировать, запомнить ее номер или что-то еще
Так же ишется вторая, третья ... n-я необходимая запись,
В конце у тебя будет множество с требуемыми записями,
Я правильно понял задачу или нет?
← →
Sandman25 (2003-11-21 12:30) [56]Хочу посоветовать отображать 2 грида. В одном гриде (нижнем, например) отображаются все выбранные в текущий момент строки. Верхний грид используется для фильтра и переноса строки в нижний грид. Операции можно производить как со строками нижнего грида, так и верхнего.
То есть работа выглядит примерно так:
для верхнего грида указываем в Edit (с Label организация) что-то типа "юнеско" и нажимаем кнопку. По нажатию этой кнопки происходит создание запроса типа "select * from table where organ_name like :organ_nameэ; ParamByName("organ_name").AsString := trim(Edit.Text) + "%";Open; В верхнем гриде отображаются найденные записи. Пользователь находит нужную запись и либо производит с ней нужную операцию, либо отмечает ее, помещая тем самым в нижний грид (AppendRecord).
Нижний грид связан с ClientDataSet, для которого настроены поля и вызван CreateEmptyDataSet.
Для того, чтобы снять выделение, не надо искать запись повторно, а нужно всего лишь удалить текущую строку из нижнего грида.
← →
Sandman25 (2003-11-21 12:36) [57]Да, еще. Если нужно выделить строки, с которыми не нужно производить операции, то нужно их отправить в нижний грид, а затем перед выполнением операции пробежаться по этому гриду и занести их все во временную таблицу и при выполнении операции проверять and not exists (select * from temp_table where temp_table.id = ...)
И еще - перед выполнением операции можно задать условие фильтра по таблице, причем чтобы это делал пользователь.
insert into table2 select * from table1 where (условие фильтра) and not exists (select * from temp_table where temp_table.id = ...)
В таком случае никогда не понадобится отображать 600.000 записей. Разве что в случае, если нужно добавить 300.000 записей и не добавлять другие 300.00 записей и нет никаких различий между ними, кроме решения человека. Но я такоге не встречал и этому человеку не завидую :)
← →
_sulent (2003-11-21 15:16) [58]Ну я завтра вывешу свой код, покажу как я делал, может я не то говорюю что нужно, и меня понять поэтому никто не может, но факт тот, что я действительно делал!
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.009 c