Вопрос № 95366: Помогите пожалуйста
Работаю с Ado
така проблема:
if AdoTable.Filter='mod='+QuotedStr(edit1.text) then
AdoTable.Filter='mod='+QuotedStr(edit1.text) - это почемуто не выполняется действие
else
ShowMessage('ничего не найдено...Вопрос № 95399: Есть такая ситуация в Delphi6 при использовании ADO:
Имеется сложное многотабличное представление (VIEW) в MSSQL
и написаны все небходимые триггеры типа INSTEAD OF для для того чтобы он был редактируемым. В представлении имеется поле, которое...Вопрос № 95463: Здравствуйте, вот такой вот вопросик возник у меня: ранее я выводил в DBGrid только те значения которые not null, выглядело это так:
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NOT NULL ')
А вот теперь мне нужно, чтобы он видел только те...
Вопрос № 95.366
Помогите пожалуйста
Работаю с Ado
така проблема:
if AdoTable.Filter='mod='+QuotedStr(edit1.text) then
AdoTable.Filter='mod='+QuotedStr(edit1.text) - это почемуто не выполняется действие
else
ShowMessage('ничего не найдено')
Даже если в таблице есть даные при поиске в столбце mod всёровно срабатывает showmessage
Подскажите, а вернее напишите как правильно сделать, чтобы при при не найденном слове или цифре в edit1.text появлялось сообщение , а при правильном показывало найденную строку
Спасибо зарание....
Отвечает: Shveps
Здравствуйте, Oneboyfriend!
Я так понял, что вы в заданном наборе данных ищете строку с заданным условием ? А то что вы выполняете в вашем коде - это фильтрация по критерию в виде строки. Чтобы фильтр работал надо выставить свойство Filtered в true. Тогда в вашем датасете останутся строки с заданным условием (хотя физически остальные строки не удалятся). Сброс Filtered в false вернет все обратно.
Для поиска нужного значения лучше использовать метод Locate. В качестве первого значения указывается поле поиска, второе - значение поля и третье - параметры. Про параметры написано в справке Delphi. Но применительно к полям типа числовые значения надо указывать чило полностью. Хотя в строковых полях позиционирование происходит даже если найдена часть вашего значения.
--------- Пиво ф топку !!! Водку Тоже !!!
Ответ отправил: Shveps (статус: 3-ий класс)
Ответ отправлен: 17.07.2007, 10:55
Отвечает: Djec
Здравствуйте, Oneboyfriend!
Вы неправильно написали фильтр. Значение должно быть в кавычках тоже. С учетом этого получается след:
AdoTable.Filter='mod='''+QuotedStr(edit1.text)+''''
Сейчас должно работать. Проверить я не смог, но у меня был такой пример из практики.
--------- Никогда не сдавайся, даже если боишься проиграть
Ответ отправил: Djec (статус: 2-ой класс)
Ответ отправлен: 17.07.2007, 11:42
Отвечает: Виктор Пырлик
Здравствуйте, Oneboyfriend!
procedure TForm1.Button1Click(Sender: TObject);
begin
if AdoTable.Filter='mod='+QuotedStr(edit1.text) then
begin
AdoTable.Filter :='mod='+QuotedStr(edit1.text);
Label1.Caption := 'mod='+QuotedStr(edit1.text);
end
else
ShowMessage('ничего не найдено');
end;
-------------------------
Это текст процедуры, которая работает у меня (по вашему коду) - для проверки, я просто ввел в ADOTable.Filter строку mod='Edit1' - на стадии проектирования. всё работает.
Но, мне не понятно, причем данные в таблице и строка? Filter - это просто строка произвольная, определенная вами, и к данным не имеет никакого значения.
Для поиска надо
или, используя вашу конструкцию:
AdoTable.Filtered := false;
AdoTable.Filter='mod='+QuotedStr(edit1.text);
AdoTable.Filtered := true;
if( ADOTable.RecordCount >0) then
MessageBox('запись есть')
else
MessageBox('записи нет')
или испольлзовать более еффективный метод Kocate:
if(NOT ADOTable.Locate('mod',Edit1.Text,[loCaseInsensitive]) then
MessageBox('записи нет');
----------------
loCaseInsensitive - флаг говорящий о не чувствительности к регистру
loPartialKey - флаг говорящий о возможном частичном совпадении
эти флаги можно как комбинировать, так и по отдельности.
В вашем же случае, строка Filter и строка 'mod='+QuotedStr(edit1.text) не равны.
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: 10-ый класс)
Ответ отправлен: 17.07.2007, 14:22
Вопрос № 95.399
Есть такая ситуация в Delphi6 при использовании ADO:
Имеется сложное многотабличное представление (VIEW) в MSSQL
и написаны все небходимые триггеры типа INSTEAD OF для для того чтобы он был редактируемым. В представлении имеется поле, которое является всегда уникальным и по сути может считаться первичным ключом.
Однако принекоторых ситуациях триггер может изменить содержимое изменяемой записи, результате метод Refresh выдает известную ошибку о невозможности произвести обновление. Есть простое решение - использовать вместо Refresh метод Requery, однако это слишком банально. Использование опции обновления по автокриментному полю (опции resync update) также не получается, поскольку автоинкрементное поле в представлении является просто целочисленным.
Можно ли сделать так что бы метод Refresh производил обновление считая некоторое заданное поле как бы ключевым и как полю в представлении статус как бы первичного ключа?
Можно ли вручную задать SQL-запрос для для метода Refresh, как это делается в компонентах FibPuls?
Вариант предварительного перечитывания записи из базы и изменения полей мне также кажется не очень эстетичным.
Отвечает: Виктор Пырлик
Здравствуйте, Astralis Hingisman!
Нет, вы работаете с запросом. Возможность MS SQL 2000 и выше, использовать индексы в запросах – опция SCHEMABINDING, при создании VIEW, но по заявления MS данная опция не реализуется через ADO в разработках программного обеспечения. Всегда стоит попробовать :)
Метод рефреш, также работает с resync update. По сути, все три метода – Open, Requery, Refresh – это выборка данных с сервера и разница между в реализации.
Вы не можете «вручную» записать запрос SQL для Requery и Refresh. Иначе, определение «повторить запрос» и «обновить» просто потеряли бы смысл.
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: 10-ый класс)
Ответ отправлен: 17.07.2007, 15:22
Вопрос № 95.463
Здравствуйте, вот такой вот вопросик возник у меня: ранее я выводил в DBGrid только те значения которые not null, выглядело это так:
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NOT NULL ')
А вот теперь мне нужно, чтобы он видел только те, которые не пустые. как это записать я не знаю, помогите мне пожалуйста в этом.
Отвечает: Виктор Пырлик
Здравствуйте, Мустафин Станислав Альфатович!
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NULL ') - пустые
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NOT NULL ') - не пустые
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: 10-ый класс)
Ответ отправлен: 17.07.2007, 19:06
Не совсем понятен вопрос, так как вы пишете что сначала вы выводили те значения которые NOT NULL так
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NOT NULL ')
а потом вы пишете "А вот теперь мне нужно, чтобы он видел только те, которые не пустые" т.е. в принципе вам нужно тоже самое, но будем исходить из того что вы ошиблись и вам нужны Пустые.
в данном случае соглашусь с экспертом Виктор Пырлик, хочу только заметить что
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NULL ')
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) IS NOT NULL ')
эти команды больше применимы к числовым полям, используя текстовые поля желательно делать
WHERE pole='' WHERE pole<>''
т.е. равно и не равно пустой строке, в вашем случае
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+']) =''''')
adoquery7.SQL.Add('WHERE (['+dbedit8.Text+'])<>''''')
--------- Я знаю что ничего не знаю, но я знаю больше, чем тот кто думает что знает все
Ответ отправил: Кэр Лаэда (статус: Студент)
Ответ отправлен: 18.07.2007, 04:14