A lentidão desse exemplo (https://centraldeatendimento.totvs.com/hc/pt-br/articles/360026047911-MP-ADVPL-OPENSXS-PARA-LEITURA-DE-DICION%C3%81RIO-DE-DADOS) se dá por conta da utilização do "SetFilter", pois, a rotina varre toda a SX3 para aplicar o filtro passado. Se você simplesmente mantiver sua rotina como antes, só substituindo o "SX3" por um novo Alias a velocidade continua a mesma.
Exemplo:
cSX3 := GetNextAlias()
OpenSXs(,,,,cEmpAnt,cSX3,"SX3",,.F.)
If Select(cSX3) # 0
DbSelectArea(cSX3)
DbSetOrder(1)
DbSeek(cAlias)
While (cSX3)->(!Eof()) .And. (cSX3)->X3_ARQUIVO == cAlias
If X3Uso((cSX3)->X3_USADO) .And. cNivel >= (cSX3)->X3_NIVEL .And. RTrim((cSX3)->X3_CAMPO) $ "CAMPO_1,CAMPO_2,CAMPO_N"
...
EndIf
(cSX3)->(DbSkip())
EndDo
(cSX3)->(DbCloseArea())
EndIf
Bom dia, qual a necessidade de abrir o SX3?
— Daniel Mendes 29 de Aug de 2019Em minha opinião, isso(https://centraldeatendimento.totvs.com/hc/pt-br/articles/360026047911-MP-ADVPL-OPENSXS-PARA-LEITURA-DE-DICION%C3%81RIO-DE-DADOS) é apenas uma forma de enganar o analisador e fazer a mesma coisa que fazemos habitualmente e com muito mais custo de processamento. Eu esperava que a Totvs já fornecesse classes que dessem pra nós essas informações, pois em telas dinâmicas lemos o dicionário para habilitar e desabilitar alguns campos.
— Helitom Silva 22 de Nov de 2019