Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка при поиске  (Прочитано 26459 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 19-12-2004 08:59 » 

Почему так происходит?
Пишу клиент на Дельфи. Пишу поиск, использую компонент TQuery. В поиске задаются три параметра:
-имя таблицы
-имя поля
-ключ поиска (т.е. что ищем)
Поиск работает и выводит правильные значения, но есть одно "НО", жирное такое.
Дело в том, что поиск абсолютно не работает (вываливается ошибка SQL), если подставить в качестве второго параметра(имя поля) поле с типом Varchar в котором находятся символьные значения. Это очень важно, именно СИМВОЛЬНЫЕ ЗНАЧЕНИЯ, потому как, если указать поле типа Varchar, но в котором содержатся числа, то поиск работает просто на все 100%.
И шибка вываливается для меня (пусть в SQL я не особо сведующий ) непонятная. Ошибка вываливается типа такой:"Column unknown USA", при этом USA это условие поиска, т.е. искалось-то слово USA в поле, а получается что он не может найти поле USA, куда тогда вообще информация о поле которая должна быть делась, бред у меня в голове уже.
Я вообще как думаю, что информация о типе данных смысл должна терять, т.к. информацию о поле я получаю так Edit.text, т.е. в принципе из ЕДИТа я получаю уже символы.
Короче, очень надеюсь, что вопрос понятен, и никто не запутался в дебрях моих мыслей Улыбаюсь.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-12-2004 09:04 » 

вот, сам запрос:
Код:

temp{='select * from '+table +  ' t ' + 'where t.' +  Edit2_namecolumns.Text   + ' = ' +  Edit3_keysearch.Text   ;

IBQuery1.Active{=афдыу;
IBQuery1.SQL.Text{=temp;
IBQuery1.Active{=true;
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 19-12-2004 11:37 » 

попробуй так:

Код:
temp{='select * from '+table +  ' t ' + 'where t."' +  Edit2_namecolumns.Text   + '" = ''' +  Edit3_keysearch.Text + '''';


просто интербейз строки требует заключать в одинарные кавычки, иначе он считает их наименованиями полей/переменных. а сами наименования полезно заключать в двойные. тогда никакой путаницы не будет.

и ещё. такие вещи лучше делать через параметры. т.е. запрос формировать вида SELECT * FROM <table> WHERE <fieldname> = :PARAM, а уже в коде перед открытием говорить IbQuery1.ParamByName ('Param').AsString := Edit1.Text. тогда никакого геморроя с кавычками не будет вообще.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 19-12-2004 11:39 » 

Вопрос еще такой. Как можно обратиться  к отдельной ячейки выведенной информации, мне тут советовали вот так IBQuery1.FieldByName('имя поля').asString (или Float и пр.), но это только к полю, а как еще к нужной строке.
Еще вопрос, есть какая-н. функция чтобы узнать выделенную ячейку и сней потом работать???
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 19-12-2004 11:57 » 

Кстати на счет кавычек, я уже пробовал, не выходило, сейчас еще попробовал опять не вышло.
А вот второй способ, этот запрос, где требуется параметр, его в хранимую процедуру надо засовывать?
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 19-12-2004 13:58 » 

если имеется в виду ячейка, выделенная в гриде - то у него есть свойство SelectedField. а для навигации по набору данных используются методы First, Prior, Next, Last, Locate, FindKey и т.д.

по второму вопросу - нет. обычная квери, просто в запросе вместо конкретного значения поля указываешь :<имя_параметра>. все названия после двоеточия считаются названиями параметров, и перед открытием квери они указываются в свойстве Params через индекс или имя. этот подход имеет ещё и тот плюс, что при прочих равных условиях параметрические запросы работают быстрее: поскольку фактический текст запроса остаётся тем же, сервер БД тратит меньше времени на обработку запроса при его повторном вызове.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 19-12-2004 15:03 » 

По второму вопросу понял.
А вот по-первому, Frst, Prior и т.д. разве это не для компонента TTable?
И неужели они жействуют  и для квери?

И вот еще вопрос, как можно узнать имя поля на которе щелкнули, имя записа я уже узнал как это IBQuery1.RecNo. А вот имя поля(или хотя бы номер) не нашел.

P.s. Я и на Дельфи не особо пишу, точнее вообще не пишу-это я пытаюсь вспомнить что знал и бодучить что пригодиться. На VC++ я не стал писать, потому как говорят геморрой просто необыкновенный.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 19-12-2004 15:05 » 

Кстати на счет поиска, то кавычки оказывается нужны были только где условие поиска (т.е. там где пишем что ищем).
Это я так для справки, кому интересно Улыбаюсь
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 19-12-2004 15:16 » 

First, Next и пр. работают для обеих компонентов.

когда ты щёлкаешь на поле в гриде, его имя ты как раз и узнаешь из TDbGrid.SelectedField. это обычное поле со всеми аттрибутами - FieldName, DisplayName, DataType, Size и т.д.

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

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 19-12-2004 15:23 » 

x77, Насчет RecNo это учту, спасибо.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 19-12-2004 15:32 » 

TDbGrid.SelectedField нет такого поля :?:  :?:  :?:
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 19-12-2004 15:39 » 

Цитата
Specifies the field component for the currently selected cell in the grid.

property SelectedField: TField;

Description

Set SelectedField to move focus to a particular field in the grid. Read SelectedField to obtain access to the field component for the currently selected cell. If there is not currently selected cell, SelectedField is nil. For example, when an entire row is selected, SelectedField is nil.


ты его часом не в инспекторе объектов ищещь? это run-time свовйство.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 19-12-2004 17:46 » new

Цитата

ты его часом не в инспекторе объектов ищещь? это run-time свовйство.


Да нет, я его ручками набивал, т.е. как ты написал, так я его и набил.
При нажатии комбинации клавиш CTRL->Space выскакивает вариант нужной функции, свойства и пр. и среди вариантов SelectedField не было. Пишу на Дельфи7.
Где я не прав???
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #13 : 19-12-2004 18:03 » 

это свойство грида, а не квери. на уровне потомков датасет нет такго понятия, как текущее поле, они оперируют с набором полей, т.е. - с записью.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 19-12-2004 18:57 » 

Не совсем понял последнее :oops:
И вот еще
 SELECT * FROM <table> WHERE <fieldname> = :PARAM
не выходит че-то у меня, делаю постаринки, примерчик нельзя кинуть, а то по-старинки оно как-то трудновато, в смысле ошибаюсь часто в чистописании
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 19-12-2004 19:08 » 

Хотел бы пояснить последний пост. По поводу второго вопроса, мне не понятно как это в Дельфе сделать и связать со всеми этими компонентами, ине например также непонятно, можно ли в Дельфе как-нибудь хранимую процедуру заделать (но об этом не сейчас). Вопросы у меня с Дельфей здесь в основном, т.к. я на ней почти не пишу.
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #16 : 19-12-2004 19:36 » 

Код:

IbQuery1.Sql.Text {= 'select * from table1 where field1 = {param1';
IbQuery1.ParamByName )'Param1':.AsString {= 'гы-гы-гы';
IbQuery1.Prepare;
IbQuery1.Open;


что именно непонятно по выделенному полю?
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 19-12-2004 20:14 » 

Все понял по выделенному полю.
Можно еще разок со своим незнанием напрягу и спрошу, а хранимую процедуру как делать???
P.s. Заранее извеняюсь, уже чувствую раздражени  Вот такой я вот е
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 19-12-2004 20:26 » 

НЕ в смысле как на SQL, а в смысле вставлять ее также чтоли, используя IBQyery1, там ведь писать придется явно больше чем в обычном запросе.
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #19 : 19-12-2004 21:27 » 

nikedeforest, нет, раздражения не было. по крайней мере, не в твой адрес. а вот то, что на 15 левеле с защитой под 60 инга меня выносит только в путь - вот это раздражает нефигово.

вставлять можно двумя способами.

1. через IbQuery
Код:
IbQuery1.Sql.Text {= 'select * from proc )a,b,c:';
IbQuery1.ExecSql;
res {= IbQuery1.Fields [0(.Value;


2. через IbStoredProc
Код:
IbStoredProc1.StoredProcName {= 'proc';
IbStoredPRoc1.ParamByName )'a':.Value {= a; // при необходимости, конечно
IbStoredProc1.ExecProc;
res {= IbStoredProc1.ParamByName )'a':.Value;
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 19-12-2004 21:30 » 

Думаю последний волпрос и к сожалению, понимаю, что до утра мне на него никто не ответит, поэтому придется выкручиваться самому. Ну вот вопрос:
как в Дельфи сделать так , чтобы запрос заносил значения в переменную, а не выводил (т.е. типа select max(pn) from table into :znach)?Вот этот znach и интересует.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 19-12-2004 21:33 » 

Пока не поздно. Спасибо х77 за внимание, ценные советы и за возню со мной, с меня пиво Улыбаюсь.
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #22 : 19-12-2004 21:37 » 

nikedeforest, а зачем? выполняй обычный запрос и считывай в переменную значения полей.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 19-12-2004 22:28 » 

Я знаю как можно обратиться ко всему полю
IBQuery1.FieldByName('NAME').AsString:=Edit3.Text;, при этом не знаю как считать с него,
я не знаю как обратиться к ячейке Жаль, поэтому начал пробовать миновать. Впридачу тут книжка попалась по Делфе и тут про ячейку тоже ничего, поэтому для меня пока это невозможно Жаль.
Я сколько не спрашивал у знакомых, так вразумительного ответа и не получал как можно считать значение из ячейки, а не из всего поля.
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #24 : 19-12-2004 23:04 » 

Edit3.Text := IbQuery1.FieldByName ('Name').AsString;
Edit3.Text := IbQuery1.Fields [n].AsString;
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 19-12-2004 23:24 » 

М-Да, если бы ты видел, как я обошелся без этого, обошелся-то удачно, но объемно. Спасибо за ответ.
Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 20-12-2004 12:54 » 

По поводу заключения строчек в кавычки при динамическом создании запроса. Перед подстановкой значения в строковой переменной все кавычки нужно продублировать, иначе будут: а) ошибки, б) потенциальная дыра в безопасности системы. Лучше всё же пользоваться параметрами.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #27 : 20-12-2004 13:25 » 

dimka, что за дыра?
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 20-12-2004 16:25 » 

На счет кавычек, то я взапросе их не ставил, ну не получилось у меня, я их ставлю, когда заношу значение в Edit'e к примеру и все нормально работает. Это тоже являет дырой в безопасности, по-моему врятли, тюкю в случае если кавычки не поставить, то ошибка выскакивает, а запрос туда вроде как и не вкатать, а можно еще сделать граничение кол-ва вводимых символов, ИМХО.
Записан

ещё один вопрос ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines