powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дополнение к первому вопросу
5 сообщений из 5, страница 1 из 1
Дополнение к первому вопросу
    #32035418
Рома
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо за ответ, однако, должен сказать, что для понимания этой процедуры я еще не вырос.
Я пытался решить эту задачу по другому, но ничего не выходит. Попытаюсь для ясности сформулировать задачу.
На форму бросил DBGrid, DataSource, Query, 13 шт. Edit (далее поля ввода) , и одну кнопку Button1 для которой написал обработчик. Имеется база данных FoxPro с 33 полями.
Необходимо написать параметрический запрос к базе данных, при этом необходимо иметь в виду, что не во все поля ввода будут заносится данные для запроса.

Вот примерный код.

procedure TForm1.Button1Click(Sender: TObject);
begin
query1.close;
if not query1.prepared then
query1.prepare;
query1.ParamByName('stnum_param').value:=edit3.text;
query1.ParamByName('mark_param').value:=edit4.text;
query1.ParamByName('god_param').value:=edit5.text;
query1.ParamByName('ndvig_param').value:=edit6.text;
query1.ParamByName('kuzo_param').value:=edit7.text;
query1.ParamByName('shas_param').value:=edit8.text;
query1.ParamByName('fam_param').value:=edit9.text;
query1.ParamByName('nam_param').value:=edit10.text;
query1.ParamByName('pat_param').value:=edit11.text;
query1.ParamByName('rajon_param').value:=edit12.text;
query1.ParamByName('town_param').value:=edit13.text;
query1.ParamByName('street_param').value:=edit14.text;
query1.ParamByName('predpr_param').value:=edit15.text;
query1.open;
label17.Caption:=inttostr(Query1.RecordCount);
end;

А в и инспекторе объектов DBGrid открыл SQL и написал такой запрос.

select * from 'asd1.dbf' asd1
where st_num like :stnum_param
and mark like :mark_param
and god_build like :god_param
and n_dvig like :ndvig_param
and n_kuzo like :kuzo_param
and n_shas like :shas_param
and fam like :fam_param
and nam like :nam_param
and pat like :pat_param
and rajon like :rajon_param
and town like :town_param
and street like :street_param
and predpr like :predpr_param

при вводе данных для запроса через Edit я могу начать как с первого до 13, так и заносить только к примеру в поля 3,6,10. Однако, у меня работает только по первым двум полям. Моей конечной задачей является при помощи 13 полей ввода сделать запрос к базе зарегистрированного транспорта. Запрос должен обеспечивать выборку как по всем полям так и по одному полю, т.е. либо по всем реквизитам транспорта, либо по нескольким, либо по одному.

Благодарю за терпение и помощь.
...
Рейтинг: 0 / 0
Дополнение к первому вопросу
    #32035419
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам надо было сразу сказать, что Вы работаете с DBF. Разумеется, никаких хранимых процедур там нет, и не было. Просто на данном сайте обычно обсуждаются вопросы, связанные с SQL-серверами.

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

Если Вы работаете через BDE, то я уж точно и не помню, как там называлось это свойство. Ну да в этом разберетесь.

Кажется Query.SQL.text.

Пишете что то типа -

SQLHeader:= 'select * from ''asd1.dbf'' asd1 '
SQLBody:='';
if trim(edit3.text)<>''{защита от идиотов, которые будут сюда вводить пробелы} then
SQLBody:= SQLBody+'and st_num like '+ansiQuotedStr(edit3.text,'''')+'%,'

и так далее.

После этого надо убрать ведущий 'and' и заключительную запятую.

if SQLBody>'' then
begin
SQLBody:=copy(SQLBody,1,length(SQLBody)-1);
SQLBody:=copy(SQLBody,5,length(SQLBody)-6);
end;

Query.SQL.text:=SQLHeader+' where '+SQLBody;
Query.open;
...
Рейтинг: 0 / 0
Дополнение к первому вопросу
    #32035420
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я забыл про проверку на то, что ни одно поле не заполнено. Вообще-то лучше
разрешать выполнять этот запрос,
если заполнены хотя бы основные отсекающие поля, в Вашем случае это могут
быть регионы. Ну да это дело техники и конкретной реализации.

if SQLBody='' then
begin
showmessage('Кретин!. Введи хоть что-нибудь!')
Query.SQL.text:=SQLHeader;
end
else
begin
Query.SQL.text:=SQLHeader+' where '+SQLBody;
end;
Query.open;
...
Рейтинг: 0 / 0
Дополнение к первому вопросу
    #32035451
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то я пришел в себя после вчерашнего. Разумеется никаких запятых в SQLBody не должно быть.
...
Рейтинг: 0 / 0
Дополнение к первому вопросу
    #32035452
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается, еще не совсем отошел. Вместо запятых надо ставить пробелы.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дополнение к первому вопросу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]