Штатно в заголовке окна клиента 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(). Получилось примерно так: