Bom dia a todos
Fiz o ajuste conforme exemplo abaixo, porém a rotina ficou extremamente lenta.
Por exemplo, uma tela simples de cadastro passou de menos de 1 seg para 9 seg para abrir a tela de inclusão.
https://centraldeatendimento.totvs.com/hc/pt-br/articles/360026047911-MP-ADVPL-OPENSXS-PARA-LEITURA-DE-DICION%C3%81RIO-DE-DADOS
Alguém usou outra abordatem para substituir o DbSelecArea("SX3") ?
Obrigado
Bom dia, qual a necessidade de abrir o SX3?
Em minha opinião, isso(https://centraldeatendimento.totvs.com/hc/pt-br/articles/360026047911-MP-ADVPL-OPENSXS-PARA-LEITURA-DE-DICIONÁRIO-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.
Aqui tivemos este mesmo problema, a minha solução foi, criar o Array como Private fora de um loop, e utilizar While ao invés de For. Porem no seu caso eu imagino que esteja utilizando a SX3 para montar o aHeader de uma MsNewGetDados ou alguma função do gênero, neste caso veja o meu anexo que pode te ajudar.
Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.
Boa tarde,
Já tentou comparar o tempo deixando o dbselectarea, em alguns casos pela performasse deixei o dbselecArea(), não deixou de funcionar.
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
Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.
Para resolver seu problema basta seguir o exemplo acima do EMERSON OLIVEIRA FERREIRA e passar o campo da X3_ como expressão assim o codeanalysis não t barra:
(cSX3)->&("X3_NIVEL")