powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / возвращение значения после выполнения команды "х"
19 сообщений из 19, страница 1 из 1
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #37044919
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
set $property(table,p)=f
подсвечивается красным
я немного не понимаю что делает property
но смысл в том что я посылаю параметров поле вычисления, второй параметр формула, а 3 айдишник.
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #37044932
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пример вызова программы
w $$Calc^Calculated("pole1", "(table.pole2+table.pole3)*0.34', 1)
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #37044953
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit, нельзя вычисляемое, формулы могут меняться даволно часто, на это и рассчитан такой метод
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #37044954
wertyBSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cache for Windows NT (Intel) 5.0.19 (Build 6202_3) Wed Aug 31 2005 18:46:39 EDT
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #37044966
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wertyBSD
Код: plaintext
1.
	x "s id="_id

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

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

Вы про [ProcedureBlock=0] не забыли?
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #37046836
misha_shar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не знаю что такое [ProcedureBlock=0].
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #37046839
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha_shar , одна из опций класса, как раз влияет на такое поведение экзекюта в методах...
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #37046845
misha_shar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да но это справедливо не только для методов класса, а для любой процедуры. У меня классов вообще нет , а проблемма то возникала.
...
Рейтинг: 0 / 0
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #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
возвращение значения после выполнения команды "х"
    #37050865
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все понятно, что методы классов в итоге скомпилируются в МАС.
Но, честно говоря, я почему-то думал, что PROCEDUREBLOCK - это такая замена команды NEW, но похоже, что механика у него совершенно другая.
И уже тем более, видимость переменной через уровни стека и невидимость на промежуточных уровнях - это фича.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / возвращение значения после выполнения команды "х"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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