powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не стандартно работает рутина
17 сообщений из 17, страница 1 из 1
Не стандартно работает рутина
    #39285859
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день !
Вчера пробовал запустить некоторые свои приложения, которые работают исправно
как в MSM, GT.M и в Cache 5.0 с использованием MSM Activate
В первом случае если НЕ 1, на клиенте получаю: "Здесь возвращаем ошибку...no password"
Если 1 - тогда получаю исправно 50 строк в переменную Ret

А вот что получаю в Cache 2015.1 ...

Код: plaintext
Error:<COMMAND>LABEL^%APISERV *Function must return a value at Test+2^testh

В чем ошибка , моя или это зависит все таки от версии ?Код теста COS:
Код: plaintext
1.
2.
3.
4.
Test(Rec,Ret,Er) 
 n c
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec q
 f c=1:1:50 s Ret(c)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10) 
 q
Код на VB:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Command1_Click()
Dim Rec As String, Er As String, Ret As String
On Error GoTo Error
Rec = 2
m.Do "Test^testh", Rec, Ret, Er
If Er <> "" Then
MsgBox Er
Exit Sub
End If
MsgBox Ret
Exit Sub
Error:
MsgBox ("Error: " & Err.Description)
End Sub

Спасибо.
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39285863
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuВ чем ошибка , моя или это зависит все таки от версии ?
Похоже требуется использование функции...Как вариант сделать так
Код: plaintext
1.
2.
3.
4.
5.
Test(Rec,Ret,Er) 
 n c
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec q:$q Er q
 f c=1:1:50 s Ret(c)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10) 
 q:$q 1
 q
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39285868
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,
Я пробовал вчера - так работает . Вопросов Нет.
Вопрос другой - почему НЕСТАНДАРТНО ?
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39285870
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,Так работает
Код: plaintext
1.
2.
3.
4.
Test(Rec,Ret,Er) 
 n c
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec
 f c=1:1:50 s Ret(c)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10) 
 q Er
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39285941
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu ,

Поскольку Вы возвращаете сразу несколько значений, то очевидно, что это уже не функция, а процедура, параметры которой нужно передавать не по значению, а по ссылке.
Сделал пример на VBScript (ибо он встроен в Windows) и VisM:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Test(Rec,Ret,Er) 
 n c
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec q
 f c=1:1:50 s Ret(c)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10) 

 ;следующая строка нужна для VisM.
 zk Ret ; или s Ret=c

 q
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Set f = CreateObject("VISM.VisMCtrl.1")
f.ErrorTrap=True
f.Server="CN_IPTCP:localhost[1972]"
f.NameSpace="USER"

f.P0=2
f.Execute "d Test^testh(P0,.P1,.P2)"
MsgBox "Rec = " & f.P0 & vbCrLf & "Ret = " & f.P1 & vbCrLf & "Er = " & f.P2

f.P0=1
f.Execute "d Test^testh(P0,.PLIST,.P1)"
MsgBox "Rec = " & f.P0 & vbCrLf & "Ret = " & f.PLIST & vbCrLf & "Er = " & f.P1

If f.Error 

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Rec = 2
Ret =
Er = Здесь возвращаем ошибку...- 2

Rec = 1
Ret = Pole nr.1\Pole nr.2\Pole nr.3\Pole nr.4

Pole nr.1\Pole nr.2\Pole nr.3\Pole nr.4

...

Pole nr.1\Pole nr.2\Pole nr.3\Pole nr.4

Er = 
Проверяйте связку MSM Activate в плане передачи параметров по ссылке.
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286171
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuВопрос другой - почему НЕСТАНДАРТНО ?
Тут я не советчик...
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286189
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На передачу параметров, судя по всему, Valeriu не жалуется, а жалуется на то, что начиная с какой-то (?) версии Cache, метод M.Do начал вызывать процедуры как $$-функции.

Я основательно забыл MSM-API, поэтому не помню: может есть какой-то флаг, который управляет поведением M.Do?
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286252
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,
Правильно Вы говорите.
Есть два варианта (два флага)
1. Передать по ссылке как у меня в первом примере (в принципе все передается по ссылке)
Т.е. как бы первый параметр передается по значению, но в нем можно получить
обратно новое значение.
2. Передать по ссылке и возврат всех параметров + одного параметра по Q как во втором примере

Я правда не пробовал поведение в других ранних релизов...
Но. В чем отличие вызова в Cache 5.0 и Cache 2015.1 ?
В Cache 5.0 работает этот код, в Cache 2015.1 нет.
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286273
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuНо. В чем отличие вызова в Cache 5.0 и Cache 2015.1 ?
В Cache 5.0 работает этот код, в Cache 2015.1 нет. Argumentless QUIT Command Error Reporting Change Caché 2015.1 Upgrade Checklist
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286313
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так по идеи работает.
Код немножко придется изменить
Код: plaintext
1.
2.
3.
4.
5.
Test(Rec,Ret,Er) 
 n c
 q:Rec'=1 Er="Здесь возвращаем ошибку...- "_Rec 
 f c=1:1:50 s Ret(c)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10) 
 q 1
 ;
те вместо :
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec q  
на
 q:Rec'=1 Er="Здесь возвращаем ошибку...- "_Rec 
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286335
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuКод немножко придется изменитьНо только не так, поскольку q Er="..." вернёт 1(TRUE) и никак не поменяет Er
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286343
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,
Поспешил
Код: plaintext
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec q Er
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286400
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit Argumentless QUIT Command Error Reporting Change Caché 2015.1 Upgrade Checklist Изменился лишь формат ошибки в $zerror, но сама ошибка возникала и в более старых версиях.
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286413
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu ,

Покажите пример с возвратом сразу двух значений.
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286454
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,
Код: 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.
COS:

Test(Rec,Ret,Er) 
 i Rec'=1 s Er="Здесь возвращаем ошибку...- "_Rec q Er
 f c=1:1:50 s Ret(c)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10) 
 f n=1:1:10 s Rec(n)="Pole nr.1"_"\"_"Pole nr.2"_"\"_"Pole nr.3"_"\"_"Pole nr.4"_$c(13,10)
 q 1
 ;

VB:

Private Sub Command1_Click()
Dim Rec As String, Er As String, Ret As String, ms As String, Ret1 As String
On Error GoTo Error
Rec = 1
m.Do "Test^testh", Rec, Ret, Er
If Er <> "" Then
    MsgBox Er
    Exit Sub
End If
MsgBox Ret
MsgBox Rec
Exit Sub
Error:
MsgBox ("Error: " & Err.Description)
End Sub

...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286457
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтоб конкретно смотреть, в Cache 2015 можно включить API так:
%SYS>d ^APIMGR

Note: MSM-Activate can be configured from SYSGEN now


MSM-Activate Management Utility V4.4.0/Cache Config 1

Select APIMGR Option:

1 - Enable Remote MSM-Activate connections
2 - Disable Remote MSM-Activate connections
3 - List Current Servers
4 - Terminate MSM-Activate Server
5 - Configure MSM-Activate Username/Passwords
6 - Configure Security
7 - Configure a different Server

Select Option: 1

Known port for MSM-Activate Server <2222>:

MSM-Activate Server started on port 2222

MSM-Activate Management Utility V4.4.0/Cache Config 1

Select APIMGR Option:

1 - Enable Remote MSM-Activate connections
2 - Disable Remote MSM-Activate connections
3 - List Current Servers
4 - Terminate MSM-Activate Server
5 - Configure MSM-Activate Username/Passwords
6 - Configure Security
7 - Configure a different Server

Select Option:
...
Рейтинг: 0 / 0
Не стандартно работает рутина
    #39286874
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuЧтоб конкретно смотреть, в Cache 2015 можно включить API так:Спасибо, помню: 13620163 , клиентскую часть только забыли приложить: 13620745 . Без неё ведь никак.servit Valeriu ,

Покажите пример с возвратом сразу двух значений.Я спросил это потому, что на VBS это не работает, хотя согласно документации - должно.
ActCOM.pdf
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 Simple Do Call 

When you write the Do entry point for use with MSM-Activate/COM, a function that
does not accept arrays or large strings can be written like a normal M function. If you
change the value of parameters that are passed by reference to the M code, the new
values are passed back to the client. For example, the following function takes one
parameter (passed by reference), increases the parameter by one, and returns a string
value.

 MSM Code 

TEST(VAR) ; Example entry point, simple variable
 S VAR=VAR+1
 Q "The result is "_VAR

 Visual Basic Code  [code=vbnet]
Dim M as MCommand
Dim scratch as String, param as Integer
Set M=GetObject("C:\EXAMPLE.MCO")
M.Login("Password")
param=10
scratch=M.Do("^TEST",param)

In this example, scratch contains “The result is 11”, and param contains 11 . By
default, Visual Basic sends all parameters to ActiveX controls or COM objects by
reference, if possible.
To avoid sending param by reference, enclose it in parentheses. In Visual Basic, this
ensures that the parameter is treated as an expression:
Код: vbnet
1.
scratch=M.Do("^TEST",(param))

У меня param после вызова по прежнему равен 10; пробовал на 2010.1, код см. ниже.
________________________________________________
Alexey MaslovИзменился лишь формат ошибки в $zerror, но сама ошибка возникала и в более старых версиях.Действительно, при вызове функции, у которой забыли вернуть значение, раньше (стр. 105)Цитата из документации v5.0.178.3.2 Functions
8.3.2.4 Return Value

If you specify a QUIT command without an expression, Caché issues an error.возникала ошибка

Код: plaintext
<COMMAND>...

теперь

Код: plaintext
<COMMAND>... *Function must return a value at ...

Тем не менее на версии 2010.1 следующий пример отрабатывает без ошибок:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Set m = CreateObject("m.Command")
m.Server = "127.0.0.1"
m.Port = 1666

m.Login
m.Xecute ("ZN ""USER""")
'MsgBox m.Xecute("W $ZNSpace,!,$ZV") & vbCrLf & m.Version & vbCrLf & m.ServVersion

'm.ExplicitCallType=1
param=10

m.Do "Test^testh", param
MsgBox "param = " & param

'scratch = m.Do("Test^testh", param)
'MsgBox "param = " & param & vbCrLf & "scratch = " & scratch

^testh
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ; код для проверки текста ошибки
  s param=10
  s r=$$Test(.param)
  w r,!,param,!
  q

Test(VAR)
  s VAR=VAR+1
  q
  ;q "The result is "_VAR
Связано ли изменение в 2015.1 с этим или нет более точно могут ответить только разработчики.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не стандартно работает рутина
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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