Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать номер активной строки в TQuery? 
:(
    Опции темы
x77
Дата 3.10.2003, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



для Ib у меня сейчас получилось так. я завёл генератор (my_gen_id), в основной запрос Query1 добавил его вызов

Код
select GEN_ID (my_gen_id, 1), comments
 from data


т.е. при каждом переоткрытии таблицы он начитывает номера полей из самого запроса. безотказная фишка. есть только одно но: значение генератора каждый раз увеличивается. поэтому я завёл ещё одну TQuery с таким SQL:

Код
SET GENERATOR MY_GEN_ID TO 0


и повесил обработчик на TQuery1.BeforeOpen:

Код
procedure TForm1.Query1BeforeOpen(DataSet: TDataSet);
begin
 Query2.ExecSQL;
end;


т.е. перед каждым открытием Query1 генератор сбрасывается в ноль. всё классно работает smile.gif

Это сообщение отредактировал(а) x77 - 3.10.2003, 18:41


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


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 1
Всего: 4



x77, спасибо, я попробую... только в воскресенье буду на работе, тогда попробую...
и, честно говоря, я не знаю, что такое генератор и как его заводить?
и можно ли в Oracle заводить генератор?

Это сообщение отредактировал(а) Dayana - 3.10.2003, 18:55
PM MAIL ICQ   Вверх
x77
Дата 3.10.2003, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



у меня оракла нет sad.gif а так, навскидку, я не помню. но возможность там такая однозначно есть, до выходных постараюсь уточнить, если никто раньше не напишет smile.gif


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


Лентяй
***


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

Репутация: нет
Всего: 41



Цитата
Может есть мысли на этот счет?



У меня мысля такая: во-первых, выбросить dbGrid или найти нормальный. smile.gif Я эти db control'ы вообще не очень люблю, проблем с ними много. Во-вторых, делать не live query. То есть возвращать статический набор данных. Тоже предпочитаю так делать: запрос - отображение данных, редактирование их пользователем - запрос на изменение данных. Не уверен, правда, что это решит проблему с RecNo, даже скорее всего нет, но кто знает?

Вторая мысля - создать свой компонент наследованный от стандартного и в ключить в него свое свойство, которое уже считать самому при гулянии по квере. Так же можно попытаться контролировать номер строки в квере через событие OnScroll (кажется так), тоже через свою переменную.

Пока больше идей нет. smile.gif


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Cashey
Дата 3.10.2003, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Ты с Oracle из дельфи работаешь через BDE?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Cashey
Дата 3.10.2003, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



... если через BDE.
Значит делаешь так (если таблица известна на этапе проектирования):
1. В св-ве Query1.DatabaseName проставляешь имя БД, зарегистрированной в BDE.
2. Создаешь в Query1.SQL, набор команд, например
Код
select fieldname1 as fieldname1, fieldname2 as fieldname2, ... , fieldnameN as fieldnameN
from <tablename>

3. Создаешь в TQuery набор полей, соответствующий вышеприведенному запросу (двойной щелчок мыши на компоненте Query1, далее в открывшемся окне жмешь правую кнопку мыши и выбираешь пункт Add Fields (Add All Fields), во вновь открывшемся окне, если все поля синие, жми ОК), далее создаешь еще одно поле, New Field, назови 'num', тип Integer и Field Type - Calculated.
4. В гриде создаешь колонку (практически так же как и в TQuery) и связываешь его с этип полем.
5. В обработчике событий Query1CalcFields, пишешь следующее:
Код
Query1num.AsInteger := query1.RecNo;

6. Проверь, что б св-во Query1.AutoCalcFields было в true.
Все, после
Код
query1.Active := true;
у тебя будет грид с порядковой нумерацией результирующего набора данных. Вариант плох тем, что надо заранее знать структуру таблицы и, главное, сам запрос. Но я уверен, что и это преодолимо, может не просто, но преодолимо, щас на выходных из интереса попытаюсь добить, и если потребуется, вышлю демку.

PS
Цитата
Вот и я о том же... пробовала через RecNo... обрабатываю на событие OnCalcFields (или почти так называется), считываю RecNo, а он мне -1 всегда возвращает. Думаю, RecNo содержит номер выделеной строки на db гриде. А OnCalcFields с выделением строки в db гриде не связано.

Не знаю как себя введет Оракл, но можно прописать так
Код
Query1num.AsInteger := query1.RecNo + 1;

Цитата
Задача у меня такая. В db гриде надо вывести колонку с нумерацией всех строк. Я подумала, что самое простое это завести поле в TQuery, которое калькулейтит, и в OnCalcFields заносить туда номер текущей записи. Оказалось проблема с номером текущей записи.

В общем, ты на правильном пути, только у меня все тип-топ, могу демку выслать, если не веришь smile.gif

Это сообщение отредактировал(а) Cashey - 3.10.2003, 23:17


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Dayana
Дата 3.10.2003, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 1
Всего: 4



Cashey, все было сделано так, как ты описал, а RecNo = -1.... если у тебя все хорошо, то я даже и не знаю, где искать... И вышли демку, если не сложно. :-)

Fantasist, идеи очень хорошие, но проблема в том, что проект уже готовый, а мне приходится к нему дописывать. Соответственно делать такие вещи, как менять грид и писать свой компонент, нельзя... (нет на это времени и.... могут уволить, а я только 4 дня работаю...).
Наверное придется сделать поле не fkCalculate, a fkData, и попробовать заполнить его на этапе открытия квери в цикле, проходясь по всем строчкам.
Интересно получится что-нибудь или нет?

Это сообщение отредактировал(а) Dayana - 3.10.2003, 23:38
PM MAIL ICQ   Вверх
Cashey
Дата 3.10.2003, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата
Наверное придется сделать поле не fkCalculate, a fkData, и попробовать заполнить его на этапе открытия квери в цикле, проходясь по всем строчкам.
Интересно получится что-нибудь или нет?

Точно не получится, поле fkData, может бать только привязана к конкретному полю в таблице, а св-во Value в fkCalculate доступно только для чтения.
Дай мне названия и тип полей в твоей таблице, я тебе вышлю свою прожку, если в ней все будет ОК значит: не все делала как я писал.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Dayana
Дата 5.10.2003, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 1
Всего: 4



Cashey, у меня не одна таблица, квери берет данные из нескольких таблиц... Да в любом случае, пишу отдельный пример, все равно не получается... все равно -1...
PM MAIL ICQ   Вверх
Dayana
Дата 5.10.2003, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 1
Всего: 4



Cashey, ну вот например такой квери:
Код

select cc, id, nname, p_name from client c

где
сс varchar2[2]
id varchar2[10]
nname varchar2[15]
p_name varchar2[15]

вышли мне свой код, плиз...
PM MAIL ICQ   Вверх
x77
Дата 5.10.2003, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Cashey, все твои варианты прокатывают только для парадокса/дэбэйз/etc. я и сам на это поймался. через RecNo работать с ib/oracle вообще нельзя (почему - я не знаю, но оно всегда равно -1 или вообще чему-то левому). самое реальное и быстрое для oracle с минимум изменений в коде - это завести генератор и добавить его вызов в select. а перед открытием таблицы - обнулять этот генератор. в оракле генераторами являются "последовательности" - sequence. вот там и надо копать.


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


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 1
Всего: 4



x77, сделала через генератор (sequence)... все хорошо... а "начальство" сказало, что это плохой стиль... :-(( короче не нравится так.... надо делать по-другому...
Есть еще такая штука RxMemoryData. Туда загружаешь весь квери и можно работать с ним как с квери, и при этом получается тот же квери, но еще и writable. Можно, например после открытия, в цикле заполнить поле для нумерации. Т.е. сделать то, что нельзя с обычным квери. Но с этим у меня тоже проблема, т.к. в этом случае надо переписать много кода. Т.е. не переписать, а заменить в коде обработку существующего квери на новый RxMemoryData. Предложу тому же "начальству". Хотя уверена, что это тоже не подойдет....
Извиняюсь за оффтоп, но просто ужасно начинать работать с готовым проектом, когда над тобой стоит кто-то, кто хочет, что бы писалось так, как он хочет... а не так, как ты считаешь нужным... В этом случае перестаешь понимать, умеешь ли программировать вообще... вот...
PM MAIL ICQ   Вверх
x77
Дата 5.10.2003, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
а "начальство" сказало, что это плохой стиль


передай этим господам, что "плохой стиль" - это то, что они видят в зеркале по утрам. это было самое быстрое и корректное решение sad.gif

ладно, сейчас попробуем иначе, без изменений в базе и существующем коде. если что выйдет - выложу.


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


Эксперт
***


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

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



сделал откровенно идиотский вариант, через закладки. работает, но... в общем, смотри сама. я завёл в квери одно левое поле, Number, типа fkCalculated. реально туда ничего не ложится, оно используется только для того, чтобы отрисовать порядковый номер записи.


Код
 TForm1 = class(TForm)
   DataSource1: TDataSource;
   DBGrid1: TDBGrid;
   Query1: TQuery;
   Query1Number: TIntegerField;
   Button1: TButton;
   ....
   procedure Query1AfterOpen(DataSet: TDataSet);
   procedure Query1AfterClose(DataSet: TDataSet);
   procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
     DataCol: Integer; Column: TColumn; State: TGridDrawState);
   procedure Button1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
   fBookmarks: array of TBookmark; // массив закладок
   fBookmarkCount: integer; //кол-во закладок
 public
   { Public declarations }
 end;

...

implementation

// заполняем массив: на каждую запись получаем закладку
procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
begin
 Query1.DisableControls;
 try
   Query1.First;
   fBookmarkCount := 0;
   while not Query1.Eof do begin
     Inc (fBookmarkCount);
     SetLength (fBookmarks, fBookmarkCount);
     fBookmarks [fBookmarkCount - 1] := Query1.GetBookmark;
     Query1.Next;
   end;
   Query1.First;
 finally
   Query1.EnableControls;
 end;
end;

// освобождаем массив
procedure TForm1.Query1AfterClose(DataSet: TDataSet);
var
 i: integer;
begin
 for i := 0 to fBookmarkCount - 1 do
   Query1.FreeBookmark (fBookmarks [i]);
 Finalize (fBookmarks);
end;

// отрисовываем нумера:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
 bm: TBookmark;
 i: integer;
begin
 // если это не наше поле - сваливаем
 if Column.FieldName <> 'Number' then
   Exit;
 bm := Query1.GetBookmark;
 try
   for i := 0 to fBookmarkCount - 1 do begin
     // находим нужную закладку. её индекс в массиве - это и есть порядковый номер записи
     if Query1.CompareBookmarks (bm, fBookmarks[i]) = 0 then begin
       DbGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, IntToStr (i + 1));
       Break;
     end;
   end;
 finally
   Query1.FreeBookmark (bm);
 end;
end;

// для информации. у меня получилось по три кило на закладку :(
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage (IntToStr (fBookmarkCount) + ' * ' + IntToStr ( TFake (Query1).BookmarkSize));
end;

// обязательно закрываем квери, чтобы отработало совобождение массива
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Query1.Active := FALSE;
end;

end.


вот такая фишка. подозреваю, что на больших наборах данных отрисовка будет тормозить, но больше пока ничего в голову не лезет sad.gif


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


Эксперт
***


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

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



да, забыл:

Код
type
 TFake = class (TDataset);


это чтобы добраться до proected property BookmarkSize DataSEt'а. в проекте это можно просто выбросить, вместе с обработчиком Button1Click.


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

Запрещено:

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

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


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

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

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


 




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


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

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