Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
4-35120
Psibug
2003-04-14 09:05
2003.06.12
визуальные стили Windows XP


1-34827
nikulin
2003-05-30 11:43
2003.06.12
Как разместить пункт меню?


14-34975
Ork
2003-05-28 19:31
2003.06.12
doc files компоненты


14-35073
Kaktuss
2003-05-28 08:26
2003.06.12
InstallShield Express и BDE


3-34746
Maxxx
2003-05-23 11:39
2003.06.12
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский