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

например %request.Get("Volume")
...
Рейтинг: 0 / 0
Сфильтровать параметры
    #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
Сфильтровать параметры
    #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
Сфильтровать параметры
    #34507623
Bednii_Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функция $Get(%request.Data("Param1"),"Test1") проверяет существует ли "Param1", а то, что
"Param1"=пустому значение нет. Поэтому не работает.
Есть еще варианты кроме условных конструкций?
...
Рейтинг: 0 / 0
Сфильтровать параметры
    #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
Период между сообщениями больше года.
Сфильтровать параметры
    #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
Сфильтровать параметры
    #37053765
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле я бы предпочел сделать с конструктором строки запроса, так как есть подозрения, что в вашем случае будут задействованы не те индексы (условия по полям, которые несущественны).

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

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


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