Utilizando o codeanalysis me deparei com a situação em anexo, na documentação indica o uso da função OpenSxs, mas mesmo assim é reportado o erro de acesso direto ao dicionario. Como devo proceder?
Utilizando o codeanalysis me deparei com a situação em anexo, na documentação indica o uso da função OpenSxs, mas mesmo assim é reportado o erro de acesso direto ao dicionario. Como devo proceder?
Boa tarde. Nenhum acesso (seja leitura ou escrita) é permitido nos dicionários. Existem funções auxiliares para tal em http://tdn.totvs.com/pages/viewpage.action?pageId=353290193
Eu sempre uso o DbSelectArea() na SX3 e nunca tive problema. Olhe o exemplo abaixo:
dbSelectArea("SX3") dbSetOrder(1) dbSeek("SZH") Do While ( !Eof() .And. SX3->X3_ARQUIVO == "SZH" ) If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL ) If aScan(aNoFields, SX3->X3_CAMPO ) = 0 aAdd(aHeader,{ Titulo(TRIM(SX3->X3_CAMPO)),; //1 TRIM(SX3->X3_CAMPO),; //2 SX3->X3_PICTURE,; //3 SX3->X3_TAMANHO,; //4 SX3->X3_DECIMAL,; //5 SX3->X3_VALID,; //6 SX3->X3_USADO,; //7 SX3->X3_TIPO,; //8 SX3->X3_ARQUIVO,; //9 SX3->X3_CONTEXT } ) //10 EndIf EndIf dbSelectArea("SX3") dbSkip() EndDo
Certo, hoje tudo funciona perfeitamente, mas estou trabalhando para a migração dos dicionários. Como poderia reescrever o código abaixo? As funções listadas no guia não retornam todas as informações dos campos.
OpenSxs(,,,,,"SX3TMP","SX3",,.F.) DbSelectArea("SX3TMP") DbSetOrder(1) DbSeek("SC6") nUsado := 0 Do While !Eof() .And. SX3TMP->X3_ARQUIVO == "SC6" If X3Uso(SX3TMP->X3_USADO) //.And. cNivel >= SX3->X3_NIVEL //.And. SX3->X3_CONTEXT <> "V" If (Alltrim(SX3TMP->X3_CAMPO) $ "C6_ITEM/C6_PRODUTO/C6_DESCRI/C6_LOCAL/C6_LOTECTL/C6_QTDVEN/C6_QTDENT/C6_QTDLIB/C6_TES") _cValid := "" Do Case Case Alltrim(SX3TMP->X3_CAMPO) == "C6_LOTECTL" _cValid := "U_EL_VALLOTE()" Case Alltrim(SX3TMP->X3_CAMPO) == "C6_QTDLIB" _cValid := "U_EL_VALLIB()" EndCase AADD(aHeader, { AllTrim(SX3TMP->X3_TITULO),; SX3TMP->X3_CAMPO,; SX3TMP->X3_PICTURE,; SX3TMP->X3_TAMANHO,; SX3TMP->X3_DECIMAL,; _cValid,; SX3TMP->X3_USADO,; SX3TMP->X3_TIPO,; SX3TMP->X3_ARQUIVO,; SX3TMP->X3_CONTEXT } ) nUsado++ Endif EndIf DbSelectArea("SX3TMP") DbSkip() Enddo
Gustavo, boa tarde! Teve algum retorno quanto ao seu código acima?
— CALANDRINE MAXIMILIANOs 31 de May de 2019Foi criada uma documentação sobre o assunto, aqui explica certinho (com exemplo):
Guilherme Bigois, tudo bem? Estou tentando validar os fontes no code analysis, ja enviei o projeto, porém nao mostra as inconsistencias, mostra que estao todos A, na verdade qdo clico em ISSUES nao tem nada, o que estou fazendo de errado, pode me ajudar ? Falei com a Totvs, ela recomedou perguntar aqui no Forum...skype edglausiga. Grato.
Bom dia Gustavo Vanazi, Conseguiu resolver seu problema?
Esse link do OpenSxs que eles enviam, não consegui entender de jeito nenhum como colocar isso no meu fonte.
TA FODA essas alterações que a TOTVS faz e a gente é obrigado a adequar!!
Bom dia! Eu consegui resolver essa questao usando o OpenSxs, alem disso coloquei & na frente de cada um dos campos. Segue exemplo
OpenSXs(,,,,,"MEUSX3", "SX3", NIL, .F.) dbSelectArea("MEUSX3") dbSetOrder(1)
If dbSeek("SA1") While (MEUSX3->(!Eof()) .And. MEUSX3->&X3_ARQUIVO == "SA1") ... Logica de Programacao dbSkip() Enddo Endif
— Ellen Santiago 19 de Jul de 2019