OpenSXs - Exemplo fornecido muito lento

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.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Boa noite! Já tentou utilizar o sx3cache? http://tdn.totvs.com/pages/viewpage.action?pageId=6815033

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

:warning: 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")