Boa tarde.
Submeti um projeto no TOTVS CODEANALYSIS e apresentou vários erros (issues) refente ao Direct Access not allowed in data dictionary, conforme imagem em anexo.
Veja que estou realizando um dbSeek no SX3 para alimentar uma aHeader.
Neste caso o sistema está acusando "Uso não permitido de leitura do metadados de Descrição das propriedades de tabelas (SX3)."
Sei que existem funções para leitura do SX3, como por exemplo o X3Titulo(). Porém não encontrei funções para demais campos.
Qual a melhor forma de atender este requisito e o código ficar consistente.
Agradeço a atenção.
At
Rodrigo de Oliveira
Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.
Aproveitando o assunto do tópico, na página Manipulação de Base de Dados no TDN [Manipulação de Base de Dados - Frameworksp - TDN] existem diversos comandos como: X3Descric(), X3Titulo(), X3CBox(), etc., que exigem que se esteja posicionado no registro da tabela do Dicionário de Dados (SX2, SX3, etc.) para retornar a informação correspondente. Já existem APIs que substituam tais comandos?
Bom dia Rodrigo.
Pelo que verifiquei, você não pode abrir o dicionario de dados via DbSelectArea.
Precisa abrir com OpenSXS.
Conforme informado no link: http://tdn.totvs.com/pages/viewpage.action?pageId=364926893
Segue link do OpenSXS: http://tdn.totvs.com/display/framework/OpenSxs
- Observações importantes sobre o processo
• A utilização do Dicionário no Banco de Dados está disponível apenas a partir da versão 12.1.17 do Protheus.
• Para cada conexão de usuário, serão criadas 2 conexões com o DBAccess, sendo que uma delas não consome licença e é não transacionada;
• A conexão utilizada pelas tabelas de infraestrutura não é transacionada;
• É proibido abrir o arquivo de Empresa(SIGAMAT) com DBUseArea, deve-se utilizar OpenSm0 ou OpenSm0Excl;
• É proibido abrir os arquivos de dicionário com DBUseArea, deve-se utilizar a função OpenSX.
• As tabelas são criadas utilizando multi-thread
A migração para o metadados relacional, necessita de ajustes nós códigos fontes, principalmente, aqueles que foram realizados em padrões antigos e que privilegiavam o método ISAM.
Tomando-se como base uma tabela de 200 propriedades, a manutenção do modelo ISAM, provoca o envio de pouco mais de 200 SELECTs no banco de dados, enquanto que o modelo Relacional, provoca o envio de apenas 1.
Devemos entender que o programa atualmente não esta errado, porém, na migração para o modelo relacional do dicionário de dados, haverá um grande impacto de performance e isto existe uma regra alertado da necessidade de troca para um novo padrão que mitiga o impacto e é compativel mesmo com o modelo ISAM, ou seja, pode ser utilizado imediatamente, sem prejuizo, fa
O novo padrão utiliza a API FillGetDados, que esta documentado em http://tdn.totvs.com/display/public/PROT/FillGetDados. Recomendamos a troca para este novo método, como sugerido na documentação.
Obrigado Eduardo Riera.
Vou ajustar o fonte e qualquer dúvida retomo o assunto aqui.
Eduardo,
Utilizei a função FillGetDados() que você comentou e me atendeu.
Conforme informação no comentário do Felipe Caiado, na documentação Inicialização do Dicionário de Dados no Banco de Dados (http://tdn.totvs.com/pages/viewpage.action?pageId=364926893) realmente orienta a utilizar a função OpenSXs().
Fiz um teste utilizando a função OpenSXs() para montar o aHeader. Depois submeti ao codeanalysis e apresentou o mesmo erro novamente: Direct Access not allowed in data dictionary.
A documentação está mesmo correta? Ou sou eu quem está fazendo errado.
Seguem os detalhes.
Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.
Estou tendo o mesmo problema ao utilizar a função OpenSxs.
Acredito que o problema seja o ->X3_ onde o codeanalysis identifica como referencia do SX3. Porém, o alias utilizado é o retornado pela função OpenSX (No exemplo acima MEUSX3).
Assim, o meu questionamento é quanto se não existe um erro de validação no CodeAnalysis visto que o acesso não é direto ao SX e estou utilizando a função OpenSx.
Acredito que deveria haver algum tipo de validação no CodeAnalysis que entendesse que o meu alias foi alimentado pela função OpenSx. E de que não estou fazendo acesso direto ao X3.
Ao meu ver isso deveria ser tratado como uma melhoria na validação do CodeAnalysis.
Boa tarde Robson! Teve algum retorno quanto ao seu código? Penso da mesma forma que você. Não está fazendo acesso direto ao dicionário, pelo contrario, o alias utilizado é o que a própria OpenSxs retorna.
Boa Tarde
Algum retorno? Fiz a alteração da mesma forma que você Robson e o código funciona sem problemas, ou seja, a regra é somente para o codeanalysis. Cheguei a abrir um chamado questionando e não deram a devida atenção, simplesmente solicitaram para informar no fórum para solicitar rever regra do codeanalysis. Obrigado
Olá.
Validamos utilizando MEUSX3->&(‘X3_CAMPO’), desta forma o CodeAnalysis não aponta erro na validação.
Att
Gustavo Santos
Gustavo Santos, apenas para entender o uso do ‘&’ ele substituirá o campo X3_CAMPO pelo seu conteudo, isso?
Eu também consegui contornar o problema, trocando (cMySX3)->X3_CAMPO por (cMySX3)->&(“X3_CAMPO”) , mas é lamentável ter que se utilizar de gambiarras, pra contornar um problema que claramente está na regra criada nesta ferramenta.
Se for só para enganar o Code Analysis, não há necessidade de fazer com macro execução, basta adicionar um parêntese: MEUSX3->(X3_CAMPO). O suporte da Totvs nessa nova arquitetura está beirando o ridículo.
Eu tenho utilizado essas duas GETSX3CACHE, FwSX3Util() e não tenho sentido perda de perfomance, mesmo buscando todo o SX3 através da FWSX3Util.
Boa tarde Sergio,
Neste caso esta utilizando a função FwSx3Util(), possui algum exemplo para fornecer pois no TDN no caminho da função não ten nenhum exemplo.
Obrigado.
Bom dia Sergio. Também estou tendo dificuldades em utilizar a função FwSx3Util. Teria algum exemplo de utilização? Agradeço a ajuda.
Boa tarde, existe a documentação da FWSX3Util: http://tdn.totvs.com/display/public/PROT/FWSX3Util, caso ela não esteja te atendendo, qual sua dúvida, como pretende utilizar dela?
Boa tarde Daniel,
Estou usando essa implementação :
aHeader :={}
if select(“cSX3”) > 0
cSX3->(DbCloseArea())
endif
OpenSxs(,“cSX3”,“SX3”,.F.)
dbSelectArea(“cSX3”)
dbSetOrder(1)
if dbseek(ZZZ)
while(cSX3->(!Eof())).AND.cSX3-x3_arquivo = “ZZZ”)
Porém não achei meio de utilizar a função FwSx3Util() aqui.
Grato
Eu tenho utilizado essas duas GETSX3CACHE, FwSX3Util() e não tenho sentido perda de perfomance, mesmo buscando todo o SX3 através da FWSX3Util.