Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Проблема с параметрами


Автор: Eva1 14.4.2006, 17:33
Всем привет!

БД MSAccess, механизм доступа ADO.

На форме имеются кнопки InputAplayButton (выбирает строки, значение поля дата, которых равно значению в переменной login_id)
Код

procedure TForm5.SortingAplayButtonClick(Sender: TObject);
begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select date, produce, price, login_id');
    ADOQuery1.SQL.Add('from Expenditure_Book');

    //сортировка по убыванию
if SortByDesc.Checked
then begin
    if flag=1
    then begin
    ADOQuery1.SQL.Add('where (date >= :d1) 
                                                and (date <= :d2) and (login_id = :l)');
    ADOQuery1.Parameters.ParseSQL.ADOQuery1.SQL.text, true);
                ADOQuery1.Parameters.ParamByName('d1').value:=
                DateToStr(SelectDate1.Date);
                ADOQuery1.Parameters.ParamByName('d2').value:=
                DateToStr(SelectDate2.Date);
    ADOQuery1.Parameters.ParamByName('l').value:=
                IntToStr(login_id);
                ADOQuery1.SQL.Add('order by date desc');
                end
               
                else begin
                ADOQuery1.SQL.Add('where login_id = :l');
    ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.text, true);
    ADOQuery1.Parameters.ParamByName('l').value:=
                IntToStr(login_id);
                ADOQuery1.SQL.Add('order by date desc');
               end;
    
end    
    // сортировка по возрастанию  ...
    
    // нет сортировки             ...
    
    ADOQuery1.Open;    
end;
,
SortingAplayButtonClick (сортирует по убыванию или возрастанию, если была нажата кнопка InputAplayButton строки, значение поля дата, которых равно значению в переменной login_id либо все строки).
Код

procedure TForm5.InputAplayButtonClick(Sender: TObject);
begin

    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select date, produce, price, login_id');
    ADOQuery1.SQL.Add('from Expenditure_Book');
    ADOQuery1.SQL.Add('where (date>=:d1) and (date<=:d2) 
                                                      and (login_id like :l)');
    ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.text, true);
    ADOQuery1.Parameters.ParamByName('d1').value:=
                DateToStr(SelectDate1.Date);
    ADOQuery1.Parameters.ParamByName('d2').value:=
                DateToStr(SelectDate2.Date);
    ADOQuery1.Parameters.ParamByName('l').value:=
                IntToStr(login_id);
    ADOQuery1.Open;

    flag=1;
end;

Если не была нажата кнопка InputAplayButton и нажать на кнопку SortingAplayButtonClick, то все нормально.
Если нажать на кнопку InputAplayButtonи и не нажать на кнопку SortingAplayButtonClick, то все нормально.
Если была нажата кнопка InputAplayButton(flag=1) и далее нажать на кнопку SortingAplayButtonClick, то вызывается ошибка "Отсутствует значение одного или нескольких параметров" (никаких параметров, кроме d1, d2, l, больше нет).
Что необходимо сделать, чтобы запрос нормально выполнялся?
ЗАРАНЕЕ СПАСИБО!

Автор: SPrograMMer 16.4.2006, 01:05
Цитата(Eva1 @ 14.4.2006, 17:33 Найти цитируемый пост)
чтобы запрос нормально выполнялся
было уже.... "проблема с датами в Access`e"....
Дату нуно обрамить спец символами, кажется решёткками, т е:
Код

...where (date>=#:d1#) and (date<=#:d2#)....


Автор: Eva1 16.4.2006, 23:26
SPrograMMer,

Так выводит ошибку:
"Не правильный формат даты 
where (date>=#d1#) and (date<=#smile2#) and (login_id like '14')".

Можно с датами вообще без параметров обойтись?

Заранее спасибо!

    

Автор: Pakshin A. S. 16.4.2006, 23:34
А может стоит открыть Access, составить там вопрос (через конструктор) и уже от него отталкиваться? 

Автор: Eva1 16.4.2006, 23:38
В конструкторе пишется такой формат даты #10\10\2000#, еще куча скобок, где надо, был испробован такой вариант и все равно ошибки с форматом, когда используются параметры ошибок с форматом нет, зато ошибки с параметрами. 

Автор: McDevil 17.4.2006, 00:03
Цитата(Eva1 @  14.4.2006,  17:33 Найти цитируемый пост)
where (date>=smile1) and (date<=smile2

Было бы интересно если бы он работал... smile 
У меня время в нете кончается с минуты на минуту поэтому буду предельно краток, если что  непонятно извените уж...
И ваш первый топик я не читаю боюсь времени не хватит, но по топику SPrograMMer кажется догнал суть вопроса...
Писать надо так:
Код

 ...
 ADOQuery1.SQL.Add('where (date>='+DateToStr(d1)+') and (date<='+DateToStr(d2)+')')
 ...

Надеюсь, что вы поймете
Удачи...  smile    

Автор: Eva1 17.4.2006, 00:14
McDevil, 
Я так обязательно попробую, но уже получается решить проблему такой записью
'where ( date >= DateValue('''  + '10.10.2000' + ''') ) ....

Большое всем спасибо! 

Автор: Eva1 19.4.2006, 23:28
В одном месте приложения перестает появляться ошибка  "Отсутствует значение одного или нескольких требуемых параметров", в другом появляется. У меня нет не единой строчки про параметры (в ресурсах тоже не заданы)  и вылезает эта...
Код

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select fio, address, telephone, birtday, login_id');
ADOQuery1.SQL.Add('from Address_Book');
ADOQuery1.SQL.Add('where login_id = ' + IntToStr(login_id));
ADOQuery1.Open;


Кто-нибудь может подсказать из-за чего м. б. эта ошибка? 
(БД - MSAccess, механизм доступа - ADO) 

Автор: Savek 20.4.2006, 15:00
Возможно ошибка в названии одного из полей 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)