Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.023 c
1-36705
Artog
2003-12-02 15:17
2003.12.12
динамический массив


14-36811
wHammer
2003-11-20 10:37
2003.12.12
Подскажите есть ли в природе...


14-36844
Dmitriy O.
2003-11-19 12:52
2003.12.12
Сколько весят данные.


1-36744
User_OKA
2003-12-01 09:36
2003.12.12
Использование компонентов


3-36560
Mila
2003-11-12 11:36
2003.12.12
есть:БД в Clipper(dBase)