Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сфильтровать параметры / 10 сообщений из 10, страница 1 из 1
03.05.2007, 17:04
    #34502975
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
При нажатии кнопки ОК в запрос передаются параметры
...sell.csp?SMark=&SYearS=&Volume=&SBody=&PriceS=&SYearPo=&PricePo=
Нужно чтобы запрос выполнялся при любой комбинации параметров, выложите кусок кода, который проверяет существеут ли параметр и если да, то учитывает или не учитывает его, взависимости от выбранного значения.
Заранее благодарен.
...
Рейтинг: 0 / 0
03.05.2007, 18:35
    #34503278
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
смотрите класс %CSP.Request
обращаться в нему через переменную %request

например %request.Get("Volume")
...
Рейтинг: 0 / 0
03.05.2007, 19:49
    #34503409
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Я не это имел ввиду, вот запрос

Query GetAd(Mark As %String, Ys As %String, Ypo As %String, V As %String, BT As %String, Pri1 As %String, Pri2 As %String) As %SQLQuery
{
select *
FROM Salon.Advertisement as SA,Salon.Mark as SM,Salon.Body as SB
where SA.Mark=SM.ID
and SA.BodyType=SB.ID
and SM.ID=:Mark
and SA.DofProd between :Ys and:Ypo
and SA.Volume=:V
and SB.ID=:BT
and SA.Price between :Pri1 and :Pri2
}

Но он работает только если из формы передаются ВСЕ 7 параметров. Если-же 1 из них пустой, то запрос не работает. Можно конечно написать тыщу миллионов ифов и столько-же запросов для каждой комбинации, но лучше подскажите(а лучше выложите) кто сталкивался код, который будет фильтровать параметры и откидывать их, если он пустой.
Заранее благодарен.
...
Рейтинг: 0 / 0
04.05.2007, 05:01
    #34503725
solwolf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Bednii_Student
.......
Но он работает только если из формы передаются ВСЕ 7 параметров. Если-же 1 из них пустой, то запрос не работает. Можно конечно написать тыщу миллионов ифов и столько-же запросов для каждой комбинации, но лучше подскажите(а лучше выложите) кто сталкивался код, который будет фильтровать параметры и откидывать их, если он пустой.
Заранее благодарен.
SQL выражение это по сути своей строка символов. SQL имеет свой синтаксис и если у Вас SQL запрос определен в классе на сервере, то изменить его уже нельзя. Единственное что можно менять, так это значения параметров. Если у Вас параметра нет или он пустой, то получается в строке используется неизвестная переменная и поэтому SQL дает ошибку. В этом случае можно решить проблемму используя команду $Get. Вы просто перестраховываетесь и проверяете значение переменной, то есть в любом случае в параметр уйдет какое то значение и ошибки не будет. CSP страница для примера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<HTML>
<HEAD>
<TITLE>	Cache Server Page </TITLE>
</HEAD>
<BODY>
<script language="cache" runat="server">
//Определяем значения параметров, если не существует то присваивается
//значение по умолчанию Test1.
s %request.Data("Param1")=$Get(%request.Data("Param1"),"Test1")
s %request.Data("Param2")=$Get(%request.Data("Param2"),"Test1")
</script>

<!--Вызов запроса который определен в классе на сервере  p1 и p2 параметры-->
<csp:query Name="AllInfo" classname="Main.MyClass" queryname="MyQuery" 
p1=#(%request.Data("Param1"))# p2=#(%request.Data("Param2"))#>		

<!--Вывод на страницу результата запроса-->
<table id="_ChelTabl" border="1">
	<th>Articles</th><th>Notes</th>
	<csp:while condition="AllInfo.Next()">
	<tr bgcolor="" style="font:12pt">
		<td>#(AllInfo.Data("Articles"))#</td><td>#(AllInfo.Data("Notes"))#</td>
	</tr>
	</csp:while>
</table>
</BODY>
</HTML>
Если у Вас в строке SQL выражения в зависимости от условий должны добавляться или удаляться параметры, то здесь без описания условий просто не обойтись. А в скрипте уже можно все описать так, как Вашей душе будет угодно. Все зависит от Вашей фантазии. Вот примерный вариант, я описал только два условия.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<HTML>
<HEAD>
<TITLE>	Cache Server Page </TITLE>
</HEAD>
<BODY>
<script language="cache" runat="server">
//В скрипте можно учесть все возможные варианты
s %param1="Test1"
s %param2="Test1"
if %param1="" {
	s %Zapros=##class(%ResultSet).%New()
	d %Zapros.Prepare("SELECT * FROM Main.MyClass WHERE Articles=?")
	d %Zapros.Execute(%param2)
}
if %param2="" {
s %Zapros=##class(%ResultSet).%New()
d %Zapros.Prepare("SELECT * FROM Main.MyClass WHERE Notes=?")
d %Zapros.Execute(%param1)
}
</script>
<!--Вывод на страницу результата запроса-->
<table id="_ChelTabl" border="1">
	<th>Articles</th><th>Notes</th>
	<csp:while condition="%Zapros.Next()">
	<tr bgcolor="" style="font:12pt">
		<td>#(%Zapros.Data("Articles"))#</td><td>#(%Zapros.Data("Notes"))#</td>
	</tr>
	</csp:while>
</table>
</BODY>
</HTML>
Класс MyClass определен в пакете Main, в нем же определен запрос MyQuery
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Class Main.MyClass Extends %Persistent [ ClassType = persistent, ProcedureBlock, TimeChanged = "60754,36135.803769" ]
{

Property Articles As %String;

Property Notes As %String;


Query MyQuery(Param1 As %String, Param2 As %String) As %SQLQuery
{
SELECT Articles,Notes FROM MyClass
 WHERE (Articles = :Param1 AND Notes = :Param2)
}

}

...
Рейтинг: 0 / 0
06.05.2007, 13:46
    #34507623
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Функция $Get(%request.Data("Param1"),"Test1") проверяет существует ли "Param1", а то, что
"Param1"=пустому значение нет. Поэтому не работает.
Есть еще варианты кроме условных конструкций?
...
Рейтинг: 0 / 0
06.05.2007, 19:15
    #34507949
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Если в запросе

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select *
FROM Salon.Advertisement as SA,Salon.Mark as SM,Salon.Body as SB
where SA.Mark=SM.ID
and SA.BodyType=SB.ID 
and SM.ID=:Mark 
and SA.DofProd between :Ys and:Ypo
and SA.Volume=:V
and SB.ID=:BT
and SA.Price between :Pri1 and :Pri2

у вас стоит and SA.Volume=:V, то как должно обрабатываться это условие по вашему?
Есть язык настолько сообразительный, что без условных коснтрукций выбросит эту строку целиком?

Возможно вам подойдет динамический запрос (не без условных конструкций!)
Примерно так, на отсутствие синтаксических ошибок не проверял

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")
 s sql="Salon.Advertisement as SA,Salon.Mark as SM,Salon.Body as SB where SA.Mark=SM.ID and SA.BodyType=SB.ID  "
 s:Mark'=""  sql=sql_" and SM.ID="_Mark 
 s:(Ys'="")&&(Ypo'="")  sql=sql_" and SA.DofProd between "_Ys_" and "_Ypo
 s:V'="" sql=sql_" and SA.Volume="_V
 s:BT'="" sql=sql_" and SB.ID="_BT
 s:(Pri1'="")&&(Pri2'="")  sql=sql_" and SA.Price between "_Pri1_" and "_Pri2

 set sc=result.Prepare(sql)
 If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
 Set sc=result.Execute() If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
 While result.Next(.sc) 
   {If $$$ISERR(sc) Quit
     Write result.Data("Name"),result.Data("Salary"),!
   }
If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
Пример взят из документации http://127.0.0.1:8972/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=SIRENA&CLASSNAME=%25Library.RemoteResultSet
и переделан под ваш запрос. В запросе я подразумевал, что все поля числове, для текстовых например нужно добавить кавычки.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.01.2011, 02:23
    #37053704
Аленочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Ну намудрили =)) Я конечно понимаю что вопрос 3-хлетней давности, но все же...
А что ISNULL уже отменили ;-)) ???

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
FROM Salon.Advertisement as SA,Salon.Mark as SM,Salon.Body as SB
WHERE SA.Mark=SM.ID 
AND SA.BodyType=SB.ID 
AND (SM.ID=:Mark OR :Mark IS NULL)
AND (SA.Volume=:V OR :V IS NULL)
AND (SB.ID=:BT OR :BT IS NULL)

только с диапазонами надо подумать, т.к. есть 2 границы верхняя и нижняя
самое простое - при отсутствии хотя бы одной границы - считать блок условия как TRUE, т.е.

Код: plaintext
AND ((:Pri1 IS NULL OR :Pri2 IS NULL ) OR SA.Price BETWEEN :Pri1 AND :Pri2) 
...
Рейтинг: 0 / 0
12.01.2011, 08:06
    #37053765
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
На самом деле я бы предпочел сделать с конструктором строки запроса, так как есть подозрения, что в вашем случае будут задействованы не те индексы (условия по полям, которые несущественны).

Кроме того, я не уверен (проверять лень), что ISNULL будет работать с определенными внешними переменными, а они скорее всего будут определены. Я бы написал так: OR :Mark =""
...
Рейтинг: 0 / 0
14.01.2011, 05:09
    #37058147
Аленочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Я давно использую аналоги приведенного примера в рабочей системе, работает замечательно.
Не стоит бояться ISNULL - он не кусается ;=))
...
Рейтинг: 0 / 0
14.01.2011, 05:35
    #37058154
Аленочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сфильтровать параметры
Блок А.Н.На самом деле я бы предпочел сделать с конструктором строки запроса, так как есть подозрения, что в вашем случае будут задействованы не те индексы (условия по полям, которые несущественны).
вот на счет этого соглашусь.
если формировать строку запроса до того, как он попал к оптимизатору, и выкинуть из него 100% не существенные условия (то есть те, которые просто не должны там учитываться) - оптимизатору будет проще построить более оптимальный план выполнения запроса и он будет выполняться быстрее
ситуацию может отчасти спасти покрывающий индекс по всем полям, используемым в условии, но всеравно план выполнения запроса будет не оптимальным.

просто у топикстартера слишком много неопределенных параметров, у меня на практике как правило 1-2 параметра бывают, когда скоренько надо сделать какой-то отчет считаю что решение с ISNULL подходит
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сфильтровать параметры / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]