Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 371
от 22.07.2007, 19:35

Администратор:Gh0stik
В рассылке:Подписчиков: 333, Экспертов: 39
В номере:Вопросов: 3, Ответов: 6


Вопрос № 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 появлялось сообщение , а при правильном показывало найденную строку
Спасибо зарание....
Отправлен: 17.07.2007, 03:59
Вопрос задал: Oneboyfriend (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: 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?
Вариант предварительного перечитывания записи из базы и изменения полей мне также кажется не очень эстетичным.
Отправлен: 17.07.2007, 11:28
Вопрос задал: Astralis Hingisman (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Виктор Пырлик
Здравствуйте, 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 ')
А вот теперь мне нужно, чтобы он видел только те, которые не пустые. как это записать я не знаю, помогите мне пожалуйста в этом.
Отправлен: 17.07.2007, 18:57
Вопрос задал: Мустафин Станислав Альфатович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Виктор Пырлик
Здравствуйте, Мустафин Станислав Альфатович!

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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.53 beta от 09.07.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное