Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по DBGrid-у.Помогите пожалуйста. DBGrid........... 
:(
    Опции темы
BGladiator
Дата 15.9.2003, 17:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте. Вот в чём проблема: есть DBGrid - в нём несколько колонок, указан некоторый DataSource откуда и берутся данные. При печати печатаются все строки этого DBGrida. Мне же нужно чтобы печатались лишь выбранные. Для этого в запросе, который использ. для этого DBGrida я добавил ещё одно поле SELECTION - соответственно и втаблицу БД откуда выбираются данные тоже пришлось добавить такое же поле, в котором ничего не содержится (' '). Теперь при нажатии пробела сделал обработчик, который заносит в это поле произвольную метку ('X').
Теперь при печати печатаются только те строки в которых поле SELECTION имеет метку ('X').
Всё бы хорошо да только вот установка этих меток (особенно для нескольких строк) происходит слишком медленно. sad.gif И ещё было проверено что во время установки этих меток, которые служат всего лишь для печати происходит UPDATE таблици в БД. Из-за чего при работе нескольких пользователей возникают блокировки.
Если кто-то знает как можно реализовать эти метки для печати проще пожалуйста подскажите. Если можно по подробнее, потому что перепробовал много вариантов - не выходит.
Заранее спасибо.
  Вверх
x77
Дата 15.9.2003, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



можно сделать проще через метки (включить в Options dgMultiSelect) . при нажатии на кнпку печать, пробегаем по гриду и смотрим в свойство CurrentRowSelected. если оно TRUE, то добавляем поле в список печатаемых полей. после этого останется только вывести на печать сам список. здесь есть варианты. самый, на мой взгляд, грамотный - TRxMemoryTable. формируем виртуальную таблицу и цепляем её к отчёту. более геморройные варианты - вручную формировать данные в том же QuickReport, т.е. в OnNeedData (так, кажется? давно с этим монстром не работал) добавляем записи из нашего списка. трейтий вариант: печатать через excel или даже word. там тоже всё достаточно просто - CreateOleObject и вперёд, на эту тему материалов просто море.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 15.9.2003, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



З.Ы. выносить флаг печати в отдельное поле таблицы при мультиюзверном доступе - это смерть, imho smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 15.9.2003, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



хотя, на крайняк, можно попробовать и с таблицей. установить Cashed Updates в TRUE, стартовать транзакцию, когда юзверь начинает формировать выборку, а после печати эту транзакцию откатывать. блокировки уйдут. блин, но там будут свои геморрои с транзакциями. не, лучше всего - метки smile.gif.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 15.9.2003, 18:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо за ответы.
В Options dgMultiSelect у меня включён и список выводится на печать с помощью QuickReport. Но мне надо чтобы пользователь видел что он выбрал, ну типа моего 'X' в поле SELECTION.
  Вверх
BGladiator
Дата 15.9.2003, 19:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











x77И ещё так как уменя небольшой опыт программирования в Delphi можешь показать отрывок текста в котором как, ты говоришь пробегаешь по гриду и смотришь свойство CurrentRowSelected.
Вот моя процедура ответсвенная за вывод напечать:
procedure TLineData.aPrintExecute(Sender: TObject);
Var
pr:TrepLineData;
begin
inherited;
pr:=nil;
with Grd.DataSource.DataSet do try
Filter := 'SELECTION ='+'''X''';
Filtered := True;
pr:=TrepLineData.Create(nil);
// pr.Preview;
pr.PrinterSetup;
pr.print;
pr.free;
Filtered := False;
pr:=nil;
except
on Exception do if pr<>nil then pr.free;
end;
end;

Заранее благодарен.
  Вверх
x77
Дата 15.9.2003, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



так если запись выделена, он что, её не увидит? если непременно нужно отдельное поле, сделай CalculatedField и в OnCalcFields присваивай ему, чего надо если в гриде соответствующее поле является выделенным.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 15.9.2003, 19:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











x77 На счёт CalculatedField можно какой нибудь примерчик, потому что когда я пролбовал такое сделать выдавалась ошибка что Dataset не находится в режиме редактирования или вставки. Когда я включал режим Edit; моя метка в поле не отображалась.
  Вверх
x77
Дата 15.9.2003, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



это потому, что calculated поля надо присваивать только и только в OnCalcFields. при этом датасет не переводится в режим редактирования и физические значения в базе не меняются. собственно, их там и нету smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Unregistered
Дата 15.9.2003, 19:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А если все Query i DataSource и соответствующие обработчики в том числе и On CalcFields у меня находятся в отдельной форме мне надо каждый раз из своей формы вызывать этот обработчик или нет. Если да то как?
Огромное спасибо тебе. Уже по чучуть начинаю разбираться.
  Вверх
x77
Дата 15.9.2003, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



нет, OnCalcFields будет отрабатывать сам по себе всегда.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 15.9.2003, 19:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Так а как мне в этой отдельной форме где хранится мой OnCalcFields проверять выделена ли моя строка в гриде. Ответь пожалуйста.
  Вверх
x77
Дата 15.9.2003, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



попробовал - довольно проблематично smile.gif единственное, что приходит в голову, это хранить список выделенных полей в какой-то внешней переменной типа TStringList. в DbGrid1.OnMouseUp добавлять поле в список если его там нету, или удалять если оно там есть. при этом надо делать что-то типа Table1.Edit; Table1.Cancel; чтобы заставить датасет пересчитать поля. а после всего этого гемморра в OnCalcFields проверять, если данное поле есть в списке - то ему присваивать значение "Х", если нету - пусто.

слушай, есть вариант попроще, если ты ещё здесь.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 15.9.2003, 20:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо тебе, итак за помощь, а то целый день мучаюсь. Какой вариант.
  Вверх
x77
Дата 15.9.2003, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



насчёт крестиков. вот такой:

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 with DbGrid1 do begin
   if SelectedRows.CurrentRowSelected and
     (SelectedRows.Count > 1) and
     (Column.Index = 0)
   then
     with Canvas do begin
       Font.Color := clRed;
       TextOut (Rect.Left + 2, Rect.Top + 1, 'X');
     end;
 end;
end;



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.