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

Вниз

Почему может не работать Locate?   Найти похожие ветки 

 
Шаповалов Кирилл   (2003-06-02 10:54) [0]

Возникла ситуация что Locate не желает работать. Причина мне не ясна, т.к. аналогичный код работает в соседней форме.
Поиск ведётся по первичному ключу. Параметр берётся из другого запроса. Причем, если вместо параметра установить конкретное значение - работает. Хотелось бы узнать
1) Где грабли могут быть
2) Есть ли альтернатива Locate. Т.е. необходимо найти запись по перв. ключю. и сделать её активной.

Большое спасибо.


 
Соловьев ©   (2003-06-02 11:00) [1]

код?


 
Шаповалов Кирилл   (2003-06-02 11:07) [2]

блин, нету под рукой оригинала, на память боюсь ошибиться


 
Sandman25 ©   (2003-06-02 11:10) [3]

2) Есть ли альтернатива Locate. Т.е. необходимо найти запись по перв. ключю. и сделать её активной.

Пробежаться по записям и остановиться на нужной.

with Table do
begin
DisableControls;
try
First;
while TableField1.asInteger <> SearchingValue do
Next;
finally
EnableControls;
end;
end;


 
Шаповалов Кирилл   (2003-06-02 11:10) [4]

блин, нету под рукой оригинала, на память боюсь ошибиться


 
VAleksey ©   (2003-06-02 11:17) [5]


> Шаповалов Кирилл (02.06.03 11:10)

А мы типа тоже бимся ошибиться без кода, прикинь ;-).

> Sandman25 © (02.06.03 11:10)

И можно идти кофе пить. :-)


 
Соловьев ©   (2003-06-02 11:21) [6]


> while TableField1.asInteger <> SearchingValue do
>

...
while not Eof do
begin
if TableField1.asInteger <> SearchingValue then Next
else SysUtils.Abort;
end;
...


 
Zacho ©   (2003-06-02 11:29) [7]


> Соловьев © (02.06.03 11:21)

А может более правильно else break; ?


 
Sandman25 ©   (2003-06-02 11:32) [8]

VAleksey © (02.06.03 11:17)

Согласен, что для Table нужно задействовать Index. Кстати, можно попробовать двигаться бинарным делением и MoveBy.
Ну а если у нас Query и не упорядочен по искомому полю, то можно только моим "кофейным" способом :)

Соловьев © (02.06.03 11:21)

Нет. Иначе после первого же элемента произойдет Abort.


 
Соловьев ©   (2003-06-02 11:32) [9]


> Zacho © (02.06.03 11:29

может :) не проверял... писал с головы...:)


 
Соловьев ©   (2003-06-02 11:35) [10]


> Нет. Иначе после первого же элемента произойдет Abort.

если бы было =, то да.


 
Sandman25 ©   (2003-06-02 11:50) [11]

Соловьев © (02.06.03 11:35)

Я ошибся. У Вас было очень необычно написано, и я запутался.
Я обычно проверяю на сравнение.
while not Eof do
begin
if Table1Field.Value = aValue then
Break;
Next;
end;


 
Шаповалов Кирилл   (2003-06-03 11:02) [12]

Соловьев ©
1) TblStudent"а чего ж ещё. не фурычит кароче.


DataMod.tblStudent.Locate("ID",DataMod.q_stud.FieldByName("ID").asiNTEGER,[]);
И чего? он установит курсор на запись в запросе. а форме8 там всё из tblStudent берётся.


 
Соловьев ©   (2003-06-03 11:10) [13]

я забыл твой код тот что ты утром приводил, повтори.


 
Шаповалов Кирилл   (2003-06-03 11:13) [14]

Имеется запрос:

SELECT Student.ID,Student.Familiya, Student.Imya, Student.Otchestvo, Gruppa.GroupName
FROM "Student.DB" Student
INNER JOIN "Gruppa.DB" Gruppa
ON (Student.GroupID = Gruppa.ID)
WHERE (Student.Familiya LIKE :prmFam)
AND (Student.Imya LIKE :prmIm)
AND (Student.Otchestvo LIKE :prmOtch)
ORDER BY Student.Familiya, Student.Imya, Student.Otchestvo

вызывается он сл. кодом

with DataMod do
begin
q_Stud.close;
q_Stud.ParamByName("prmFam").asString:=RusUpCase(Edit1.text)+"%";
q_Stud.ParamByName("prmIm").asString:=RusUpCase(Edit2.text)+"%";
q_Stud.ParamByName("prmOtch").asString:=RusUpCase(Edit3.text)+"%";
q_stud.Open;
Label5.Caption:=inttostr(q_stud.REcordCount);
if q_stud.REcordCount<>0 then DBgrid1.Enabled:=true;
end;
end;

Результат выводится в DBGrid. после чего обрабатывается клик на строку DBGrid таким образом

IF DataMod.src_q_stud.DataSet.FieldByName("ID").asiNTEGER=old_id then
begin
Form8:=TForm8.Create(Application);
// ЭТО ВРЕМЯ!
DataMod.tblStudent.Locate("ID",DataMod.src_q_stud.DataSet.FieldByName("ID").asiNTEGER,[]);
end
else old_id:=DataMod.src_q_stud.DataSet.FieldByName("ID").asiNTEGER;

где Form8 - форма выводящая инфу по студенту.

Проблема в том что не работает. :] Разобрался что в "это время" навигация не осуществляется. Даже методами next prev и т.п.


 
Zacho ©   (2003-06-03 11:16) [15]


> Шаповалов Кирилл (03.06.03 11:13)

Странно как-то. Запрос ты делаешь в q_Stud, а Locate - в tblStudent. Похоже в этом и грабли


 
Соловьев ©   (2003-06-03 11:20) [16]


> ORDER BY Student.Familiya, Student.Imya, Student.Otchestvo

а зачем?


 
Шаповалов Кирилл   (2003-06-03 11:20) [17]

Zacho ©
q_stud запрос по таблице tblStudent, ищет студентов по фамилии и т.п. , тыкаешь в dbgrid, открывается окно с информацией по конкретному студенту. для это ищу d tblStudent такой же id как у записи из q_stud на которую кликнули


 
Соловьев ©   (2003-06-03 11:29) [18]


> q_stud запрос по таблице tblStudent, ищет студентов по фамилии
> и т.п. , тыкаешь в dbgrid, открывается окно с информацией
> по конкретному студенту. для это ищу d tblStudent такой
> же id как у записи из q_stud на которую кликнули

зачем Locate? у тебя уже автоматически стоит курсор на нужной записи. выведи форму просто с DBText-ми


 
Sandman25 ©   (2003-06-03 11:30) [19]

>Разобрался что в "это время" навигация не осуществляется. Даже методами next prev и т.п.

А что пишет? Dataset not active?


 
Zacho ©   (2003-06-03 11:32) [20]


> Шаповалов Кирилл (03.06.03 11:20)

src_q_stud - это DataSource, к которому подключен q_Stud ?
А зачем так сложно DataMod.src_q_stud.DataSet.FieldByName("ID").asiNTEGER ? Можно просто DataMod.q_stud.FieldByName("ID").asiNTEGER
Да и втовем случае вообще достаточно Locate("ID",old_id,[]);


 
Шаповалов Кирилл   (2003-06-03 11:48) [21]

Соловьев ©
q_Stud запрос с результатом из нескольких студентов, а не из одного

Sandman25 ©

ничего не пишет. Я же говорю когда в locate вместо old_id ставить константу - работает.

Zacho ©

scr_q_stud - да. можно всё, пробовал. не работает .


to ALL:
Я вот думаю, проблема, возможно,в том что q_stud - запрос по таблице студентов, т.е. курсор стоит на нескольких записях. И таблица какбы задействована, поэтому не фурычить locate по этой табличке. Такое возможно? Как считаете?


 
Zacho ©   (2003-06-03 11:54) [22]


> Шаповалов Кирилл (03.06.03 11:48)

Что DataMod.tblStudent.Locate("ID",old_id,[]) не работает ? А в tblStudent точно есть запись с ID равным old_id ?


 
Соловьев ©   (2003-06-03 11:54) [23]


> tblStudent

какя еще инфа выводится, которой нет в q_stud?
А зачем ты делаешь Locate? не проще ли выполнить еще один запрос?
select *
from student
where id=:id
а в проге на реакцию q_stud.AfterScroll:
with Query2 do
begin
Close;
ParamByName("id").AsInteger := DataSet.FieldByName("id").AsInteger;
Open
end;


 
Шаповалов Кирилл   (2003-06-03 11:59) [24]

Zacho ©
точно есть
Соловьев ©
попробую через запрос.
возможно получится, ведь такой запрос установит курсор именно на запись. да.


 
Zacho ©   (2003-06-03 12:04) [25]


> Шаповалов Кирилл (03.06.03 11:59)
> точно есть

Тогда Locate должен работать. Проверь еще раз, протрассируй, посмотри что в old_id и есть ли запись с таким ID tblStudent.
Кстати, если tblStudent - TTable а по ID есть индекс, то вместо Locate можно использовать GotoKey. В хелпе есть пример.


 
Соловьев ©   (2003-06-03 12:04) [26]


> возможно получится, ведь такой запрос установит курсор именно
> на запись. да.

тебе надо будет повесить на обработку клика по гриду показ формы, а данные о студенте с заданым ID, выдаст запрос Query2


 
Шаповалов Кирилл   (2003-06-03 12:06) [27]

Zacho ©
Спасибо! Про GotoKey я запамятовал совсем.
Соловьев ©
Тоже отдельное спасибо.



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
1-84109
Hog
2003-06-10 16:14
2003.06.26
String индексы и VAR параметр


14-84723
Mike B.
2003-06-05 14:22
2003.06.26
Реклама на сайте


1-84218
LedWorm
2003-06-12 13:25
2003.06.26
Событие при наведении мыши и её опускании


11-84062
Vit@l
2002-09-26 21:20
2003.06.26
Создание компонента для KOL


4-84841
fifo
2003-04-22 18:10
2003.06.26
Как захватить изображене чужого окна?