Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / MSM-Activate / 17 сообщений из 17, страница 1 из 1
09.06.2010, 10:30
    #36677222
Vovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
здравствуйте!

Есть такая проблема - в MSM-Activate не работает возврат изменённых значений массива переданных по ссылке.

Код: plaintext
1.
2.
3.
4.
5.
6.
GETDATA(mas,flag) ;NEW PROGRAM [  06 / 09 / 2010    8 : 44  AM ]
 S mas( 0 , 0 )= 11  
 S mas( 0 , 1 )= 12 
 S mas( 1 , 0 )= 21 
 S mas( 1 , 1 )= 22 
 S flag= 999 
 Q  

причём рутина GETDATA выполняется корректно (в лог вывожу значения до изменения и после)

после вызова DO я вижу старые значения массива. Изменение свойств DoMode и ArrayMode не помогло. Клиента пишу на Delphi 7.

Видел на форуме похожую темку (http://www.sql.ru/forum/actualthread.aspx?tid=690795), но там вопрос так и остался открытым. Может с тех пор проблема уже была кем-нибудь решена?
...
Рейтинг: 0 / 0
09.06.2010, 11:05
    #36677383
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Что получает рутина GETDATA(mas,flag) от клиента в переменную mas ?
Какое значение ?
...
Рейтинг: 0 / 0
09.06.2010, 11:14
    #36677416
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Возвращать клиенту примерно так массив строк из М :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Nodes(Var,Nod,i,Hor) ;
    ; mas от клиента в Var
    Kill Nod
    Set Start=$Piece($h,",", 2 )
    For i= 1 : 1  Set Var=$Q(@Var) Quit:Var=""  Do
    . Set Nod(i)=Var_"="_@Var
    Set Hor=$Piece($h,",", 2 )-Start_" seconds are executed in M !!!"
    Quit
...
Рейтинг: 0 / 0
09.06.2010, 11:15
    #36677420
Vovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Valeriu,

Если подробнее то исходники выглядят так

Delphi7:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var
    mas : OleVariant;
    p1 : OleVariant;
begin
......
    mcmnd1.Server := 'localhost';
    mcmnd1.Port :=  1666 ;
    mcmnd1.Username := '456';
    mcmnd1.Password := '789';
    mcmnd1.UCI := 'MGR';
    mcmnd1.Volgrp := 'PGA';
    mcmnd1.Login('789');

    mcmnd1.ArrayMode := True;
    mcmnd1.DoMode := True;

    mas := VarArrayCreate([ 0 , 1 , 0 , 1 ], varOleStr);
    mas[ 0 , 0 ] := 'aa';
    mas[ 0 , 1 ] := 'bb';
    mas[ 1 , 0 ] := 'cc';
    mas[ 1 , 1 ] := 'ee';
    p1 :=  123 ;

    mcmnd1.Do_('^GETDATA',mas,p1);

MSM:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 8 : 54  AM   9 -JUN- 10 
GETDATA(mas,flag) ;NEW PROGRAM [  06 / 09 / 2010    8 : 44  AM ]
 D ^DBG("Perezapis massiva "_$G(mas))
 D ^DBG("Before mas(0,0)="_mas( 0 , 0 )_" mas(0,1)="_mas( 0 , 1 )_" mas(1,0)="_mas( 1 , 0 )_" mas(1,1)="_mas( 1 , 1 )_" p1="_flag)
 K mas( 0 , 0 ),mas( 0 , 1 ),mas( 1 , 0 ),mas( 1 , 1 )
 S mas( 0 , 0 )= 11  
 S mas( 0 , 1 )= 12 
 S mas( 1 , 0 )= 21 
 S mas( 1 , 1 )= 22 
 S flag= 999 
 D ^DBG("After mas(0,0)="_mas( 0 , 0 )_" mas(0,1)="_mas( 0 , 1 )_" mas(1,0)="_mas( 1 , 0 )_" mas(1,1)="_mas( 1 , 1 )_" p1="_flag)
 Q 

В лог выводится

Perezapis massiva 2~2~2
Before mas(0,0)=aa mas(0,1)=bb mas(1,0)=cc mas(1,1)=ee p1=123
After mas(0,0)=11 mas(0,1)=12 mas(1,0)=21 mas(1,1)=22 p1=999
...
Рейтинг: 0 / 0
09.06.2010, 11:27
    #36677461
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Мы отказались со стороны клиента передачи М серверу массивов
Только на получения от него :)
...
Рейтинг: 0 / 0
09.06.2010, 12:00
    #36677633
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
У нас примерно так.
Клиент посылает серверу большую строку с разделителями ("|" и "~")
Сервер получает и в цикле перебирает строку, потом данными
можно манипулировать как хочется ...

Код: plaintext
1.
2.
3.
Set(Nodes,Rec,Er) 
  F J= 1 : 1  S ZAP=$P(Rec,"|",J) Q:ZAP=""  D
  . S ^Test($P(Nodes,"~", 1 ),$P(Nodes,"~", 2 ),$P(ZAP,"~", 1 ))=$P(ZAP,"~", 2 )_"/"_$P(ZAP,"~", 3 )_"/"_$P(ZAP,"~", 4 )
  Q  
...
Рейтинг: 0 / 0
09.06.2010, 12:22
    #36677711
Vovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Valeriu,

а как вы передаёте данные от сервера клиенту?
...
Рейтинг: 0 / 0
09.06.2010, 12:35
    #36677761
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Если это небольшие обьемы, точно таким же методом, только наоборот.
Строку с разделителями получаем от сервера и разбираем на клиенте
Если большие обьемы (мы стараемся обойти) то массивом строк и то, сколько
позволяет М :) Это я показал выше.

На Васика примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
m.Do "CP^NAR", cmbRut.Text, cmbSch.Text, Ret,  Er

If Er <> "" Then
MsgBox Er, vbInformation
Exit Sub
End If

Varfull = Split(Ret, "|") ' Определяем кол. разделителей
Rec = UBound(Varfull)
For cnt = 0 To Rec      'крутимся сколько определили
Ret1 = Varfull(cnt)      'данные между разделителями, которые и загоняем в ячейках грида
VSFlexGrid1.AddItem Piece(Ret1, "\",  1 ) & vbTab & _
                    Piece(Ret1, "\",  2 ) & vbTab & _
                    Piece(Ret1, "\",  3 ) & vbTab & _
                    Piece(Ret1, "\",  4 ) & vbTab & _
                    Piece(Ret1, "\",  5 ) & vbTab & _
                    Piece(Ret1, "\",  6 ) & vbTab & _
                    Piece(Ret1, "\",  7 ) & vbTab & _
                    Piece(Ret1, "\",  8 ) & vbTab & _
                    Piece(Ret1, "\",  9 ) & vbTab & _
                    Piece(Ret1, "\",  10 )
                    
Next cnt
...
Рейтинг: 0 / 0
09.06.2010, 14:06
    #36678126
Vovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Valeriu,

Судя по приведённому коду у вас в Ret помещается нужная (сформированная в M рутине) информация, а моя проблема в том и заключается, что данные из M не возвращаются и это происходит именно в Delphi.

Я не пожалел часа времени и реализовал на стареньком VB6 тестовое приложение выполняющее те же действия........ И ВСЁ БЛИН ЗАРАБОТАЛО
...
Рейтинг: 0 / 0
09.06.2010, 14:25
    #36678208
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Так дело в дельфях ??? :/
...
Рейтинг: 0 / 0
09.06.2010, 15:27
    #36678411
Vovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Valeriu,

Да, похоже на то. Или есть отличия работы с COM (к сожалению я не эксперт в этой технологии поэтому всего лишь предполагаю).

Но и не учить же Basic ради того, что там Activate работает правильно.
...
Рейтинг: 0 / 0
09.06.2010, 16:36
    #36678665
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Так я Вам еще одну ссылочку в предыдущем посте предложил. Это независимая разработка
и может она подойдет !!! Там и примеры вроде есть. Скачайте все, а там думаю разобраться можно. И именно для Delphi 7 !

авторMSM-Activate (MUMPS) API wrapper-component for use in DelphiExample is for Delphi 7.This unit is created for the Dutch (http://orego.artsennet.nl) <b>HISLink-project</b>, but can also be used for other purposes.
...
Рейтинг: 0 / 0
12.06.2010, 11:28
    #36684113
Svobodny Hudognik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Насколько я помню у меня была аналогичная проблема в MSM Workstation.
По моему на клиентской программе был примерно такой код:

s Api=LOGIN^myProg(.InArgs) ; создание объекта API

f d q:'ret
. k Par,List ; !!!
. s Par("var")=value
. s ret=Api.Do("Serv^Prog",.Par,.List) ; Запрос данных с сервера

Так вот в Par почему то не передавалось что нужно а в List почему то не возвращалось то что нужно пока перед каждым вызовом не поставили k Par,List.
Насколько я помню при каждым новом обращение к объекту Api, если в параметрах делаются какие то изменения то они почему то не передаются, а передаются прежние значения, если перед этим не делать Kill
...
Рейтинг: 0 / 0
14.06.2010, 15:19
    #36685924
Vovin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Хотелось бы подвести итог беседы...

Svobodny Hudognik, у меня с MSM-Workstation был печальный опыт работы, предыдущий topic об этом свидетельствует.

С MSM-Activate/COM я так и не разобрался, данные от сервера удалось получить только на Васике, а выяснять почему в Delphi не работает не стал, т.к. даже эксперты плечами пожимают.

В итоге остановился на MSM-Activate/API, и как оказалось он рулит. На первый взгляд показался более сложным, чем COM, но после изучения всё оказалось предельно просто и помимо этого работает стабильно и имеет больше возможностей (например работа с глобалями на низком уровне).

Возможно эта инфа кому-нибудь поможет.

Кстати, отдельное спасибо Valeriu, за полезные ссылки и советы!
...
Рейтинг: 0 / 0
15.06.2010, 15:17
    #36687923
Гость68
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
Vovin,
Я подозреваю дело в параметрах. Дело в том что в Basic по умолчанию передаются параметры по ссылке (byRef). А вот в Дельфях по значению. Не силен в дельфях смотрите хелп в направлении "Out parameters"

Сообщите результаты, интересно. Спс
...
Рейтинг: 0 / 0
15.06.2010, 15:27
    #36687956
MX-9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
VovinValeriu,

а как вы передаёте данные от сервера клиенту?

и еще вопрос - как через MSMactivate передать клиенту $c(0) - то есть нулевой байт ?

поскольку $c(0) является терминатором по умолчанию
то не передается

как обойти это ограничение ?
...
Рейтинг: 0 / 0
15.06.2010, 15:31
    #36687962
гость68
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSM-Activate
И еще забыл, у меня давно было похожее. Те я в VBA через МАктиват передавал значения но они не менялись, помогло следующее в каше

(правда на Basic)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim P0,P1,P2 '!!!!!!!!!!!

Public Function Main(NSCH)
IDX=Traverse(^FONDBI(1,"NS",2,NSCH,0,""))
IDX=Piece(^FONDdat(1,IDX,0,"NN",0),PO)
P0=Piece(^FONDKdat(1,IDX,"Nam",0),PO) 'Полное наименование
P1=Piece(^FONDKdat( 1 ,IDX,"NamK", 0 ),PO) 'Краткое наименование
P2=Piece(^FONDKdat(1,IDX,"DZ",0),PO) 'Краткое наименование
Main=P0 & "|" & P1 & "|" & P2
End Function
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / MSM-Activate / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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