Форум: "Базы";
Текущий архив: 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