Команда locate не работает

Команда locate не работает

Возникла ситуация что 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]

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


> Шаповалов Кирилл (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

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


> Нет. Иначе после первого же элемента произойдет 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 и т.п.


> Шаповалов Кирилл (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 запрос с результатом из нескольких студентов, а не из одного

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

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/>а в проге на реакцию 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 я запамятовал совсем.
Соловьев ©
Тоже отдельное спасибо.

Источник

Команда locate в Linux

Одна из самых распространенных операций при работе в Linux — это поиск файлов и каталогов. В системах Linux есть несколько команд, которые позволяют искать файлы, причем поиск и определение местоположения являются наиболее часто используемыми.

Команда locate — это самый быстрый и простой способ поиска файлов и каталогов по их именам.

В этой статье мы объясним, как использовать команду locate .

Установка locate (команда locate не найдена)

В зависимости от дистрибутива и того, как была подготовлена система, пакет locate может быть предварительно установлен или не установлен в вашей системе Linux.

Чтобы проверить, установлена ли утилита locate , откройте терминал, введите locate и нажмите Enter . Если пакет установлен, система отобразит locate: no pattern to search for specified . В противном случае вы увидите что-то вроде locate command not found .

Если locate не установлен, вы можете легко установить его с помощью диспетчера пакетов вашего дистрибутива.

Установите locate на Ubuntu и Debian

Установить locate на CentOS и Fedora

Как locate работу

Команда locate выполняет поиск заданного шаблона в файле базы данных, созданном командой updatedb . Найденные результаты отображаются на экране по одному в строке.

Во время установки пакета mlocate создается задание cron, которое запускает команду updatedb каждые 24 часа. Это гарантирует регулярное обновление базы данных. Для получения дополнительной информации о задании cron проверьте файл /etc/cron.daily/mlocate .

Базу данных можно обновить вручную, запустив updatedb от имени пользователя root или пользователя с привилегиями sudo:

Процесс обновления займет некоторое время, в зависимости от количества файлов и каталогов, а также скорости вашей системы.

Читайте также:  Как настроить монитор для дизайна

Файлы, созданные после обновления базы данных, не будут отображаться в результатах поиска.

По сравнению с более мощной командой find которая выполняет поиск в файловой системе, команда locate работает намного быстрее, но не имеет многих функций и может выполнять поиск только по имени файла.

Как использовать команду locate

Синтаксис команды locate следующий:

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

Например, чтобы найти файл с именем .bashrc , введите:

Вывод будет включать имена всех файлов, содержащих в своих именах строку .bashrc :

Файл /root/.bashrc не будет показан, потому что мы /root/.bashrc команду как обычный пользователь, у которого нет прав доступа к каталогу /root .

Если список результатов длинный, для лучшей читаемости вы можете направить вывод в команду less :

Команда locate также принимает шаблоны, содержащие символы подстановки, такие как подстановочный знак * . Если в шаблоне нет дополнительных символов, команда ищет *PATTERN* . Поэтому в предыдущем примере отображались все файлы, содержащие в своем имени шаблон поиска.

Подстановочный знак — это символ, используемый для обозначения нуля, одного или нескольких символов. Например, чтобы найти все файлы .md в системе, вы должны ввести:

Чтобы ограничить результаты поиска, используйте параметр -n после которого укажите количество результатов, которые вы хотите отобразить. Следующая команда .py поиск всех файлов .py и отобразит только 10 результатов:

По умолчанию locate выполняет поиск с учетом регистра. Параметр -i ( —ignore-case ) указывает locate игнорировать регистр и запускать поиск без —ignore-case регистра.

Чтобы отобразить количество всех совпадающих записей, используйте параметр -c ( —count ). Следующая команда вернет количество всех файлов, содержащих .bashrc в своих именах:

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

Чтобы отображать только имена файлов, которые существуют на момент запуска locate , используйте параметр -e ( —existing ). Например, следующее будет возвращать только существующие файлы .json :

Если вам нужно выполнить более сложный поиск, используйте параметр -r ( —regexp ), который позволяет вам искать, используя базовое регулярное выражение вместо шаблонов. Этот параметр можно указывать несколько раз.
Например, чтобы найти все файлы .mp4 и .avi в вашей системе и игнорировать регистр, вы должны запустить:

Выводы

Команда locate ищет в файловой системе файлы и каталоги, имена которых соответствуют заданному шаблону. Синтаксис команды легко запомнить, а результаты отображаются практически мгновенно.

Для получения дополнительной информации обо всех доступных параметрах команды locate введите команду man locate в вашем терминале.

Если у вас есть вопросы, не стесняйтесь оставлять комментарии.

Источник

Оцените статью