Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Вниз

Почему может не работать 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.03 c
1-84410
Yoyo
2003-06-09 18:03
2003.06.26
Нужно вставить текст


3-83947
yura
2003-06-04 09:51
2003.06.26
Backup&Restore


3-83860
Empleado
2003-05-27 12:19
2003.06.26
SQL update в одной транзакции


1-84273
prorok2
2003-06-14 13:51
2003.06.26
Добавление OnClick для меню в run-time


3-83990
Endi
2003-05-29 20:58
2003.06.26
Условная сборка таблиц





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский