Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фильтрация [D5, Accsess]


RDA ©   (2002-09-20 08:16:00) 

Проблемы с фильтрацией в Accsess через ADO. При попытке установить фильтр в дочерней таблице - ошибка "Нельзя фильтровать в дочерней таблице" - так ли это? И проблема фильтрации запроса по дате. Пишу так
Filter:="DATA>="""+Дата1+""""+" AND DATA<="""+Дата2+"""";


RDA   (2002-09-20 18:03:00) [1]

procedure TfmFilter.SetFilter;
const
Text="SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED=";
var
Str:String;
begin
with DM do
begin
QueryFilter.Active:=False;
QueryFilter.SQL.Clear;
if ENazv_P.Text<>"" then Str:=Str+" AND (NAZV_P="""+ENazv_P.Text+""")";
if ERRax_P.Text<>"" then Str:=Str+" AND (RRAX_P="""+ERRax_P.Text+""")";
if ENazv_O.Text<>"" then Str:=Str+" AND (NAZV_O="""+ENazv_O.Text+""")";
if ERRax_O.Text<>"" then Str:=Str+" AND (RRAX_O="""+ERRax_O.Text+""")";
//Сдесь ошибка у меня
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+Start_D.Date+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+Stopt_D.Date+")";
//
QueryFilter.SQL.Add(Text+PREDN_PRED.AsString+")"+Str);
QueryFilter.Active:=True;
end;
end;

Пробовал по разному - не получаеться. Подскажите если знаете.


ЮЮ   (2002-09-20 12:31:00) [2]

>P_PRED и NAZV_P оба длинное целое
Тогда не нужны "обрамляющие" кавычки для числа, как не нужны они и для даты


Anatoly Podgoretsky   (2002-09-20 12:28:00) [3]

Не стоит в запрос напрямую передавать дату, используй параметры


RDA   (2002-09-20 12:24:00) [4]

>> ЮЮ
P_PRED и NAZV_P оба длинное целое.
Ну да ладно. Переделал через параметр - работает но проблема снова с датой. Вот код:

procedure TfmFilter.SetFilter;
const
Text="SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED=:PRED)";
var
Str:String;
begin
with DM do
begin
QueryFilter.Active:=False;
QueryFilter.SQL.Clear;
if ENazv_P.Text<>"" then Str:=Str+" AND (NAZV_P="""+ENazv_P.Text+""")";
if ERRax_P.Text<>"" then Str:=Str+" AND (RRAX_P="""+ERRax_P.Text+""")";
if ENazv_O.Text<>"" then Str:=Str+" AND (NAZV_O="""+ENazv_O.Text+""")";
if ERRax_O.Text<>"" then Str:=Str+" AND (RRAX_O="""+ERRax_O.Text+""")";
//Все работает нормально
//Дата трабл.
if Start_Date.Text<>"" then Str:=Str+" AND (DATA>="""+Start_Date.Text+""")";
if Stopt_Date.Text<>"" then Str:=Str+" AND (DATA<="""+Stopt_Date.Text+""")";
QueryFilter.SQL.Add(Text);
QueryFilter.Parameters.ParamByName("PRED").Value:=PREDN_PRED.AsInteger;
QueryFilter.SQL.Append(Str);
QueryFilter.Active:=True;
end;
end;

Пробовал менять сроки с датой на

if Start_Date.Text<>"" then Str:=Str+" AND (DATA>="""+"#"+Start_Date.Text+"#"+""")";
if Stopt_Date.Text<>"" then Str:=Str+" AND (DATA<="""+"#"+Stopt_Date.Text+"#"+""")";
Не помогает. В базе установлен краткий формат даты "dd.mm.yy" - и именно так, в значении "19.09.02".

Всем большое спасибо за участие в решении проблемы.


sniknik   (2002-09-20 12:14:00) [5]

RDA ©
хочеш пришлю програмку для тестов запросов? приблизительный аналог Query Analizer-а из MSSQL только для разных баз. изначально именно под Access. архив 400кб. глядиш поможет.


ЮЮ   (2002-09-20 12:11:00) [6]

P_PRED и NAZV_P какого типа?


RDA   (2002-09-20 12:02:00) [7]

>>Johnmen - Спасибо.
Все, задолбался.
Теперь ошибка "Несоответствие типов данных в условии отбора данных".
Какое несоответствие не пойму все String в запросе.


Johnmen   (2002-09-20 11:06:00) [8]

(P_PRED="""+PREDN_PRED.AsString+""")"+" AND (NAZV_P="""+ENazv_P.Text+""")"


RDA   (2002-09-20 10:55:00) [9]

>>Johnmen, ЮЮ - Черт с ней с фильтрацией перешел на запрос и снова трабл. Помогите разобраться что не так.
Пишу
SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED="+PREDN_PRED.AsString+")"+" AND (NAZV_P="+ENazv_P.Text+")"
Пишет - Пропущен оператор в секции
(P_PRED="+PREDN_PRED.AsString+")"+" AND (NAZV_P="+ENazv_P.Text+")"


ЮЮ   (2002-09-20 10:48:00) [10]

Cудя по моему ответу, он должен быть #9/18/2002# :-)


Johnmen   (2002-09-20 10:46:00) [11]

>RDA ©

Да не нервничаю...
Если бы сразу привел значение (типа "18.09.02 "), то стало бы все ясно...
Впрочем, ответ уже дан ЮЮ © (20.09.02 09:54) :)))


RDA   (2002-09-20 10:15:00) [12]

>>Johnmen
Че ты нервничаешь, не понял я вопроса.
И если быть точным ты спрашивал про значения. Написал бы я тебе 18.09.02 (Это значение) - и что. Судя по ответу ЮЮ формат должен выглядеть #18.09.02#.


Johnmen   (2002-09-20 09:57:00) [13]

>RDA © (20.09.02 09:50)
>Текстовое представление даты.

Ты глумишься ? Или считаешь меня совсем дебилом ?

Я спрашивал про формат !!!



ЮЮ   (2002-09-20 09:54:00) [14]

В Accese формат даты несколько специфичен
#mm/dd/yyyy#, а не привычный "dd.mm.yyyy".
и спокойно пропускает #dd/mm/yyyy#. Так что в случае #11/12/2002#
не поймешь, то ли это 11 дек., толи 12 ноя.


RDA   (2002-09-20 09:50:00) [15]

Текстовое представление даты.


Johnmen   (2002-09-20 09:41:00) [16]

>ЮЮ © (20.09.02 09:15)

Именно так ! Внутренняя реализация Master-Detail построена, естественно, на фильтрах.

>RDA ©
>Filter:="DATA>=""""+Дата1+"""+" AND DATA<="""+Дата2+"""";

Каковы значения Дата1 и Дата2 ?



RDA   (2002-09-20 09:39:00) [17]

procedure TfmFilter.SetFilter; //формирование строки фильтра
var
Str:String;
begin
with DM do //ДатаМодуль
begin
QueryFilter.Filtered:=False;
//Первый параметр - Название плательщика
if ENazv_P.Text<>"" then Str:="NAZV_P="""+ENazv_P.Text+"""";
//Второй параметр - Счет плательщика
if ERRax_P.Text<>"" then
begin
if Str<>"" then Str:=Str+" AND RRAX_P="""+ERRax_P.Text+""""
else Str:="RRax_P="""+ERRax_P.Text+"""";
end;
//Третий параметр - Название получателя
if ENazv_O.Text<>"" then
begin
if Str<>"" then Str:=Str+" AND NAZV_O="""+ENazv_O.Text+""""
else Str:="NAZV_O="""+ENazv_O.Text+"""";
end;
//Четвертый параметр - Счет получателя
if ERRax_O.Text<>"" then
begin
if Str<>"" then Str:=Str+" AND RRAX_P="""+ERRax_O.Text+""""
else Str:="RRax_O="""+ERRax_P.Text+"""";
end;
// До этих пор все работает нормально а дальше ошибка
//"Приложение использует аргументы, которые имеют неверный тип, выходят за пределы допустимого диапазона или вызывают конфликт друг с другом."
//Две даты - от и до
if (Start_Date.Text<>"") and (Stop_Date.Text<>"") then
begin
if Str<>"" then Str:=Str+" DATA >="""+Start_Date.Text+""""+" AND DATA <="""+Stop_Date.Text+""""
else Str:="DATA >="""+Start_Date.Text+""""+" AND DATA <="""+Stop_Date.Text+"""";
end;
if (Start_Date.Text<>"") and (Stop_Date.Text="") then
begin
if Str<>"" then Str:=Str+" DATA >="""+Start_Date.Text+""""
else Str:="DATA >="""+Start_Date.Text+"""";
end;
if (Start_Date.Text="") and (Stop_Date.Text<>"") then
begin
if Str<>"" then Str:=" DATA <="""+Stop_Date.Text+""""
else Str:="DATA <="""+Stop_Date.Text+"""";
end;
QueryFilter.Filter:=Str;
QueryFilter.Filtered:=True;
end;
end;


ЮЮ   (2002-09-20 09:15:00) [18]

"Нельзя фильтровать в дочерней таблице",т.к.,вероятно, установлена фильтрация, обеспечивающая связь Master-Detail


Наверх

Титульная страница Поиск, карта сайта Написать письмо