Escrito por

Artigo Evandro Wendt · jan 6 2m read

Causa e solução do erro <SLMSPAN> ao eliminar uma global

Rubrica de FAQ da InterSystems

Se você tentar eliminar uma global que está mapeada no nível de subscrito a partir do nó raiz, você receberá um erro e ela não será excluída. Isso ocorre porque o comando kill para globais mapeadas no nível de subscrito não pode ser usado atravessando mapeamentos.

// Suppose subscript-mapped globals exist in different databases, as shown below:^TEST(A*~K*) -> database A
^TEST(L*~Z*) -> database B

// Trying to kill from the top level will result in a <SLMSPAN> error.
NAMESPACE>Kill^TEST
<SLMSPAN> <- This error is output.

Para excluir apenas a global no namespace (banco de dados) atual, use o seguinte:

NAMESPACE>Kill ^["^^."]TEST

Globais mapeadas no nível de subscrito devem ser movidas para o banco de dados e eliminadas diretamente.

Para alternar para o banco de dados, use o seguinte:

zn"^^c:\intersystems\iris\mgr\user"
or
set$namespace="^^c:\intersystems\iris\mgr\user"

Ao importar globais com $System.OBJ.Load, o comportamento padrão é eliminar as globais antes de importá-las.
Como resultado, se as globais de destino estiverem mapeadas no nível de subscrito, ocorre um erro <SLMSPAN>. Nesse caso, especifique o parâmetro /mergeglobal como segundo argumento de $System.OBJ.Load, conforme abaixo, para evitar a eliminação prévia:

Set sc = $System.OBJ.Load(path," /mergeglobal",.errors)

enlightened [Referências]
Mapped globals cannot be exported.
How do I compile mapped classes and routines?