AX 2012 - 在 X++ 中获取实例名称而不是服务器名称

AX 2012 - Get Instance Name not Server Name in X++

是否可以在 X++ 中获取 实例名称 而不是 服务器名称

附件图片显示了我要查找的字段:

当我使用 xSession.AOSName(); 时,它 return 是服务器名称,当我使用 sysServerSessions..Instance_Name; 时,它是 return 空字符串。 Instance_Name 字段在数据库中只有“01”,因此如果它 return 是一个值,它仍然是不正确的。

Instance name (optional),我相信只是文件夹名称和服务显示名称。因此,当您创建多个实例时,它会创建一个文件夹 C:\Program Files\Microsoft Dynamics AX\Server\[InstanceName]\,然后是一个具有该实例显示名称的 AOS 服务。

如果您真的需要它,您可以枚举文件夹并使用正则表达式或任何其他方法对其进行解析。要枚举文件夹,请在某处创建此 server 静态方法并调用它:

static server FilenameOpen pathServer()
{
    return xInfo::directory(DirectoryType::Bin);
}

还有一个ServerId,我觉得和Instance Name不一样,但是在SysServerConfig table:

while select sysServerConfig
{
    info(strFmt("%1", sysServerConfig.ServerId));
}

ServerId是从AOSId和名称等派生出来的值。你可以在这个方法中看到它是如何派生的: \Data Dictionary\Tables\SysServerConfig\Methods\delete

下面是 Alex 获取实例名称的答案中添加的逻辑。

static server str getAOSInstanceName()
{
    str serverPath;
    str instanceName;

    int fullPathLen;
    int serverNameEnd;
    int instanceNameStart;

    //Get the full path of the AOS Server install.
    serverPath = xInfo::directory(DirectoryType::Bin);

    fullPathLen = strLen(serverPath);

    //Get the location of where the Instance Names Ends. "-5" represents "\bin\" in the full path.
    serverNameEnd = fullPathLen - 5;

    //Get the location where the Instance Name Starts - 1.
    instanceNameStart = strFind(serverPath, @"\", serverNameEnd, - fullPathLen);

    //Get the Instance Name.
    instanceName = subStr(serverPath, instanceNameStart + 1, serverNameEnd - serverNameStart);

    return instanceName;
}