Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.12;
Скачать: CL | DM;

Вниз

Подскажите как обойти глюк в фильтрации...   Найти похожие ветки 

 
Andrey__   (2003-05-22 11:13) [0]

Подскажите как обойти глюк в фильтрации...

Есть компонент TADOQuery
устанавливаю свойство
Filter := "((Cod_UU = 13) and (God = 2003)) OR
((Cod_UU = 15) and (God = 2003))"; - все работает

устанавливаю свойство
Filter := "((Cod_UU = 13) OR (Cod_UU = 15)) and
(God = 2003)"; - ошибка при попытке установить свойство Filtered := True;

подскажите, что не так...


 
Term   (2003-05-22 11:19) [1]

текст ошибки приведи


 
Andrey__   (2003-05-22 11:23) [2]

текст ошибки:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.


 
Term   (2003-05-22 11:27) [3]

попробуй всё взять в еще одни общие скобки т.е.
Filter := "(((Cod_UU = 13) OR (Cod_UU = 15)) and
(God = 2003))";


 
andrey__   (2003-05-22 11:30) [4]

делал и так - не помогло!


 
Stas ©   (2003-05-22 11:32) [5]

А чем тебя неустраевает это ((Cod_UU = 13) and (God = 2003)) OR
((Cod_UU = 15) and (God = 2003))"?


 
andrey__   (2003-05-22 11:42) [6]

Дело в том, что я написал упрощенный вариант. На самом деле у меня будет больше "OR" и "AND".


 
Term   (2003-05-22 11:46) [7]

а почему бы сразу запрос соответсвующим образом не строить


 
Соловьев ©   (2003-05-22 11:51) [8]


> andrey__ (22.05.03 11:42)

onFilterRecord там попроще...


 
andrey__   (2003-05-22 13:20) [9]

<а почему бы сразу запрос соответсвующим образом не строить>-дело в том, что данные всего запроса мне нужны, так как на клиенте такие расчеты, что иначе прийдется создавать слишком много запросов на сервер(для каждого условия), что будет намного дольше.

<onFilterRecord там попроще...> -

да следующее у меня выполняется

procedure TfmTabShag.qrSel30FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:= ((DataSet["Cod_UU"]=13) or (DataSet["Cod_UU"]=15)) and
(DataSet["God"]=2003);
end;

но у меня переменное количество условий объудиненых "OR" ((DataSet["Cod_UU"]=13) or (DataSet["Cod_UU"]=15 or ...) и "AND" и предусмотреть все варианты не возможно заранее. А в Filter строку всегда можно изменить.



 
KoluChi ©   (2003-05-22 13:28) [10]


> andrey__ (22.05.03 11:42)
> Дело в том, что я написал упрощенный вариант. На самом деле
> у меня будет больше "OR" и "AND".

всю строку можно увидеть?


 
Соловьев ©   (2003-05-22 13:29) [11]


> А в Filter строку всегда можно изменить

А кто тебе мешает написать функцию которая будет выдавать логическое значение по типу Filter?


 
andrey__   (2003-05-22 13:49) [12]

>всю строку можно увидеть?
нет т.к. заранее не известна( см. пред. ответ)

>А кто тебе мешает написать функцию которая будет выдавать логическое значение по типу Filter?

Я могу создать строку
"((DataSet["Cod_UU"]=13) or (DataSet["Cod_UU"]=15)) and
(DataSet["God"]=2003)"
или

"((Cod_UU = 13) OR (Cod_UU = 15)) and (God = 2003)"

и передать ее в процедуру, но как по это строке выполнить логическую операцию (вернуть True или False).


 
Соловьев ©   (2003-05-22 13:52) [13]


> Я могу создать строку

при создании и вычисляй.


 
andrey__   (2003-05-22 14:28) [14]

>при создании и вычисляй.
была такая строка st:
"((Cod_UU = 13) OR (Cod_UU = 15)) and (God = 2003)"
потом
"((Cod_UU = 13) OR (Cod_UU = 15)OR (Cod_UU = 124)) and (God = 2003)"
потом
"((Cod_UU = 13) OR (Cod_UU = 115)OR (Cod_UU = 12)) and (God = 2003) and (Мes = 5)"

если можеш приведи маленикий пример типа:

function Logical(st : string):Boolean;
begin
...//по строке выдаем результат. Как?
end;



 
Соловьев ©   (2003-05-22 14:30) [15]


> "((Cod_UU = 13) OR (Cod_UU = 15)) and (God = 2003)"
> потом
> "((Cod_UU = 13) OR (Cod_UU = 15)OR (Cod_UU = 124)) and (God
> = 2003)"
> потом
> "((Cod_UU = 13) OR (Cod_UU = 115)OR (Cod_UU = 12)) and (God
> = 2003) and (Мes = 5)"

как это получается?
код?


 
andrey__   (2003-05-22 14:57) [16]

>как это получается?
>код?

Ести запрос qrList_UU_P у которого след. поля
Cod_Pt / Cod_UU / Vid_En

и ести запрос qrSel30 у которого след. поля
Num_Min / Cod_UU / God / Mes / Den /Znach


qrSel30.Filtered := False;
St_UU :="";

//по определенным varCod_Pt и varVid_En
for I := 1 to qrList_UU_P.RecordCount do
begin
if (qrList_UU_PCod_Pt.Value=varCod_Pt ) and
(qrList_UU_PCod_Vid_En.Value=varVid_En) then
St_UU := St_UU+"Cod_UU = "+IntToStr(qrList_UU_PCod_UU.Value)
+" OR ";
qrList_UU_P.Next;
end;
//убиваю последнее OR
if St_UU <> "" then
St_UU := Copy(St_UU,1,Length(St_UU) - 4);

//определены: Rb_God, Rb_Mes, Rb_Den, Num_Min
qrSel30.Filter := "God = "+IntToStr(Rb_God)+" AND "+
"Mes = "+IntToStr(Rb_Mes)+" AND "+
"Den = "+IntToStr(Rb_Den)+" AND "+
"Num_Min = "+IntToStr(Num_Min)+" AND "+
"Cod_UU in "+St_UU;
qrSel30.Filtered := True; //выдает ошибку!


 
Соловьев ©   (2003-05-22 15:05) [17]



> "Cod_UU in "+St_UU;

St_UU должно быть вида (1,3,6,7,11)


 
andrey__   (2003-05-22 15:08) [18]

извини забыл поставить скобки (новая версия).

Ести запрос qrList_UU_P у которого след. поля
Cod_Pt / Cod_UU / Vid_En

и ести запрос qrSel30 у которого след. поля
Num_Min / Cod_UU / God / Mes / Den /Znach


qrSel30.Filtered := False;
St_UU :="";

//по определенным varCod_Pt и varVid_En
for I := 1 to qrList_UU_P.RecordCount do
begin
if (qrList_UU_PCod_Pt.Value=varCod_Pt ) and
(qrList_UU_PCod_Vid_En.Value=varVid_En) then
St_UU := St_UU+"(Cod_UU = "+IntToStr(qrList_UU_PCod_UU.Value)
+") OR ";
qrList_UU_P.Next;
end;
//убиваю последнее OR
if St_UU <> "" then
St_UU := "("+Copy(St_UU,1,Length(St_UU) - 4)+")";

//определены: Rb_God, Rb_Mes, Rb_Den, Num_Min
qrSel30.Filter := "(God = "+IntToStr(Rb_God)+") AND ("+
"Mes = "+IntToStr(Rb_Mes)+") AND ("+
"Den = "+IntToStr(Rb_Den)+") AND ("+
"Num_Min = "+IntToStr(Num_Min)+") AND "+
St_UU;
qrSel30.Filtered := True; //выдает ошибку!


 
andrey__   (2003-05-22 15:10) [19]

>St_UU должно быть вида (1,3,6,7,11)
пытался ,результат тот же.


 
Соловьев ©   (2003-05-22 15:11) [20]

посмотри чему равна строка фильтра перед присваиванием.


 
andrey__   (2003-05-22 15:22) [21]

>посмотри чему равна строка фильтра перед присваиванием.
посмотрел пустая ("") какая разница всеравно переприсваиваем.


 
Соловьев ©   (2003-05-22 15:27) [22]

я не правильно выразился, посмотри то что ты присваиваешь.


 
andrey__   (2003-05-22 15:43) [23]

>я не правильно выразился, посмотри то что ты присваиваешь.

то что я присваиваю имеет придлезительный вид:
qrSel30.Filtered := "(God = 2003) and (Мes = 5) and ((Cod_UU = 13) OR (Cod_UU = 115) OR (Cod_UU = 12))"; не работает

я эксперементировал если все OR заменить на AND все работает



 
Соловьев ©   (2003-05-22 15:46) [24]


> не работает

ошибка вида Andrey__ (22.05.03 11:23)?



 
andrey__   (2003-05-22 15:54) [25]

>ошибка вида Andrey__ (22.05.03 11:23)?

да


 
Соловьев ©   (2003-05-22 15:56) [26]

procedure TfmTabShag.qrSel30FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var temp_bool: boolean;
i: integer;
begin
temp_bool := true;
for i := 1 to qrList_UU_P.RecordCount do
begin
if (qrList_UU_PCod_Pt.Value=varCod_Pt ) and
(qrList_UU_PCod_Vid_En.Value=varVid_En)
then
temp_bool := temp_bool or (Cod_UU = "+IntToStr(qrList_UU_PCod_UU.Value);
qrList_UU_P.Next;
end;
Accept:= temp_bool;
end;



 
Соловьев ©   (2003-05-22 16:02) [27]


> or (Cod_UU

or (DataSet.FieldByName("Cod_UU").AsInteger=qrList_UU_PCod_UU.AsInteger);



 
andrey__   (2003-05-23 15:22) [28]

Соловьев спасибо помог.


 
andrey__   (2003-05-23 15:42) [29]

но всетаки кто нибудь подскажите
то что, когда я пишу
Filter := "((Cod_UU = 13) and (God = 2003)) OR
((Cod_UU = 15) and (God = 2003))"; - все работает

устанавливаю свойство
Filter := "((Cod_UU = 13) OR (Cod_UU = 15)) and
(God = 2003)"; - не работает

это глюк или я что-то делаю не так.
(для меня воспользоватся свойством Filter оптимальный вариант).



Страницы: 1 вся ветка

Текущий архив: 2003.06.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
1-34888
Mishenka
2003-05-31 12:23
2003.06.12
Как из программы запустить exe файл?


14-34966
Niki
2003-05-22 16:29
2003.06.12
TADOConnection.Attributes


14-35067
Дмитрий К.К.
2003-05-28 07:22
2003.06.12
Именинники 28 мая


9-34665
Ricks
2002-12-30 14:08
2003.06.12
Вопрос к знатокам Direct3D


14-35070
rosl
2003-05-28 09:20
2003.06.12
запустить на другом компе