Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Хранимая процедура возвращает пусто... / 25 сообщений из 38, страница 1 из 2
19.03.2013, 09:18
    #38189021
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Что-то не пойму почему хранимая процедура возвращает пусто...

Есть такая процедурка/// ФИО гражданина
/// <table>
/// <tr>
/// <td><b>Urn</b></td>
/// <td>Urn гражданина</td>
/// </tr>
/// <tr>
/// <td><b>Date</b></td>
/// <td>На какую дату</td>
/// </tr>
/// <tr>
/// <td><b>Type</b></td>
/// <td>0-Ф|И|О, 1-фамилия, 2-имя, 3-отчество, 4-фамилия и инициалы, 5-инициалы и фамилия</td>
/// </tr>
/// </table>
ClassMethod name(Urn As %String, Date As %Date, Type As %Integer) As %String [ SqlProc ]
{
  s:$g(Date)="" Date=+$h
  s Type=$g(Type)
  s sql="Select * "
  s sql=sql_" From soi_arh_data_cls.name as a"
  s sql=sql_" Where a.parent in ("
  s sql=sql_"    Select b.urn"
  s sql=sql_"    From soi_arh_data.name as b"
  s sql=sql_"    Where b.citizen=?"
  s sql=sql_" )"
  s sql=sql_" And a.Dat<=?"
  s sql=sql_" Order by Dat desc"
  s o=##class(%ResultSet.SQL).%Prepare(sql,.err,"",Urn,Date)
  s ^tmp(Urn)=o
  s name=""
  s dlm="|"
  if o.%Next() {
    s ^tmp(Urn,1)=o.%Get("surname")
    s $p(name,dlm)=o.%Get("surname")
    s $p(name,dlm,2)=o.%Get("name")
    s $p(name,dlm,3)=o.%Get("patronymic")
  }
  k o
  q:Type=0 name
  q:Type>3 $$nameShort(Type-3)
  q:Type $p(name,dlm,Type)
  q $tr(name,dlm," ")
nameShort(Type) // Фимилия + инициалы
  s str=$p(name,dlm)
  s str1=""
  s val=$p(name,dlm,2)
  s:val'="" str1=$e(val)_"."
  s val=$p(name,dlm,3)
  s:val'="" str1=str1_$e(val)_"."
  i Type=1 s:str1'="" str=str_" "_str1
  i Type=2 s:str1'="" str=str1_" "_str
  q str
}

Нормально работает с командной строки

Код: vbnet
1.
2.
CHB>w ##class(soi.arh.data.citizen).name("ARD-2013-1")
ДЗЮБА РАИСА ИВАНОВНА


А в запросе возвращает пустоту (см.картинку)Select 
   soi_arh_data.citizen_name(urn) as fio,
   *
From soi_arh_data.citizen
----------
Cache for Windows (x86-64) 2010.2.3 (Build 702) Tue Feb 15 2011 14:20:27 EST
Cache for Windows (x86-64) 2012.1.1 (Build 602) Wed Mar 7 2012 22:36:34 EST
...
Рейтинг: 0 / 0
19.03.2013, 09:21
    #38189024
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Делал тестовую запись в глобал ^tmp - запрос выполняется
Код: vbnet
1.
^tmp("ARD-2013-1")="4@%ResultSet.Result"


Но в if o.%Next() {
    s ^tmp(Urn,1)=o.%Get("surname")
    s $p(name,dlm)=o.%Get("surname")
    s $p(name,dlm,2)=o.%Get("name")
    s $p(name,dlm,3)=o.%Get("patronymic")
 }
уже не попадает...

Почему тогда с командной строки все работает как надо?
...
Рейтинг: 0 / 0
19.03.2013, 09:31
    #38189043
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Потестил сейчас из портала - работает!

Значит дело все в связке Cache+Delphi... Это там процедурка возвращает пусто...
...
Рейтинг: 0 / 0
19.03.2013, 09:44
    #38189055
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Возможно, режим даты стоит не такой. Исключите дату из запроса и проверьте.
...
Рейтинг: 0 / 0
19.03.2013, 10:04
    #38189073
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Блок А.Н.Возможно, режим даты стоит не такой. Исключите дату из запроса и проверьте.
О, спасибо.
В запросе используется хоролог...
...
Рейтинг: 0 / 0
19.03.2013, 10:11
    #38189083
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Блок А.Н. , да, это дата.

А как сделать универсальный вариант по дате? Дабы работала в связке Cache+Delphi и просто Cache?
...
Рейтинг: 0 / 0
19.03.2013, 10:12
    #38189084
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Параметр чёле вводить...
...
Рейтинг: 0 / 0
19.03.2013, 10:33
    #38189122
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Он как-то переключается через какие-то ZU.
Попробуйте еще
d $system.SQL.SetSelectMode(...)
...
Рейтинг: 0 / 0
19.03.2013, 10:42
    #38189142
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Блок А.Н.Он как-то переключается через какие-то ZU.
Попробуйте еще
d $system.SQL.SetSelectMode(...)
А что из этого
дока0 LOGICAL
1 ODBC
2 DISPLAY
Нужно для использования хоролога?
...
Рейтинг: 0 / 0
19.03.2013, 10:44
    #38189147
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Logical

В портале же есть селектор ;-)
...
Рейтинг: 0 / 0
19.03.2013, 11:50
    #38189296
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
krvsa,

то же наступал на эти грабли с датами,
пришел к такому решению:
все что на клиенте, неважно каком, перевожу в хоролог
а запрос формирую так: "... where TONUMBER(date)=:dateParam"
...
Рейтинг: 0 / 0
19.03.2013, 11:56
    #38189311
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Блок А.Н.Logical
Ясно.

Блок А.Н.В портале же есть селектор ;-)
Дык я там и не бываю...
...
Рейтинг: 0 / 0
19.03.2013, 11:57
    #38189313
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
krvsa ,

Всё дело в контексте вызова.

Если запустите метод из терминала, то
$system.SQL.GetSelectMode() = 0

Если как ХП, то
$system.SQL.GetSelectMode() = 1

Select Mode

Поскольку используете класс %ResultSet.SQL , в котором свойство %RuntimeMode приватное, то остаётся вариант предложенный Блок А.Н. .

PS: ещё проверьте формат получаемого параметра Date : возможно, в одном случае он приходит в виде 62900, а в другом - "2013-03-19".
...
Рейтинг: 0 / 0
19.03.2013, 11:58
    #38189318
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Ymka2007пришел к такому решению:
все что на клиенте, неважно каком, перевожу в хоролог
а запрос формирую так: "... where TONUMBER(date)=:dateParam"
Так у меня хранимая процедура будет выполняться не только на клиенте но и в "Каше"...
...
Рейтинг: 0 / 0
19.03.2013, 12:00
    #38189323
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Ymka2007все что на клиенте, неважно каком, перевожу в хоролог
а запрос формирую так: "... where TONUMBER(date)=:dateParam"Плохое решение.
Если есть индекс на дату, то он в таком случае не будет задействован.
...
Рейтинг: 0 / 0
19.03.2013, 12:02
    #38189335
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
servitещё проверьте формат получаемого параметра Date : возможно, в одном случае он приходит в виде 62900, а в другом - "2013-03-19".
В моём примере дата не передаётся вообще... Она там явно присваивается

Код: vbnet
1.
s:$g(Date)="" Date=+$h



От того и непонятки...
...
Рейтинг: 0 / 0
19.03.2013, 12:04
    #38189347
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
servitЕсли запустите метод из терминала, то
Код: vbnet
1.
$system.SQL.GetSelectMode() = 0


А я думал нужно как параметр передавать

Код: vbnet
1.
d $system.SQL.GetSelectMode(0)
...
Рейтинг: 0 / 0
19.03.2013, 12:05
    #38189350
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
krvsa ,

Для чего это: Date As %Date, Type As %Integer?
...
Рейтинг: 0 / 0
19.03.2013, 12:08
    #38189362
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
krvsaА я думал нужно как параметр передавать http://docs.intersystems.com/cache20122/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.SQL#GetSelectMode] Get SelectMode
http://docs.intersystems.com/cache20122/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.SQL#SetSelectMode] Set SelectMode
...
Рейтинг: 0 / 0
19.03.2013, 12:10
    #38189366
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
servitДля чего это: Date As %Date, Type As %Integer?
Где?
...
Рейтинг: 0 / 0
19.03.2013, 12:11
    #38189370
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
servitДля чего это: Date As %Date, Type As %Integer?
А! Понял...
Это на тот случай если дату таки передадут. Но впримерах выше я специально её не передаю.
...
Рейтинг: 0 / 0
19.03.2013, 12:14
    #38189382
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
Вот так работает!

Код: vbnet
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.
32.
33.
34.
35.
36.
37.
38.
ClassMethod name(Urn As %String, Date As %Date, Type As %Integer) As %String [ SqlProc ]
{
	s:$g(Date)="" Date=+$h
	s Type=$g(Type)
	d $system.SQL.SetSelectMode(0)
	s sql="Select * "
	s sql=sql_" From soi_arh_data_cls.name as a"
	s sql=sql_" Where a.parent in ("
	s sql=sql_"    Select b.urn"
	s sql=sql_"    From soi_arh_data.name as b"
	s sql=sql_"    Where b.citizen=?"
	s sql=sql_" )"
	s sql=sql_" And a.Dat<=?"
	s sql=sql_" Order by Dat desc"
	s o=##class(%ResultSet.SQL).%Prepare(sql,.err,"",Urn,Date)
	s name=""
	s dlm="|"
	if o.%Next() {
		s $p(name,dlm)=o.%Get("surname")
		s $p(name,dlm,2)=o.%Get("name")
		s $p(name,dlm,3)=o.%Get("patronymic")
	}
	k o
	q:Type=0 name
	q:Type>3 $$nameShort(Type-3)
	q:Type $p(name,dlm,Type)
	q $tr(name,dlm," ")
nameShort(Type) // Фимилия + инициалы
	s str=$p(name,dlm)
	s str1=""
	s val=$p(name,dlm,2)
	s:val'="" str1=$e(val)_"."
	s val=$p(name,dlm,3)
	s:val'="" str1=str1_$e(val)_"."
	i Type=1 s:str1'="" str=str_" "_str1
	i Type=2 s:str1'="" str=str1_" "_str
	q str
}


Код: vbnet
1.
d $system.SQL.SetSelectMode(0)


Помогло.

Осталось проверить как передаётся дата и переделать её в хоролог, если нужно.

Спасибо всем за помощь!!!
...
Рейтинг: 0 / 0
19.03.2013, 12:53
    #38189491
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
servitпроверьте формат получаемого параметра Date : возможно, в одном случае он приходит в виде 62900, а в другом - "2013-03-19".
Только два варианта возможны? Или их больше?
...
Рейтинг: 0 / 0
19.03.2013, 12:57
    #38189499
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
krvsaТолько два варианта возможны? Или их больше?Больше.
...
Рейтинг: 0 / 0
19.03.2013, 13:03
    #38189522
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура возвращает пусто...
servitБольше.
Фигово...
Придется параметр вводить - формат даты...
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Хранимая процедура возвращает пусто... / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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