Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
Подскажите, пожалуйста, как в хранимую процедуру через входной параметр добавить в where свое условие?

У меня в классе cache есть хранимая процедура
ClassMethod OFREPORTS66GETSQL(dt1 As %Date = NULL, dt2 As %Date = NULL, condition As %String) As %String [ SqlName = OFREPORTS66GETSQL, SqlProc ]

Внутри у нее длинный select:
s SQLText = " Select "_
	" a.Schet_Balance_id, a.SCHET_BALANCE_CODE, a.CARD_NO, a.INVENT_NO, "_
	" a.ID_BACards, a.Card, a.NAME_FULL, a.Cipher_ID, a.Cipher_CODE, a.SROK_POLEZ_ISPOLZ, "_
	" DATEDIFF('yy',a.DOC_VVODA_V_EXPL_DATA,'"_dt2_"') SROK_FACT, "_
....................................продолжение...................................
" WHERE DATEPART('yy',Document->RegDate) = DATEPART('yy','"_dt1_"')"_
" BAFR_GET_RUSH_CODE(1,Card->Rush->CODE,Card->RushOffBudget->CODE,ISNULL(SummaBudget,0),ISNULL(SummaOffBudget,0)) RUSH_ALL_CODE,"_
" AND DATEPART('yy',a.DOC_VVODA_V_EXPL_DATA)>2006 "_
[b]condition_[/b]
" GROUP BY a.REFMOL_ID,a.Card,a.Schet_Balance_id"_	
	" HAVING (SUM(a.KOLICHNACH)<>0 or SUM(a.KOLICHOST)<>0)"	
	s ^A=SQLText		
	q SQLText


Дату и условия я формирую в fastreporte (дата тип Date из DateEdit, а condition типа String из Edit например( 'AND a.RUSH_ALL_CODE='2/2' ')), в ADOQuery вызываю процедуру CALL OFREPORTS66GETSQL(:dt1,:dt2,:condition) и передаю значения.

Дата подставляется в select хорошо , а вот condition типа String не хочет. Можно ли в процедуре cache в select подставить входной параметр типа String?
15 ноя 18, 18:06    [21735523]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 99
Вам следует использовать ODBC формат.
Дату передавать в формате '2018-11-16'

И при выполнении запроса указывать что выражение в ODBC формате.

 SET tStatement = ##class(%SQL.Statement).%New()
 SET tStatement.%SelectMode=1 // ODBC
15 ноя 18, 22:04    [21735728]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 99
" AND DATEPART('yy',a.DOC_VVODA_V_EXPL_DATA)>2006 "_
[b]condition_[/b]
" GROUP BY a.REFMOL_ID,a.Card,a.Schet_Balance_id"_


А что это за bb?
[b] [/b]

Наверно должно быть так?

" AND DATEPART('yy',a.DOC_VVODA_V_EXPL_DATA)>2006 "
 _condition
 _ " GROUP BY a.REFMOL_ID,a.Card,a.Schet_Balance_id"_
15 ноя 18, 22:10    [21735731]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 937
druzhok
Дата подставляется в select хорошо, а вот condition типа String не хочет.
Вы дату не подставляете, вы ее вклеиваете ... в 2018 ... :\
s sql($i(sql)) = "Select ... From ... "
s sql($i(sql)) = " Where datefield1 = ? ", qp($i(qp)) = date1 // qp - query params
s sql($i(sql)) = condition
s sql($i(sql)) = " And datefield2 = ? ", qp($i(qp)) = date2
s rs = ##class(%SQL.Statement).%ExecDirect( .stm, .sql, qp... )
d rs.%Display()
16 ноя 18, 01:08    [21735881]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
vassil, хотел жирным выделить
16 ноя 18, 08:33    [21735922]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
doublefint,
а можно ли полностью условие вклеить
AND a.Field IN (c1, c2)
у меня просто на форме если пользователь отметил несколько позиций, тогда нужно вставить
AND a.Field IN (c1, c2)
, а если одну позицию тогда
AND a.Field = c1
ну и если ничего не выбрано тогда ничего не вставляем?
16 ноя 18, 08:38    [21735923]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
logist
Member

Откуда: InterSystems
Сообщений: 262
druzhok,

А в ^A condition подставляется? Похоже, что оно не работает на этапе передачи, а не на этапе формирования строки. Попробуйте сделать ^B=condition -- похоже, что оно пустое и надо разбираться что происходит на уровне выше.

Тот код что Вы привели похож на правильный, и все должно корректно подставляться. Не забывайте, что подстановка кода - большая дыра в безопасности.
16 ноя 18, 08:39    [21735924]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
я имею ввиду чтобы динамически можно было формировать select
16 ноя 18, 08:40    [21735925]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
logist
Member

Откуда: InterSystems
Сообщений: 262
druzhok,

Ну его и можно динамически формировать -- похоже что в сам метод пустое условие передается.
16 ноя 18, 08:42    [21735926]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 99
Есть еще функция todate()

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_todate
16 ноя 18, 08:43    [21735927]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
logist
Member

Откуда: InterSystems
Сообщений: 262
vassil,

Да вроде у топик стартера как раз с датой нет проблем


druzhok
Дата подставляется в select хорошо
16 ноя 18, 08:44    [21735928]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
С датой все отлично, проблемы с присоединением условия.
16 ноя 18, 08:59    [21735935]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
logist
Member

Откуда: InterSystems
Сообщений: 262
druzhok,

Ну так оно в метод то передается?
16 ноя 18, 09:03    [21735938]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 99
druzhok,

А точно, не так предложение прочитал)
16 ноя 18, 09:17    [21735940]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
logist,

да, действительно, ничего не передается, подскажите, может перекомпилить надо, у меня задача изменить уже давно написанный класс, раньше вызывали из fastreporta запрос
Query OFREPORTS66GETDATA(dt1 As %Date = NULL, dt2 As %Date = NULL) As %Query ............
затем в классе вызывали метод
ClassMethod OFREPORTS66GETDATAExecute(ByRef qHandle As %Binary, dt1 As %Date = NULL, dt2 As %Date = NULL) As %Status
, а внутри него вызов метода где формируется select, в который мне нужно подсунуть условие
s rs=##class(%Library.ScrollableResultSet).%New("%DynamicQuery:SQL")
	s sql3=##class(FW.OFREPORTS66).OFREPORTS66GETSQL(dt1,dt2)
	s ok=rs.Prepare(sql3)
	s ok=rs.Execute()	
	s cnt=rs.Count()
..............................

я добавил в запрос и в два метода третий параметр
Query OFREPORTS66GETDATA(dt1 As %Date = NULL, dt2 As %Date = NULL, condition As %String) As %Query ............

ClassMethod OFREPORTS66GETDATAExecute(ByRef qHandle As %Binary, dt1 As %Date = NULL, dt2 As %Date = NULL, condition As %String) As %Status

OFREPORTS66GETSQL(dt1 As %Date = NULL, dt2 As %Date = NULL, condition As %String) As %String


При вызове OFREPORTS66GETSQL() из ClassMethod OFREPORTS66GETDATAExecute c тремя параметрами переданными вручную, в select добавляются условия, а вот при вызове из fastreporta почему то в метод OFREPORTS66GETDATAExecute() третий параметр не передается?
Еще нашел в программе какие то CacheSql с ошибкой на скрине ниже
Картинка с другого сайта.
16 ноя 18, 10:11    [21735991]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
druzhok
Member

Откуда:
Сообщений: 16
Все, решил, созад новый класс и методы с тремя параметрами, все заработало. Видно, после компиляции cache где то запоминает, что метод только с двумя параметрами и не хочет 3-ий подставлять.
16 ноя 18, 14:11    [21736381]     Ответить | Цитировать Сообщить модератору
 Re: Добавить условие в select в хранимую процедуру через входной параметр  [new]
logist
Member

Откуда: InterSystems
Сообщений: 262
druzhok,

Может помочь удаление кешированных запросов

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQLOPT_cachedqueries#GSQLOPT_cachedqueries_purge
21 ноя 18, 01:30    [21739617]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить