Показать сообщение отдельно
Старый 29.07.2010, 12:22   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Штатно в заголовке окна клиента AX 2009 из информации о сервере показывается лишь название хоста AOS'а. Чтобы не заморачиваться с изменением иконок, отображением названия каталога с приложением и проч., захотелось видеть в заголовке название БД (схемы в случае с Oracle). Для Oracle пришлось делать отдельный метод, потому что если задать в настройках AOS некий "общий" TNS, а схему указать отдельно, то я не нашел, как ее выцепить штатными средствами. В общем, решено это все было следующим образом:
\Classes\Info\DEV_setAxWorkspaceTitle
X++:
/// <summary>
///     выставляет более информативный и в то же время лаконичный заголовок окна рабочей области AX
/// </summary>
/// <param name="_hWnd">
///     дескриптор окна рабочей области, для которой нужно поменять заголовок
/// </param>
protected void DEV_setAxWorkspaceTitle( HWND _hWnd = this.hWnd( xInfo::currentWorkspaceNum() ) )
{
    xSession    session;
    str         caption;
    ;
    Debug::assert( _hWnd != 0 );
    session = new xSession();
    caption = strfmt( @"%1 [%2@%3: %4 %5] - [%6 - %7]", "@SYS119901", DEV_getCurrentDatabaseName(), session.AOSName(),
                        "@SYS7115", session.sessionId(), xInfo::currentWorkspaceNum(), curext()
                    );
    WinAPI::setWindowText( _hWnd, caption );
}
\Classes\Global\DEV_getCurrentDatabaseName
X++:
/// <summary>
///     возвращает название текущей базы (MsSQL) или схемы (Oracle)
/// </summary>
/// <returns>
///     название базы/схемы, с которой работает AOS
/// </returns>
/// <exception cref="Exception::Error">
///     выбрасывается, если используемая СУБД - не Ms SQL или Oracle
/// </exception>
public static client server str DEV_getCurrentDatabaseName()
{
    DatabaseId  databaseId;
    str         ret;
    ;
    ret = classFactory.globalCache().get( funcname(), '', '' );
    if (ret == '')
    {
        databaseId = SqlSystem::databaseBackendId();
        switch (databaseId)
        {
            case DatabaseId::Oracle :
                ret = DEV_getCurrentOracleSchemaName();
                break;
            case DatabaseId::MS_Sql_Server :
                ret = new SqlSystem().loginDatabase();
                break;
            default :
                throw error( Error::wrongUseOfFunction( funcname() ) );
        }
        classFactory.globalCache().set( funcname(), '', ret );
    }
    return ret;
}
\Classes\Global\DEV_getCurrentOracleSchemaName
X++:
/// <summary>
///     возвращает название текущей схемы в Oracle, если текущая используемая СУБД - Oracle
/// </summary>
/// <returns>
///     название текущей схемы в Oracle
/// </returns>
public static server str DEV_getCurrentOracleSchemaName()
{
    SqlStatementExecutePermission   sqlStatmPerm;
    str                             sqlStatm;
    Statement                       statement;
    ResultSet                       resultSet;
    str                             ret;
    ;
    Debug::assert( SqlSystem::databaseBackendId() == DatabaseId::Oracle );
    sqlStatm = @"select sys_context( 'userenv', 'current_schema' ) current_schema from dual";
    sqlStatmPerm = new SqlStatementExecutePermission( sqlStatm );
    sqlStatmPerm.assert();
    statement = new Connection().createStatement();
    // BP Deviation Documented
    resultSet = statement.executeQuery( sqlStatm );
    if (resultSet.next())
    {
        ret = resultSet.getString( 1 );
    }
    CodeAccessPermission::revertAssert();
    return ret;
}
Вызов this.DEV_setAxWorkspaceTitle() был добавлен в методы класса Info workspaceWindowCreated() и onEventGoingIdle(). Получилось примерно так:
За это сообщение автора поблагодарили: mazzy (2), raz (5), lev (2), aidsua (2), npokypatop (1).