Перейти к содержимому

Фотография

Фильтрация данных через TTable.FilterСкажите где я не прав?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 9

#1
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений
Люди, помогите. Просто никогда не работал с такими делами, первый раз как обычно всё комом.
В общем фильтрую данные, через таблицу. Вот кусок листинга:
...
ADOMainTable.Filter := 'Firma = '''+FirmaS+'''';
ADOMainTable.Filtered := True;
...

Если так как выше, то всё прекрасно работает и фильтруется. Но, мне необходимо фильтровать ещё
и по датам. Тогда листинг выглядит вот так:
...
ADOMainTable.Filter := '(Firma = '''+FirmaS+''')and';
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+Date1+''')or (Date <='''+Date2+'''))';
ADOMainTable.Filtered := True;
...
И всё перестает работать. Выводится сообщение следующего содержания: "Аргументы имеют неверный тип, выходят
за пределы допустимого диапазона или вступают в конфликт друг с другом".

Я почти наверняка уверен что дело в опострафах, или какой то синтаксической мелочи, но уже и так, и сяк пробовал,
менял количество, скобки, ничего не получается. Тыкните меня носом, где я не прав:smoke:
  • 0

#2
Kerberos

Kerberos
  • Постоялец
  • 334 сообщений
база не Access cлучайно?
у Акцесса даты вроде между символами # передаются....типа Date <= #01.01.2006#
  • 0

#3
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений
База, да на Акцессе. Ммм. То есть нужно сделать так:
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+#Date1#+''')or (Date <='''+#Date2#+'''))';
Попытаюсь, если я не так понял прошу исправить )

Неа, так не катит, на символ '#' Компилятор конечно же ругнулся, но даже когда я их поместил в опострофы в виде строки, ничего не поменялось, выводится всё таже ошибка :smoke:

(Та ошибка которую я описал в начале поста)
  • 0

#4
LiO

LiO

    Читатель

  • Гость
  • 44 сообщений

База, да на Акцессе. Ммм. То есть нужно сделать так:
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+#Date1#+''')or (Date <='''+#Date2#+'''))';
Попытаюсь, если я не так понял прошу исправить )

Неа, так не катит, на символ '#' Компилятор конечно же ругнулся, но даже когда я их поместил в опострофы в виде строки, ничего не поменялось, выводится всё таже ошибка :smoke:

(Та ошибка которую я описал в начале поста)


я тоже в свое время долга бился, то ей так не эток то то не то.
в конечном итоге сделал по другому - используйте в самом запросе родной тип TDateTime (он Double)
к примеру:

DSNDb.Execute('delete * from sessions where e_date<'+FloatToStr(Now));

и все
только смотрите какой в системе разделитель дробной части - "." аль ","
  • 0

#5
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений
Если я правельно понял то всё должно выглядеть примерно вот так:
...
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+FloatToStr(Date1)+''')or (Date <='''+FloatToStr(Date2)+'))''';
...
Если да, то Дельфя ругается следующим текстом:
[Error] MainUnit.pas(1310): There is no overloaded version of 'FloatToStr' that can be called with these arguments
[Error] ... тож самое и со вторым оператором.

Ну вместо Now() я тут юзал переменную типа TDateTime, как мне кажется разница не велика. В общем пока ничего не получается. Капризный это фильтр, по любому. Прошу ещё чем нить подсобить)
  • 0

#6
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений
В общем, начал я уже методом тыка фигачить, и Нафигачил! Система конечно, нипиль... Но работает :smoke:
Вот как должна была выглядить строка в Дельфи:
...
ADOMainTable.Filter := '[Firma] = '''+FirmaS+''''+' and '+'[Date] >= '''+Date1+''''+' and '+'[Date] <= '''+Date2+'''';
...
которая после компиляции имеет вид:
[Firma] = 'Logos' and [Date] >= '27.08.2006' and [Date] <= '27.08.2006'

Причем хочу обратить внимание, что тут важен каждый символ, даже каждый пробел, потому что если убрать пробелы окружающие слово 'and', то как обычно произойдёт сбой ... И ничего работать не будет... Но если они есть, можете спать спокойно )))

Спасибо всем за участие :)
  • 0

#7
LiO

LiO

    Читатель

  • Гость
  • 44 сообщений

Если я правельно понял то всё должно выглядеть примерно вот так:
...
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+FloatToStr(Date1)+''')or (Date <='''+FloatToStr(Date2)+'))''';
...
Если да, то Дельфя ругается следующим текстом:
[Error] MainUnit.pas(1310): There is no overloaded version of 'FloatToStr' that can be called with these arguments
[Error] ... тож самое и со вторым оператором.

Ну вместо Now() я тут юзал переменную типа TDateTime, как мне кажется разница не велика. В общем пока ничего не получается. Капризный это фильтр, по любому. Прошу ещё чем нить подсобить)



странно

var
s: string;
Date1,Date2:tdatetime;
begin
s:='((Date >='''+FloatToStr(Date1)+''')or (Date <='''+FloatToStr(Date2)+'))''';
end;

все прошло. выясните какой тип TDateTime у вас в вашей версии Делфи - если не double тогда дайте тип
хотя с каких это пор Делфи перестал дату и время в вещественных представлять....
  • 0

#8
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений


Если я правельно понял то всё должно выглядеть примерно вот так:
...
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+FloatToStr(Date1)+''')or (Date <='''+FloatToStr(Date2)+'))''';
...
Если да, то Дельфя ругается следующим текстом:
[Error] MainUnit.pas(1310): There is no overloaded version of 'FloatToStr' that can be called with these arguments
[Error] ... тож самое и со вторым оператором.

Ну вместо Now() я тут юзал переменную типа TDateTime, как мне кажется разница не велика. В общем пока ничего не получается. Капризный это фильтр, по любому. Прошу ещё чем нить подсобить)



странно

var
s: string;
Date1,Date2:tdatetime;
begin
s:='((Date >='''+FloatToStr(Date1)+''')or (Date <='''+FloatToStr(Date2)+'))''';
end;

все прошло. выясните какой тип TDateTime у вас в вашей версии Делфи - если не double тогда дайте тип
хотя с каких это пор Делфи перестал дату и время в вещественных представлять....

Наверное я просто вчера уже был не совсем адекватен и что нибудь напутал, что у меня не получилось с 'FloatToStr()'. Но зато получилось вообще хоть как то :smoke: Так что всё отлично) А в Дельфи у меня TDateTime Double и есть. Ещё раз спасибо за хелп.
  • 0

#9
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений
А основная ошибка у меня таки была в синтаксисе, во первых опострофы не верно были расставлены,
во вторых скобки шмобки не так я расставил, и потом как выяснил можно и без них, главное пробелы в нужных местах ставить. И ошибка была связанна именно с этим. Ну а то что касается Перевода даты в Доубл, тооо... Не могу ща сказать почему была ошибка, наверное реально я чего то напортачил там... :smoke:
  • 0

#10
Иксилимьюз

Иксилимьюз
  • Свой человек
  • 966 сообщений
Да всё верно ) DoubleToStr не работал потому что переменные Date1 и Date2 были уже типа String, я из Пикеров заливал туда дату как строку уже. Вот он и ругался что строку в строку заставляли его делать формат... Был я сонный и не адекватный) Просто для справки решил написать почему глюк был
Вот даже листинг:
...
Var
FirmaS: String[40];
Date1,Date2 : String[15];
...
Date1 := DateToStr(DateTimePicker1.Date);
Date2 := DateToStr(DateTimePicker2.Date);
...
ADOMainTable.Filter := ADOMainTable.Filter + '((Date >='''+FloatToStr(Date1)+''')or (Date <='''+FloatToStr(Date2)+'))'''; //Ну это было просто глупо с моей стороны :smoke:)
....
//Вот так правельно:
ADOMainTable.Filter := '[Firma] = '''+FirmaS+''''+' and '+'[Date] >= '''+Date1+''''+' and '+'[Date] <= '''+Date2+''''
...
  • 0


Количество пользователей, читающих эту тему: 2

пользователей: 0, неизвестных прохожих: 2, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.