Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 11:26   #1
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию Поиск по базе данных

Добрый день.

Есть код, который осуществляет поиск по набранному номеру (колонка abonenta) в таблице billing за период даты (колонка Date, sDateEdit1.Text - начальная дата, sDateEdit2.Text - конечная дата)

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
sql:string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+sDateEdit1.Text+''' and date <= '''+sDateEdit2.Text+'''';
ADOQuery1.SQL.Add(sql);
try
ADOQuery1.Open;
except
application.MessageBox( 'Не могу выполнить запрос', 'Ошибка',MB_OK);
end;
end;
и есть запрос

Код:
sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+sDateEdit1.Text+''' and date <= '''+sDateEdit2.Text+'''';
который не правильно работает. Если я хочу найти набранный номер по всей таблице, я не устанавливаю начальную и конечную даты. И когда я нажимаю кнопку "найти", на DBGrid ни чего не выводится. Хотя данные по этому номеру точно есть. И также, если я хочу найти набранный номер по всей таблице с начальной датой, то тоже на DBGrid ни чего не выводит.

Я понимаю что сам запрос не идеален, поэтому прошу вас усовершенствовать данный запрос.
royun вне форума Ответить с цитированием
Старый 15.12.2011, 11:30   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если поиск по дате не делать, то и выбрасывайте условие на дату из запроса. СУБД откуда знает, что вы решили условие на дату не задавать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.12.2011, 12:46   #3
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Сделал так

Код:
if sDateEdit1.Text<>null and sDateEdit2.Text<>null then
begin
sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+sDateEdit1.Text+''' and date <= '''+sDateEdit2.Text+'''';
// Вывести текст запроса на экран
//application.MessageBox(PChar(sql), 'Текст запроса',MB_OK);
// Добавить стоку с текстом запроса
ADOQuery1.SQL.Add(sql);
try
// Выполнить запрос
ADOQuery1.Open;
// Обработать возможные ошибки
// при выполнении запроса
except
application.MessageBox( 'Не могу выполнить запрос', 'Ошибка',MB_OK);
end;
end
else
begin
sql:= 'SELECT * FROM billing WHERE [abonenta] = '''+ Edit1.Text + '''';
ADOQuery1.SQL.Add(sql);
try
// Выполнить запрос
ADOQuery1.Open;
// Обработать возможные ошибки
// при выполнении запроса
except
application.MessageBox( 'Не могу выполнить запрос', 'Ошибка',MB_OK);
end;
end;
Но теперь выводится ошибка

Could not convert variant of type (String) into type (Boolean)
royun вне форума Ответить с цитированием
Старый 15.12.2011, 15:13   #4
Brother Abbat
Пользователь
 
Регистрация: 03.11.2011
Сообщений: 34
По умолчанию

ставь проверку есть ченить в sDataEdit1 и sDataEdit2 или нет. Если есть, то
Код:
sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+sDateEdit1.Text+''' and date <= '''+sDateEdit2.Text+'''';
Если нет, то:
Код:
sql:= 'SELECT * FROM billing WHERE [abonenta] = '''+ Edit1.Text + '''';

Последний раз редактировалось Brother Abbat; 15.12.2011 в 15:19.
Brother Abbat вне форума Ответить с цитированием
Старый 15.12.2011, 15:22   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
if sDateEdit1.Text<>null and sDateEdit2.Text<>null then
С каких это пор свойство Text имеет тип Variant? И в скобки кто будет выражение сравнения брать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.12.2011 в 15:24.
Аватар вне форума Ответить с цитированием
Старый 15.12.2011, 17:24   #6
mmihan
Пользователь
 
Регистрация: 01.06.2009
Сообщений: 30
По умолчанию

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

а если вот так ?

Код:
Date >= '''+sDateEdit1.Text+'' 'OR Date IS NULL

и так для всех полей где возможно не буду введены данные..
mmihan вне форума Ответить с цитированием
Старый 16.12.2011, 13:35   #7
brick08
Пользователь
 
Аватар для brick08
 
Регистрация: 29.11.2011
Сообщений: 12
По умолчанию

Я думаю нужно так:
Код:
if (sDateEdit1.Text<>'') and (sDateEdit2.Text<>'') then
begin
sql:= 'SELECT * FROM billing where ([abonenta]='+Edit1.Text+') and (Date >= '+sDateEdit1.Text+') and (date <= '+sDateEdit2.Text+';);
brick08 вне форума Ответить с цитированием
Старый 17.12.2011, 11:46   #8
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

А я вот думаю, что надо читать что такое параметры в запросах.
И тогда идиотизма в вашем коде поубавится.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 19.12.2011, 07:00   #9
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
А я вот думаю, что надо читать что такое параметры в запросах.
И тогда идиотизма в вашем коде поубавится.
Так и сделаю. Всем спасибо за участие в теме.
royun вне форума Ответить с цитированием
Старый 21.12.2011, 09:18   #10
Gagarik
Пользователь
 
Регистрация: 14.11.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
А я вот думаю, что надо читать что такое параметры в запросах.
И тогда идиотизма в вашем коде поубавится.
Не факт что его станет меньше.
можно так
Код:
var BegDat,EndDat : string;

if sDateEdit1.Text<>'' then BegDat := sDateEdit1.Text else BegDat := '07.11.1917';
if sDateEdit2.Text<>'' then EndDat := sDateEdit1.Text else EndDat := DateToStr(Now+1);

sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+BegDat+''' and date <= '''+EndDat+'''';
Смысл в том, что-бы в место пустых дат подставить даты за границами существующих данных. Те даты которых в таблице нет.
Gagarik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по базе данных vmilyoshin БД в Delphi 5 11.09.2011 11:00
Поиск по базе данных WestDragon БД в Delphi 8 20.08.2011 19:55
Поиск в базе данных Egik_net БД в Delphi 3 17.02.2010 21:47
Поиск в базе данных St-Dyx Microsoft Office Excel 8 19.10.2008 12:13