Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / возвращение значения после выполнения команды "х" / 19 сообщений из 19, страница 1 из 1
03.01.2011, 13:41
    #37044876
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
ClassMethod Calculated(p, f, id) As %String
{
	s pl="+", mn="-", dl = "/", um = "*", per=""
	//x "s return = "_per
	s p = "table."_p
	//w f,* 10 ,* 13 
	x "s id="_id
	x "s table=##Class(PR.Table1).%OpenId(id)"
	s line = "s "_p_"="_f
	//w line, * 10 , * 13 
	x line
	x "s a=table.%Save()"
	//x "i a=0 {s return="_""_"}"
ex q ""
}

могу ли я как то вернуть результат выполнения того что я делал.
сам то код отлично выполняется, но я хотел бы результат получить назад.
как я понимаю команду х - это как вывод строки в консоль, она туда уходит и мы не можем работать с тем что там происходит.
...
Рейтинг: 0 / 0
03.01.2011, 14:41
    #37044914
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
wertyBSD ,

Вывод результата на консоль - это команда write .
xecute далает несколько другое.

Ваш пример можно переделать так:

ClassMethod Calculated(p As %String, f As %String, id As %String) As %Status
{
  set table=##Class(PR.Table1).%OpenId(id)
  set $property(table,p)=f
  quit table.%Save()
}
...
Рейтинг: 0 / 0
03.01.2011, 14:50
    #37044919
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Код: plaintext
set $property(table,p)=f
подсвечивается красным
я немного не понимаю что делает property
но смысл в том что я посылаю параметров поле вычисления, второй параметр формула, а 3 айдишник.
...
Рейтинг: 0 / 0
03.01.2011, 15:08
    #37044928
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
нашёл выход - написать программу, а не метод класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Calc(p, f, id)
	s p = "table."_p
	x "s id="_id
	x "s table=##Class(PR.Table1).%OpenId(id)"
	s line = "s "_p_"="_f
	x line
	x "s a=table.%Save()"
ex q a

тогда работает, а в методе класса "а" не определено.
...
Рейтинг: 0 / 0
03.01.2011, 15:20
    #37044932
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
пример вызова программы
w $$Calc^Calculated("pole1", "(table.pole2+table.pole3)*0.34', 1)
...
Рейтинг: 0 / 0
03.01.2011, 15:35
    #37044935
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
wertyBSD
Код: plaintext
set $property(table,p)=f
подсвечивается красным
я немного не понимаю что делает property
Пожалуйста, указывайте в начале темы Вашу версию СУБД (значение $zv). По-умолчанию я ориентируюсь на самую последнюю версию Caché.
Попробуйте $PROPERTY заменить на $ZOBJPROPERTY .

wertyBSDнашёл выход - написать программу, а не метод класса
Почему в программе это работает, а в методе класса нет и как это решить обсуждалось здесь .

wertyBSDпример вызова программы
w $$Calc^Calculated("pole1", "(table.pole2+table.pole3)*0.34', 1)
Почему бы не сделать вычисляемое поле ? Оно может быть и хранимым.
...
Рейтинг: 0 / 0
03.01.2011, 15:59
    #37044953
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
servit, нельзя вычисляемое, формулы могут меняться даволно часто, на это и рассчитан такой метод
...
Рейтинг: 0 / 0
03.01.2011, 16:00
    #37044954
wertyBSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Cache for Windows NT (Intel) 5.0.19 (Build 6202_3) Wed Aug 31 2005 18:46:39 EDT
...
Рейтинг: 0 / 0
03.01.2011, 16:14
    #37044966
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
wertyBSD
Код: plaintext
1.
	x "s id="_id

Это масло масляное...

wertyBSDв методе класса "а" не определено.
Наверняка виной всему процедуреблок равный 1... При таком раскладе все что внутри процедуры/экзекюта ньюшится и пропадает после выхода.
...
Рейтинг: 0 / 0
03.01.2011, 16:17
    #37044969
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
В версии 5.0 есть функция $ZOBJPROPERTY . Лучше её использовать.
...
Рейтинг: 0 / 0
05.01.2011, 18:00
    #37046783
misha_shar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Почему в методе не выполняется, а в программе выполняется. Это причуды IS я им об этом говорил. Команда Х выполняется по разному внутри вызова процедуры и внутри вызова подпрограммы. Когда Х вызывается внутри подпрограммы она ведет себя корректно в соответствии со стандартом и тут никаких проблемм нет, а в процедуре она ведет себя по особенному. Х выполняется как внешняя процедура и все переменные внутри команды Х локализованы и за пределами команды Х переменной а нет. Если хочешь получить результат в этом случае то возвращай результат в процентной переменно например в %а. Когда я представителям IS указал на странное поведение команды Х они сказали что так и задумано и показали место в документации где это написано. Я конечно с такой трактовкой не согласен но что поделаешь? Хозяин барин.
...
Рейтинг: 0 / 0
05.01.2011, 18:20
    #37046804
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
misha_shar,

Вы про [ProcedureBlock=0] не забыли?
...
Рейтинг: 0 / 0
05.01.2011, 19:05
    #37046836
misha_shar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Я не знаю что такое [ProcedureBlock=0].
...
Рейтинг: 0 / 0
05.01.2011, 19:12
    #37046839
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
misha_shar , одна из опций класса, как раз влияет на такое поведение экзекюта в методах...
...
Рейтинг: 0 / 0
05.01.2011, 19:17
    #37046845
misha_shar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Да но это справедливо не только для методов класса, а для любой процедуры. У меня классов вообще нет , а проблемма то возникала.
...
Рейтинг: 0 / 0
05.01.2011, 20:55
    #37046908
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
misha_sharДа но это справедливо не только для методов класса, а для любой процедуры. У меня классов вообще нет , а проблемма то возникала.Давайте разбираться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Class wrc.a [Abstract]
{

ClassMethod Method1() [ProcedureBlock =  1 ]
{
  x "s obj5=##Class(wrc.test).%OpenId(1)"
  w "метод1 ",$IsObject(obj5),!
}

ClassMethod Method2() [ProcedureBlock =  0 ]
{
  n obj6
  x "s obj6=##Class(wrc.test).%OpenId(1)"
  w "метод2 ",$IsObject(obj6),!
}

ClassMethod Method3() [ ProcedureBlock =  1 , PublicList = (obj7) ]
{
  n obj7
  x "s obj7=##Class(wrc.test).%OpenId(1)"
  w "метод3 ",$IsObject(obj7),!
}
}
Код: 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.
  //МАС
  n
  d subroutine()
  w "функция ",$$function(),!
  do procedure1() 
  do procedure2() 
  do ##class(wrc.a).Method1()
  do ##class(wrc.a).Method2()
  do ##class(wrc.a).Method3()
  q
subroutine()
  n obj1
  x "s obj1=##Class(wrc.test).%OpenId(1)"
  w "подпрограмма ",$IsObject(obj1),!
  q 
function()
  n obj2
  x "s obj2=##Class(wrc.test).%OpenId(1)"
  q $IsObject(obj2)
procedure1() public {
  x "s obj3=##Class(wrc.test).%OpenId(1)"
  w "процедура1 ",$IsObject(obj3),!
}
procedure2() [obj4] public {
  n obj4
  x "s obj4=##Class(wrc.test).%OpenId(1)"
  w "процедура2 ",$IsObject(obj4),!
}
Результат:
подпрограмма1функция1процедура10процедура21метод10метод21метод31
PS: ProcedureBlock
...
Рейтинг: 0 / 0
10.01.2011, 09:44
    #37050700
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Кстати, все-таки странно, что для команды EXECUTE параметр PROCEDUREBLOCK наследуется из текущей функции.
Было бы логичнее для уровня стека EXECUTE ставить его = 0.

Хотя, потестил и понял, что вообще ничего не понимаю: при процедуреблок=1 переменная изолируется с обоих сторон стека, но при при этом программы процедуреблок=0 видят переменные через уровень с процедуреблок=1

Код: 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.
Class User.Test
{


Classmethod T0() [ ProcedureBlock = 0 ]
{
 s x= 1 
 w !,"T0,x=",x
 d ..T1()
 w !,"T0,x=",x
}

Classmethod T1() [ ProcedureBlock = 1 ]
{
 s x= 2 
 w !,"T1,x=",x
 d ..X("s x=3")
 w !,"T1,x=",x
}

Classmethod X(code as %String) [ ProcedureBlock = 0 ]
{
 w !,"X,x=",x
 x code
 w !,"X,x=",x
 q
}

}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TEST>d ##class(User.Test).T0()
 
T0,x= 1 
T1,x= 2 
X,x= 1 
X,x= 3 
T1,x= 2 
T0,x= 3 

Я, кстати, до этого думал, что Procedureblock должна изолировать только от предыдущего уровня стека, а все вызываемые программы с процедуреблок=0 должны работать с тем контекстом переменных, откуда они вызваны.
...
Рейтинг: 0 / 0
10.01.2011, 11:00
    #37050752
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Блок А.Н.Хотя, потестил и понял, что вообще ничего не понимаю: при процедуреблок=1 переменная изолируется с обоих сторон стека, но при при этом программы процедуреблок=0 видят переменные через уровень с процедуреблок=1
Стоит ли удивляться?
Вот процедурный аналог того, что Вы написали:

  do T0()
  q
T0() 
 s x=1
 w !,"T0,x=",x
 d T1()
 w !,"T0,x=",x
 q
T1() {
 s x=2
 w !,"T1,x=",x
 d X("s x=3")
 w !,"T1,x=",x
}
X(code)
 w !,"X,x=",x
 x code
 w !,"X,x=",x
 q

В этом легко убедиться просмотрев другой код, предварительно скомпилировав перед этим класс с флагом "k".

PS: не следует забывать в методах "ньючить" нужные переменные, когда это необходимо (в том числе и в случае с "ProcedureBlock=1").
...
Рейтинг: 0 / 0
10.01.2011, 12:56
    #37050865
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение значения после выполнения команды "х"
Это все понятно, что методы классов в итоге скомпилируются в МАС.
Но, честно говоря, я почему-то думал, что PROCEDUREBLOCK - это такая замена команды NEW, но похоже, что механика у него совершенно другая.
И уже тем более, видимость переменной через уровни стека и невидимость на промежуточных уровнях - это фича.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / возвращение значения после выполнения команды "х" / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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