Perguntas Direct Access not allowed in data dictionary.

Mais
4 anos 11 meses atrás #32772 por clistenis
Pessoas boa tarde.

Gostaria da ajuda de vocês.

Estou validando os fontes no codeanalisys e ocorreu o seguinte erro em fazer um dbseek na SX3.

Segue em anexo, alguem poderia me ajudar ?

Já analisei OpenSXs, FWSX3util mais infelizmente ainda não consegui adequar meu fonte.

O mesmo é para ser usado para montar uma MSNewGetDados.

Grato.
Anexos:

Por favor Acessar ou Registrar para participar da conversa.

Mais
4 anos 11 meses atrás - 4 anos 11 meses atrás #32790 por kanaamlrr
Boa tarde!

Eu criei essa função genérica para resolver essas situações de dicionário:
#Include 'Protheus.ch'

/*
Funcao      : retSXs
Objetivos   : Rotina para retornar dados do dicionário já utilizando estrutura da função OpenSxs()
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 23/04/2019
Parâmetros  :

	cDic - Alias do dicionário a ser aberto. Ex: SX3, SX2, SIX, etc...
	aFields - Array contendo os campos do dicionário a serem retornados. Ex: {"X3_NOME","X3_TAMANHO","X3_DECIMAL"}
	cChave - Chave a ser utilizada no filtro do dicionário. Ex: "SA1"
	cCpoFil - Campos que serão filtrados. Ex: "X3_ARQUIVO"
	lUsado - Somente campos usados (somente para SX3)
	lNivel - Somente campos com nivel de acesso (somente para SX3)
*/
*-------------------------------------------------------------*
User Function retSXs(cDic,aFields,cChave,cCpoFil,lUsado,lNivel)
*-------------------------------------------------------------*
Local cAlias   := GetNextAlias()
Local cFilter  := cAlias + "->(" + cCpoFil + ") == '"+cChave+"'"
Local aRet     := {}
Local __cUsado := "X3_USADO"
Local __cNivel := "X3_NIVEL"
Default lUsado := .F.
Default lNivel := .F.

OpenSXs(NIL, NIL, NIL, NIL, NIL, cAlias, cDic, NIL, .F.)

(cAlias)->(dbSetOrder(1))
(cAlias)->(dbSeek(cChave))
While (cAlias)->(!Eof()) .AND. (cAlias)->&(cCpoFil) == cChave	

	If (lUsado .AND. lNivel .AND. X3USO((cAlias)->&(__cUsado)) .AND. cNivel >= (cAlias)->&(__cNivel));
	    .OR. (lUsado .AND. X3USO((cAlias)->&(__cUsado)));
	    .OR. (lNivel .AND. cNivel >= (cAlias)->&(__cNivel)) 
		aAdd(aRet, GenStruct(cAlias,aFields))
	Else
		aAdd(aRet, GenStruct(cAlias,aFields))
	EndIf
	
	(cAlias)->(dbSkip())
EndDo
(cAlias)->(dbCloseArea())
Return aRet

*---------------------------------------*
Static Function GenStruct(cAlias,aFields)
*---------------------------------------*
Local aAux := {}

If aFields[1]=="HEADER"
   aFields := {;
                  "X3_TITULO",;
                  "X3_CAMPO",;
                  "X3_PICTURE",;
                  "X3_TAMANHO",;
                  "X3_DECIMAL",;
                  "X3_VALID",;
                  "X3_USADO",;
                  "X3_TIPO",;
                  "X3_F3",;
                  "X3_CONTEXT"}
EndIf

AEval(aFields, {|cField| AAdd(aAux, (cAlias)->&(cField))})

Return (aAux)

Para fazer a chamada você pode utilizar basicamente de duas formas:
Local aSemSx3 := {}
Local aFields := {"X3_CAMPO","X3_TIPO","X3_TAMANHO","X3_DECIMAL"}

aHeader := U_retSXs("SX3",{"HEADER"},"SZM","X3_ARQUIVO",.T.,.T.)
aSemSx3 := U_retSXs("SX3",aFields,"SZM","X3_ARQUIVO",.T.,.T.)

Espero ter ajudado.
Abraço!
Ultima edição: 4 anos 11 meses atrás por kanaamlrr.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.119 segundos
Joomla templates by a4joomla