Показать сообщение отдельно
Старый 25.07.2017, 14:05   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3268 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Veter Посмотреть сообщение
Попробую изменить вводную :
Как можно из клиента первого АОСа - подключится на второй ? (оба АОСа работают в кластере).
Повесили на форму активных пользователей кнопку по нажатию на которую отрабатывает такой код:
(т.е. на закладке с аосами становишься на нужный аос и жмешь кнопку - открывается клиент аксапты подключенный к выбранному аосу)

X++:
// pkoz 08.07.2011
// содрано тут : \Classes\GRD_ProjectCompile\projectCompileOnAOSs
#macrolib.File
#localmacro.AOSIdPortSeparator      '@' #endmacro
#localmacro.CmdLinePortSeparator    ':' #endmacro
void GRD_connectParticularAOS()
{
    System.Diagnostics.ProcessStartInfo processStartInfoLoc;
    System.Diagnostics.Process          processLoc;
    Integer                             curServerId;
    SysServerSessions                   sysServerSessionsLoc = sysServerSessions.data();
    str                                 cmdLineArgs;
    ;
    curServerId = (select firstonly ServerId
                    from    SysClientSessions
                    where   SysClientSessions.SessionId == sessionid()
                  ).ServerId;

    if (!(  sysServerSessionsLoc.Status       == SysServerStatus::Alive
        &&  sysServerSessionsLoc.LoadBalance  == NoYes::No              // вообще балансировщики всегда имеют статус SysServerStatus::Offline, так что условие избыточно
//      &&  sysServerSessionsLoc.ServerId     != curServerId
       ))
    {
        throw error("Нельзя поключиться к выбранному AOS'у");
    }
    cmdLineArgs = strfmt( @'-loadbalance=0 -aos2=%1', strreplace( sysServerSessionsLoc.AOSId, #AOSIdPortSeparator, #CmdLinePortSeparator ) );

    processLoc = new System.Diagnostics.Process();
    processStartInfoLoc = processLoc.get_StartInfo();
    processStartInfoLoc.set_FileName( WinAPI::getCurrentProcessExecutablePath() );
    processStartInfoLoc.set_Arguments( cmdLineArgs );
    processStartInfoLoc.set_UseShellExecute( false );
    if (!processLoc.Start())
    {
        error("@SYS83461");
    }
}
За это сообщение автора поблагодарили: Veter (1), skuull (2), Ace of Database (3), AlGol (3).