Motivação

Essa página foi criada com o intuito dos integrantes das equipes de Faturamento e CRM, Serviços e Jurídico introduzirem informações sobre error.logs gerais e usuais dos nossos processos e rotinas.


Essa página é de uso interno, a página ou esse conteúdo não deve ser compartilhado aos clientes.

Conceito

Os logs de erro são escrituras feitas pelo sistema quando algo não esperado acontece no processamento, ocasionando sua queda e mal funcionamento.

Estrutura de análise dos erros

Erros


Explicação

Esse erro acontece quando (...), sejam as possíveis causas:

  • A
  • B
  • C
  • D
  • E


Tópicos de Análise (com tickets de exemplo)

Erro

Para ver o erro completo, abra o ticket: link aqui

THREAD


Tópicos de Análise

Note que na linha X, no valor do atributo (...)

THREAD ERROR


Trecho exato:

Sabemos então, que (...)




Called from FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 1004


A - Buscando pela função da primeira pilha

STACK

Conseguimos extrair:

  • A
  • B


B - Anotação 2

STACK 

Resultado pós análise/interação:



Explicação

Esse erro acontece quando a função "TcSetField" recebeu um tamanho maior que suporta.

  • Customização nos fontes
  • Customização no dicionário (gatilho/estrutura da tabela/campo)


Tópicos de Análise (com tickets de exemplo)

Erro

Para ver o erro completo, abra o ticket: https://totvssuporte.zendesk.com/agent/tickets/19278994

THREAD ERROR ([7388], Leandro Henrique, DESKTOP-FRPSSCH)   07/02/2024   17:16:29
: WARNING - TCSetField - Invalid field len: 20  on {|X| IF(X[2] <> "C", TCSETFIELD(CCURSOR3,X[1],X[2],X[3],X[4]),NIL)}(MATA461.PRX) 01/12/2023 15:19:53 line : 1119


Tópicos de Análise

: WARNING - TCSetField - Invalid field len: 20 on {|X| IF(X[2] <> "C", TCSETFIELD(CCURSOR3,X[1],X[2],X[3],X[4]),NIL)}(MATA461.PRX) 01/12/2023 15:19:53 line : 1119

Ou seja:

  • Função a ser analisada: TCSetField
  • Suposto Erro: Invalid field len: 20
  • Trecho: {|X| IF(X[2] <> "C", TCSETFIELD(CCURSOR3, X[1], X[2], X[3], X[4]), NIL)}


Função 1 a ser estudada:


A documentação do TCSetField está aqui: TCSetField


Sintaxe: TCSetField( < cAlias >, < cField >, < cType >, [ nSize ], [ nPrecision ] )

  • nSize especifica a quantidade total de dígitos de um campo "N", e seu valor deve estar entre 1 e 18. Caso o valor não esteja nesse intervalo, será apresentada a mensagem de erro fatal: "WARNING - TCSetField - Invalid field len: nSize".


Linha no fonte:

  • aEval(SC9->(dbStruct()), {|x| If(x[2] <> "C", TcSetField(cCursor3,x[1],x[2],x[3],x[4]),Nil)})


A linha está validando, se a posição x[2] não for Caractere, pode-se utilizar a função TCSetField() pois ela não espera Caractere no elemento "nSize".

  • O x[3] é o elemento nSize na função TCSetField na linha do fonte.




Função 2 a ser estudada:


Tudo está dentro da função aEval: AEVal


Sintaxe: AEval( < aArray >, < bBlock >, [ nStart ], [ nCount ] )

  • aArray = Indica o array que será lido.
  • bBlock = Indica o bloco de código que será executado para cada elemento encontrado.


aArray = SC9->(dbStruct())

bBlock = {|x| If(x[2] <> "C", TcSetField(cCursor3,x[1],x[2],x[3],x[4]),Nil)}




Função 3 a ser estudada:


É utilizado a função dbStruct(): DBStruct como primeira posição da função aEval.


Retorno:

  • aRet - Retorna um array com a estrutura dos campos. Cada elemento é um subarray contendo nome, tipo, tamanho e decimais.
  • Essa função é utilizada para recuperar a estrutura da tabela corrente. Esse mesmo array é usado para criar a tabela, por exemplo através da função DBCreate.
  • É retornado um array bidimensional onde cada linha corresponde a um campo da estrutura e cada coluna a seguinte informação:

    Posição

    Tipo

    Tamanho

    Descrição

    1

    C

    10 bytes

    Contém o nome do campo da tabela.

    2

    C

    1 byte

    Contém o tipo do campo da tabela. Pode ser: "C" (Caractere), "N" (Numérico), "L" (Lógico), "D" (Data) ou "M" (Memo).

    3

    N

    -

    Contém o tamanho do campo.

    4

    N

    -

    Contém a quantidade de casas decimais que o campo pode armazenar, desde que o campo seja do tipo "N". Para os demais tipos, esta informação retorna sempre com 0 (zero).

  • A informação retornada na terceira coluna do array, correspondendo ao tamanho do campo, está condicionada ao tipo do campo.

    Tipo

    Descrição

    C

    O tamanho retornado corresponde ao tamanho de string máxima que pode ser armazenado na coluna.

    D

    É retornado sempre 8 bytes.

    L

    É retornado sempre 1 byte.

    M

    É retornado sempre 10 bytes. Observação: É importante lembrar que, este valor é retornado por compatibilidade e não corresponde a capacidade real de armazenamento da coluna. O tamanho máximo de armazenamento de uma coluna do tipo "M" está condicionada ao driver RDD utilizado.

    N

    Juntamente com o valor retornado na quarta posição, quantidade de decimais, informa a capacidade de armazenamento de valores numéricos no campo.



Conclusão:

  • 0 O erro está que o campo recebeu um valor que não está no intervalo de 1 e 18.
  • 1 Está tudo sendo lido e executado dentro da função eVal que executa comandos para um bloco de código.
  • 2 A primeira posição está o Array lido com a função DbStruct(), posição 3: Contém o tamanho do campo.
  • 3 A segunda posição está sendo executado dentro do bloco de código a partir do conteúdo do Array lido, a função TCSetField().
  • 4 A função TCSetField() não está aceitando o parâmetro passado, pego pela posição 3 na função DbStruct() 

É necessário saber qual campo nessa posição e de qual tabela eventualmente pode estar sendo atribuido.

Voltando um pouco mais acima no fonte.

Na linha acima há o trecho:

  •     dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQrySC9),cCursor3,.F.,.T.)


Documentação da função dbUseArea: DBUseArea


Sintaxe: DBUseArea( [ lNewArea ], [ cDriver ], < cFile >, < cAlias >, [ lShared ], [ lReadOnly ] )


A posição 3 da função pega a tabela a ser aberta.

A posição 4 da função pega o nome dado ao ALIAS da tabela para ser interpretado pelo AdvPL.



Conclusão:

  • Algum campo da tabela SC9 possui o X3_PICTURE ou o X3_TAMANHO maior que 18 ou menor que 1. (Sendo esse campo com erro do Tipo (X3_TIPO) "N" ou "D").

Resultado pós análise/interação

-



Explicação

Esse erro acontece quando é realizado no dicionário a informação de um dado com "Picture"/"Formato" inválido, sejam as possíveis causas:

  • Customização nos fontes
  • Customização no dicionário (gatilho campo)
  • Campos com formato errado


Há abaixo dois exemplos, o primeiro onde o sistema não exibe a Query no cabeçalho e o outro, onde a Query com erro já é exibida no cabeçalho facilitando a análise.

Tópicos de Análise (com tickets de exemplo)

Erro

Para ver o erro completo, abra o ticket: https://totvssuporte.zendesk.com/agent/tickets/18537428

THREAD ERROR ([45892], estoquef202, ESTF206)   22/11/2023 15:27:39
invalid macro source (SSLex0105e: Invalid token, Line 1, Offset 28, ?):({|x| If(.T.,(x:PictVar := ?,.T.),.F.) .AND. Self:lActive  .and. Eval(aBlock[              116])}) on MSMGET:NEW(MSMGETPR.PRW) 06/10/2023 09:02:56 line : 1695  


Tópicos de Análise

No cabeçalho, desde a estrutura condicional "IF" há algumas validações:

If(.T.,(x:PictVar := ?,.T.),.F.) .AND. Self:lActive .and. Eval(aBlock[ 116])


Dividindo-as:

Primeira validação: If(.T.,(x:PictVar := ?,.T.),.F.) 

Segunda validação: Self:lActive

Terceira validação: Eval(aBlock[ 116])

Agora, podemos copiar cada validação e colocar pelo error.log completo em busca de visualizar onde no dicionário (Qual campo) a customização está:


Procurando pela primeira validação, temos:

O primeiro campo com a validação errônea, o campo customizado "C6_YQTDSEP".


Procurando pela segunda e terceira validação chegamos no mesmo lugar que a primeira.


Conclusão:

Deve ser realizado o teste sem o campo customizado, pois a validação dele e seus campos de formato no dicionário estão errôneos ou contém customização.


Resultado pós análise/interação

"Deu certo, o problema era devido aos 2 campos customizados C6_YDTFSEP" e "C6_YQTDSEP". os desabilitei e deu certo. muito obrigado pelo o atendimento"



Explicação

Esse erro acontece quando é realizado Querys em SQL a comando do sistema e, algum campo utilizado na contagem, exemplo "Count(C6_QTDVEN)" possui algum símbolo de operação em SQL, desordenando o que o sistema entende como começo e fim dos comandos SQL, sejam as possíveis causas:

  • Algum campo utilizado na Query possuir os símbolos: < > ! ' = | + - * / %
  • O campo da Query não existir
  • Customizações de filtro


Há abaixo dois exemplos, o primeiro onde o sistema não exibe a Query no cabeçalho e o outro, onde a Query com erro já é exibida no cabeçalho facilitando a análise.

Tópicos de Análise (com tickets de exemplo)

Erro

Para ver o erro completo, abra o ticket: https://totvssuporte.zendesk.com/agent/tickets/18537428

THREAD ERROR ([26024], systh, VLUP-ARKO-APP)   14/11/2023 09:42:08
: Error : 0 (07001) (RC=-1) - [Microsoft][ODBC Driver 17 for SQL Server]Campo COUNT incorreto ou erro de sintaxe
Error : 0 (00000) (RC=-1) - 
 ( From tODBCStatement::SqlBind )
Thread ID [16116]	User [Administrador]	IO [8429]	Tables [142]	MaxTables [143]	Comment [MATA410 - TCPIP - ThreadID(26024)]	SP [ ]	Traced [No]	SQLReplay [No]	InTran [Yes]	DBEnv [MSSQL/PROTHEUS_PRODUCAO_ARKO]	DBThread [(SPID 644,81,1229)]	Started [14/11/2023 09:35:52]	IP [127.0.0.1:1234]	IDLE [ ]	InTransact [89 s.]	Memory [0]	Running [ROP_QUERY2 for 0 s.]	RCV [719983]	SND [3180458]	TCBuild [20220303-20230623]	TCVersion [22.1.1.5]	ARCH [64]	OS [WINDOWS]	BUILD [RELEASE]	
 on MPSYSOPENQUERY(MPSYSOPENTABLES.PRW) 11/08/2023 16:29:12 line : 715


Tópicos de Análise

Quando ocorre esse erro, por trás há uma Query, vamos procurar pelas chamadas até encontrá-la, podemos dar "Ctrl + F" e buscar por "Query" ou "CQUERY".


Ao encontrar essa "CQUERY"

Local 128:

CQUERY(C) :

SELECT DISTINCT D2_FILIAL,D2_DOC,D2_SERIE,D2_PEDIDO,F2_FRETE,F2_FRETAUT,F2_SEGURO,F2_DESPESA,F2_DESCCAB,F2_VLR_FRT
FROM SF2010 SF2, SD2010 SD2
WHERE  SD2.D2_FILIAL='0101'
AND SD2.D2_PEDIDO = '006023'
AND SD2.D_E_L_E_T_=' '
AND SF2.F2_FILIAL='0101'
AND SF2.F2_DOC = SD2.D2_DOC
AND SF2.F2_SERIE = SD2.D2_SERIE
AND SF2.F2_CLIENTE = SD2.D2_CLIENTE
AND SF2.F2_LOJA = SF2.F2_LOJA
AND SF2.D_E_L_E_T_= ' ' 

Sabemos que não é ela pois os filtros dela estão bem determinados, então o sistema conseguiu concluir a Query, por exemplo "SD2.D2_PEDIDO = '006023'" está bem determinístico, o sistema tentou achar o pedido "006023". Então continuemos.


Trecho exato:

Buscando pela última chamada pré-erro (MPSYSOPENQUERY(MPSYSOPENTABLES.PRW)) conseguimos ver essa CQUERY montada a seguir, note que ela possui falhas, retornando no valor da consulta "?"

STACK MPSYSOPENQUERY(MPSYSOPENTABLES.PRW) 11/08/2023 16:29:12

Param 1: CQUERY(C) :

SELECT B8_FILIAL,B8_QTDORI,B8_PRODUTO,B8_LOCAL,B8_DATA,B8_DTVALID,B8_SALDO,B8_EMPENHO,B8_ORIGLAN,B8_LOTEFOR,B8_CHAVE,B8_LOTECTL,B8_NUMLOTE,B8_QEMPPRE,B8_QACLASS,B8_SALDO2,B8_QTDORI2,B8_EMPENH2,B8_QEPRE2,B8_QACLAS2,B8_DOC,B8_SERIE,B8_CLIFOR,B8_POTENCI,B8_PRCLOT,B8_ITEM,B8_NUMDESP,B8_DFABRIC,B8_ORIGEM,B8_SDOC,B8_LOJA,SB8.R_E_C_N_O_ SB8RECNO
FROM SB8010 SB8
WHERE  SB8.B8_FILIAL= ?
AND SB8.B8_PRODUTO= ?
AND SB8.B8_LOCAL= ?
AND SB8.B8_LOTECTL= ?
AND SB8.B8_SALDO > 0
AND SB8.D_E_L_E_T_=' '
ORDER BY  B8_FILIAL,B8_PRODUTO,B8_LOCAL,B8_LOTECTL,B8_NUMLOTE,B8_DTVALID


Sabemos então, que o campo do erro é algum dos campos acima.


Agora precisamos checar todos os campos acima pelo error.log se algum está com os símbolos indevidos ou se existem.


Começando a procurar pelos campos da expressão "WHERE", ou seja (B8_FILIAL, B8_PRODUTO, B8_LOCAL, B8_LOTECTL e B8_SALDO):

WHERE  SB8.B8_FILIAL= ?
AND SB8.B8_PRODUTO= ?
AND SB8.B8_LOCAL= ?
AND SB8.B8_LOTECTL= ?
AND SB8.B8_SALDO > 0
AND SB8.D_E_L_E_T_=' '


Ao procurar no arquivo aberto da tabela SB8 os campos:


O retorno:


Conclusão:

Todos os campos existem porém, o campo B8_LOTECTL está com valores de carácteres indevidos que bagunçam o entendimento do SQL na leitura das chamadas de Query.

O campo com esse valor é a causa do erro. Como o campo já está com o valor gravado, indicamos que o cliente teste com outro lote informado e que, contate seu DBA/Analista In Loco para tratar dentre todas as tabelas, o nome indevido contendo aspas.



Resultado pós análise/interação

Cliente não retornou sobre o erro crucial para a operação, logo, problema resolvido.



Erro

Para ver o erro completo, abra o ticket: https://totvssuporte.zendesk.com/agent/tickets/18573677

THREAD ERROR ([11320], cpereira, DELTA-NT-HP-001)   17/11/2023 12:25:34
: Error : 0 (07001) (RC=-1) - [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error
Error : 0 (00000) (RC=-1) - 
 ( From tMSSQLConnection::GetQueryFile )
Thread ID [18100]	User [ofiorentino]	IO [4137]	Tables [58]	MaxTables [60]	Comment [MATR690 - TCPIP - ThreadID(11320)]	SP [ ]	Traced [No]	SQLReplay [No]	InTran [No]	DBEnv [MSSQL/HARDY_HOMOLOG]	DBThread [(SPID 213,247)]	Started [17/11/2023 12:24:25]	IP [192.168.1.148:7953]	IDLE [ ]	InTransact [ ]	Memory [0]	Running [ROP_QUERY for 0 s.]	RCV [220515]	SND [723162]	TCBuild [20210202-20220802]	TCVersion [21.1.1.8]	ARCH [64]	OS [WINDOWS]	BUILD [RELEASE]	
SELECT SUM(SB2.B2_QATU) B2_QATU,SUM(SB2.B2_QEMP) B2_QEMP,SUM(SB2.B2_RESERVA) B2_RESERVA,SUM(SB2.B2_SALPEDI) B2_SALPEDI FROM SB2010 SB2 WHERE  B2_FILIAL = '01' AND SB2.B2_COD = ''  'HM001J59F               ' AND B2_LOCAL >= 'ZZ' AND B2_LOCAL <= ? AND SB2.D_E_L_E_T_= ' ' on __EXECSQL(APLIB300.PRW) 23/05/2023 15:13:31 line : 147
  


Tópicos de Análise

Quando ocorre esse erro, por trás há uma Query com erro e ela foi demonstrada no cabeçalho:

SELECT SUM(SB2.B2_QATU) B2_QATU,SUM(SB2.B2_QEMP) B2_QEMP,SUM(SB2.B2_RESERVA) B2_RESERVA,SUM(SB2.B2_SALPEDI) B2_SALPEDI FROM SB2010 SB2 WHERE  B2_FILIAL = '01' AND SB2.B2_COD = ''  'HM001J59F               ' AND B2_LOCAL >= 'ZZ' AND B2_LOCAL <= ? AND SB2.D_E_L_E_T_= ' '


Sabemos então, que o campo do erro é algum dos campos acima.


Agora precisamos checar todos os campos acima pelo error.log se algum está com os símbolos indevidos ou se existem.


Analisando já podemos ver que o campo B2_COD está com aspas indevidas: B2_COD = ' '    ' HM001J59F            '


Ao procurar no arquivo aberto da tabela SB2 os campos da Query (B2_FILIAL, B2_COD, B2_LOCAL, B2_SALPEDI, B2_RESERVA, B2_QEMP, B2_QATU):


O retorno:


Podemos ver que todos existem e nenhum está indevido, contudo, na Query foi apontado que o código produto era aproximadamente "HM001J59F" e não "MMR0220025000820CAK25F".


Ao procurar no arquivo do erro inteiro por "MMR0220025000820CAK25F" só há apenas essa ocorrência que menciona esse código, ou seja, indica que o sistema realmente se perdeu no campo de produto indevido com aspas.


Procurando pela tabela que dá o código do produto no sistema (SB1), pelo campo de código (B1_COD), encontramos:

Outro produto não visto anteriormente, comprovando ainda mais a tese.


Procurando pelo código aproximado do produto com erro "HM001J59F" chegamos 


Ou seja, dentro da Query está sendo encontrado esse produto (B1_COD) com o valor indevido, no caso, com aspas.


Conclusão:

Todos os campos existem porém, o campo B1_COD/B2_COD estão com valores de carácteres indevidos que bagunçam o entendimento do SQL na leitura das chamadas de Query.

Os campos com esse tipo de valor é a causa do erro. Como os campos já estão com o valor gravado, indicamos que o cliente teste restringindo o filtro e tratando todos os valores indevidos dos campos B1_COD e B2_COD, para isso, ele deve contatar seu DBA/Analista In Loco para tratar dentre todas as tabelas, os valores indevidos contendo aspas.



Resultado pós análise/interação

Cliente não retornou sobre o erro crucial para a operação, logo, problema resolvido.



Explicação

O Array (ou Matriz) no AdvPL é um tipo básico de dado que permite criar listas de tamanho e conteúdo dinâmicos. Um erro do tipo "Array out of bounds" (fora dos limites) indica que o fonte tentou buscar uma posição, em uma variável do tipo Array, que não existe. Exemplo: O fonte pede para buscar a posição 4 de um Array que só possui 3 posições.


THREAD ERROR ([24164], taissamiranda, PCL57)   21/07/2023 16:33:17
array out of bounds [8] of [7]  on {||  (IIF(!EMPTY(AATIVIDADES[OLBX:NAT,2]) .AND. TK380VALIDO(AATIVIDADES,OLBX:NAT,OCALEND2:DDIAATU),(TK380EXECLISTA(AATIVIDADES[OLBX:NAT]),AATIVIDADES:=TK380CARREGASU4(OCALEND2:DDIAATU),ASORT(AATIVIDADES,,,{|X,Y|DTOS(X[3])+X[4]<DTOS(Y[3])+Y[4]}),OLBX:SETARRAY(AATIVIDADES),OLBX:BLINE:={||{TK380LEG(AATIVIDADES[OLBX:NAT,2]),AATIVIDADES[OLBX:NAT,3],AATIVIDADES[OLBX:NAT,4],AATIVIDADES[OLBX:NAT,5],AATIVIDADES[OLBX:NAT,6],TK380RETROT(AATIVIDADES[OLBX:NAT,7])}},TK380PDETALHES(@ADET_PANEL,AATIVIDADES[OLBX:NAT],@OPDETALHES),TK380PPENDENCIA(@APEND_PANEL,AATIVIDADES[OLBX:NAT],@OPPENDENCIA),TK380ATUSAUDACAO(OU6STATUS,OUOMETA,AATIVIDADES[OLBX:NAT]),OLBX:REFRESH(),ODLGAGENDA:REFRESH()),))}(TMKA380.PRW) 04/05/2023 16:01:55 line : 383

[TOTVS build: 7.00.210324P-20230531]
Called from ::MSDIALOG:ACTIVATE
Called from TMKA380(TMKA380.PRW) 04/05/2023 16:01:55 line : 395
Called from __EXECUTE(APLIB090.PRW) 23/05/2023 15:13:31 line : 721
Called from MDIEXECUTE(APLIB260.PRW) 23/05/2023 15:13:31 line : 924

Ticket de referência: #17629156

1. O primeiro passo é tentar identificar o nome do Array que o sistema está validando, isso pode ser feito:

  • Pelo próprio erro,  através do Stack das funções chamadas no erro ou no cabeçalho do erro que aponta o erro:

Neste caso o Array "aAtividades" é citado no cabeçalho do erro:

array out of bounds [8] of [7]  on {||  (IIF(!EMPTY(AATIVIDADES[OLBX:NAT,2]) .AND. TK380VALIDO(AATIVIDADES,OLBX:NAT,OCALEND2:DDIAATU),(TK380EXECLISTA(AATIVIDADES[OLBX:NAT]),AATIVIDADES:=TK380CARREGASU4(OCALEND2:DDIAATU),ASORT(AATIVIDADES,,,{|X,Y|DTOS(X[3])+X[4]<DTOS(Y[3])+Y[4]}),OLBX:SETARRAY(AATIVIDADES),OLBX:BLINE:={||{TK380LEG(AATIVIDADES[OLBX:NAT,2]),AATIVIDADES[OLBX:NAT,3],AATIVIDADES[OLBX:NAT,4],AATIVIDADES[OLBX:NAT,5],AATIVIDADES[OLBX:NAT,6],TK380RETROT(AATIVIDADES[OLBX:NAT,7])}},TK380PDETALHES(@ADET_PANEL,AATIVIDADES[OLBX:NAT],@OPDETALHES),TK380PPENDENCIA(@APEND_PANEL,AATIVIDADES[OLBX:NAT],@OPPENDENCIA),TK380ATUSAUDACAO(OU6STATUS,OUOMETA,AATIVIDADES[OLBX:NAT]),OLBX:REFRESH(),ODLGAGENDA:REFRESH()),))}(TMKA380.PRW) 04/05/2023 16:01:55 line : 383
  • Pela linha do fonte onde o erro ocorre:

Neste caso, o erro ocorre após a validação do array "aAtividades":

	// Botoes da para execucao das tarefas.
	DEFINE SBUTTON FROM 05,nCol-65 TYPE 1  ;
							ACTION 	(IIF(	!Empty(aAtividades[oLbx:nAt,2]) .AND. Tk380Valido(aAtividades,oLbx:nAt,oCalend2:dDiaAtu),;
											(Tk380ExecLista(aAtividades[oLbx:nAt]),;
											aAtividades := Tk380CarregaSU4(oCalend2:dDiaAtu),;
											ASORT(aAtividades,,,{|x,y| DToS(x[3])+x[4] < DToS(y[3])+y[4]}),;
											oLbx:SetArray(aAtividades),;
											oLbx:bLine:={||{Tk380Leg(	aAtividades[oLbx:nAt,2]),;
																		aAtividades[oLbx:nAt,3],;
																		aAtividades[oLbx:nAt,4],;
																		aAtividades[oLbx:nAt,5],;
																		aAtividades[oLbx:nAt,6],;
																		Tk380RetRot(aAtividades[oLbx:nAt,7])}},;
											Tk380PDetalhes(@aDet_Panel,aAtividades[1],@oPDetalhes)	,;	  // Atualiza o painel de detalhes
											Tk380PPendencia(@aPend_Panel,aAtividades[1],@oPPendencia),;  // Atualiza o painel de pendencias
											Tk380AtuSaudacao(oU6Status,oUOMeta,aAtividades[1]),; 		// Atualiza os dados do cabecalho.
											oLbx:Refresh(),;
											oDlgAgenda:Refresh()),; 
											)) ;
							ENABLE OF oPanel3 PIXEL <--- O Erro ocorre aqui


2. Identificado o Array que vamos investigar, precisamos avaliar os campos/variáveis que formam esse Array

No fonte do erro (TMKA380) é identificado que quem preenche o Array é a função "Tk380CarregaSU4":

	oCalend2:bChange    := {|| 	aAtividades:=Tk380CarregaSU4(oCalend2:dDiaAtu),;  <--- Veja que atribui ao array o retorno dessa função

Então vamos verificar o em qual fonte esta a função "Tk380CarregaSU4", neste caso o fonte "TMKA380C", e procurar pelo preenchimento do array "aAtividades".

A adição de elementos no Array é realizada através da função "AAdd":

If nTotal > 0
				AAdd(aAtividades,{	(cTmpSU4)->U4_LISTA	,; 	// 1
						"3",; 	// 2
						(cTmpSU4)->U4_DATA	,; 	// 3
						(cTmpSU4)->U4_HORA1	,; 	// 4
						(cTmpSU4)->U4_DESC	,; 	// 5
						(cTmpSU4)->U4_OPERAD,; 	// 6
						(cTmpSU4)->U4_TELE	,; 	// 7
						(cTmpSU4)->U4_CODLIG,;	// 8
						(cTmpSU4)->U4_FORMA})	// 9	
		Else
			AAdd(aAtividades,{	(cTmpSU4)->U4_LISTA	,; 	// 1
						(cTmpSU4)->U4_STATUS,; 	// 2
						(cTmpSU4)->U4_DATA	,; 	// 3
						(cTmpSU4)->U4_HORA1	,; 	// 4
						(cTmpSU4)->U4_DESC	,; 	// 5
						(cTmpSU4)->U4_OPERAD,; 	// 6
						(cTmpSU4)->U4_TELE	,; 	// 7
						(cTmpSU4)->U4_CODLIG,;	// 8
						(cTmpSU4)->U4_FORMA})	// 9		
		EndIf
	Else
		AAdd(aAtividades,{	(cTmpSU4)->U4_LISTA	,; 	// 1
						(cTmpSU4)->U4_STATUS,; 	// 2
						(cTmpSU4)->U4_DATA	,; 	// 3
						(cTmpSU4)->U4_HORA1	,; 	// 4
						(cTmpSU4)->U4_DESC	,; 	// 5
						(cTmpSU4)->U4_OPERAD,; 	// 6
						(cTmpSU4)->U4_TELE	,; 	// 7
						(cTmpSU4)->U4_CODLIG,;	// 8
						(cTmpSU4)->U4_FORMA})	// 9
	EndIf	


3. Agora que já sabemos quais campos ou informações compõem esse array vamos focar a investigação nesses campos (todos)


  

Solicitamos ao cliente verificar os campos que compõem o array:

  • Eles existem no SX3?
  • Eles estão como "usados" no CFG?
  • O "Nível" (X3_NIVEL) foi alterado?
  • A "ordem" (X3_ORDEM) foi alterada?

O cliente verificou que todos os campos estavam ok, mas o erro persistia.

Então verificamos se esses campos foram preenchidos na tabela SU4 e foi verificado que os campos U4_DATA e U4_HORA1 não eram preenchidos, verificamos que o conteúdo desses campos vem dos campos "Retorno" (ACF_PENDEN) e "Hora" (ACF_HRPEND), porém no processo do cliente esses campos não eram preenchidos mesmo eles sendo obrigatórios.

O cliente retirou a obrigatoriedade dos campos, mesmo sendo bloqueados no CFG.

Explicação

Esse erro acontece qual é alterado a estrutura de dicionário padrão do Protheus, ou foi realizado um filtro de rotina invalido, sejam as possíveis causas:

  • Ordem de campos (X3_ORDEM)
  • Estrutura de campos (Dados da tabela SX3)
  • Estrutura de gatilhos (Dados da tabela SX6)
  • Estrutura de perguntes (Dados da tabela SX1)
  • Filtros com sintaxe errada (nas telas na pesquisa)


Tópicos de Análise (com tickets de exemplo)

Erro

Para ver o erro completo, abra o ticket: https://totvssuporte.zendesk.com/agent/tickets/17597701

THREAD ERROR ([22385], Robson, LAPTOP-IOFSC6N4)   02/08/2023 18:23:20
invalid macro source (SSYacc0105e: Error token failed, no valid token):({|a,b,c| FWInitCpo(a,b,c),xRet:=(@!),FWCloseCpo(a,b,c,.T.),xRet }) on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 5520 


Tópicos de Análise

Note que na linha 2, no valor do atributo "xRet" há o retorno "@!" indicando que isso foi o que o sistema recebeu e, depois houve o erro:

THREAD ERROR ([22385], Robson, LAPTOP-IOFSC6N4)   02/08/2023 18:23:20
invalid macro source (SSYacc0105e: Error token failed, no valid token):({|a,b,c| FWInitCpo(a,b,c),xRet:=(@!),FWCloseCpo(a,b,c,.T.),xRet }) on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 5520


Trecho exato:

Sabemos então, que o conteúdo (variável/pergunte/campo/filtro) que gerou o erro possui o formato "@!".


Called from FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 1004
Called from FORMSTRUTABLE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 433
Called from FWFORMSTRUCT(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 3985
Called from FWMBROWSE:LOADCOLUMNS(FWMBROWSE.PRW) 04/04/2023 15:05:10 line : 1796
Called from FWMBROWSE:ACTIVATE(FWMBROWSE.PRW) 04/04/2023 15:05:10 line : 562
Called from FWMARKBROWSE:ACTIVATE(FWMARKBROWSE.PRW) 04/04/2023 15:05:10 line : 267
Called from FWMARKBROWSE(MSLIB.PRW) 04/04/2023 15:05:10 line : 10784
Called from MARKBROWSEF(MSLIB.PRW) 04/04/2023 15:05:10 line : 5783
Called from MARKBROW(MSLIB.PRW) 04/04/2023 15:05:10 line : 5763
Called from MATA500(MATA500.PRX) 17/03/2022 18:01:27 line : 129
Called from __EXECUTE(APLIB090.PRW) 04/04/2023 15:05:08 line : 721
Called from MDIEXECUTE(APLIB260.PRW) 04/04/2023 15:05:08 line : 924  


A - Buscando pela função da primeira pilha "FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX)", obtemos:

STACK FWFORMSTRUCT(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10

  Param 1: NTYPE(N) : 3
  Param 2: CALIASSX2(C) : SC6
  Param 3: BSX3(U) : NIL
  Param 4: LVIEWUSADO(L) : .F.
  Param 5: LVIRTUAL(L) : .T.
  Param 6: LFILONVIEW(L) : .F.
  Param 7: CPROGRAM(C) : MATA500
  Local 1: NTYPE(N) :3
  Local 2: CALIASSX2(C) :SC6
  Local 3: BSX3(U) :NIL
  Local 4: LVIEWUSADO(L) :.F.
  Local 5: LVIRTUAL(L) :.T.
  Local 6: LFILONVIEW(L) :.F.
  Local 7: CPROGRAM(C) :MATA500
  Local 8: AAUX(A) :
  Local 9: OSTRUCT(U) :NIL

Conseguimos extrair:

  • O programa onde deu o erro é o MATA500 pelo parâmetro 7.
  • A tabela do erro posicionada é a tabela SC6 pelo parâmetro 2.


B - Buscando pela segunda função da pilha "FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX)", obtemos:

STACK FORMSTRUTABLE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10

  Param 1: CALIASSX2(C) : SC6
  Param 2: BSX3(U) : NIL
  Param 3: LVIEWUSADO(L) : .F.
  Param 4: LVIRTUAL(L) : .T.
  Param 5: LFILONVIEW(L) : .F.
  Param 6: NTYPE(N) : 3
  Local 1: CALIASSX2(C) :SC6
  Local 2: BSX3(U) :NIL
  Local 3: LVIEWUSADO(L) :.F.
  Local 4: LVIRTUAL(L) :.T.
  Local 5: LFILONVIEW(L) :.F.
  Local 6: NTYPE(N) :3
  Local 7: AAREA(A) :
  Local 8: AAUX(A) :
  Local 9: AGROUPS(A) :
  Local 10: ARETORNO(A) :
  Local 11: CAUX(C) :
  Local 12: LHASXXA(L) :.F.
  Local 13: LOLDSET(L) :.F.
  Local 14: LUSADO(L) :.T.
  Local 15: LUSADOMODEL(L) :.T.
  Local 16: NPOS(N) :0
  Local 17: NX(N) :0
  Local 18: NY(N) :0
  Local 19: CQUERY(C) :INSERT INTO dbo.##TMPSC00_122 (X3_CAMPO) SELECT XAM_FIELD FROM XAM010 XAM WHERE  XAM.XAM_FIELD IN (SELECT SX3.X3_CAMPO FROM SX3010 SX3 WHERE  SX3.X3_ARQUIVO = 'SC6' AND SX3.D_E_L_E_T_ = ' ' ) AND XAM.XAM_ANONIM = '1' AND XAM.D_E_L_E_T_=' ' AND NOT EXISTS (SELECT XAMSUB.R_E_C_N_O_ FROM XAM010 XAMSUB WHERE  XAMSUB.XAM_FIELD = XAM.XAM_FIELD AND XAMSUB.XAM_ANONIM = '2' AND XAMSUB.D_E_L_E_T_=' ')   ORDER BY  XAM_FIELD
  Local 20: CALIASQ(C) :SCGN0000ED
  Local 21: LINDB(L) :.T.
  Local 22: LEMPTYBSX3(L) :.T.
  Local 23: LRETCACHE(L) :.F.
  Local 24: LLOCSX2(L) :.F.
  Local 25: AMDLFIELDS(A) :
  Local 26: AVIEWFIELDS(A) :
  Local 27: ARETURN(U) :NIL
  Local 28: NLENX3(N) :10
  Local 29: CX3CBOXANONYM(C) :SELECT XAM_FIELD FROM XAM010 XAM WHERE  XAM.XAM_FIELD IN (SELECT SX3.X3_CAMPO FROM SX3010 SX3 WHERE  SX3.X3_ARQUIVO = 'SC6' AND SX3.D_E_L_E_T_ = ' ' ) AND XAM.XAM_ANONIM = '1' AND XAM.D_E_L_E_T_=' ' AND NOT EXISTS (SELECT XAMSUB.R_E_C_N_O_ FROM XAM010 XAMSUB WHERE  XAMSUB.XAM_FIELD = XAM.XAM_FIELD AND XAMSUB.XAM_ANONIM = '2' AND XAMSUB.D_E_L_E_T_=' ')   ORDER BY  XAM_FIELD
  Local 30: BSEEKANONYM(B) :{|CFIELD| (CANONYMALIAS)->(DBSEEK(CFIELD))}
  Local 31: LTEMPTABLE(L) :.T.
  Local 32: CANONYMALIAS(C) :SCGN0000EF

Conseguimos extrair:

  • A tabela do erro posicionada é a tabela SC6 pelo parâmetro 1.


C - Buscando pela terceira função da pilha "FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX)", obtemos:

STACK FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10

  Param 1: CALIASALT(C) : SCGN0000ED
  Local 1: CALIASALT(C) :SCGN0000ED
  Local 2: ARETORNO(A) :
  Local 3: NMAXLENCOMBO(N) :0
  Local 4: NINITCBOX(N) :0
  Local 5: NX(N) :0
  Local 6: ACOMBO(A) :
  Local 7: ATMP(A) :
  Local 8: BPICTVAR(U) :NIL
  Local 9: CX3CBOX(C) :      

Conseguimos extrair:

  • Nenhuma pista.


D - Buscando pela quarta função da pilha "FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX)", obtemos:

STACK FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10

  Param 1: NTIPO(N) : 4
  Param 2: CEXPRADVPL(C) : @!                  
  Local 1: NTIPO(N) :4
  Local 2: CEXPRADVPL(C) :@!                  
  Local 3: CAUX(C) :FWInitCpo(a,b,c),xRet:=(@!),FWCloseCpo(a,b,c,.T.),xRet
  Local 4: XRET(U) :NIL 

OBSERVAÇÃO: De longe, a pilha mais clara até agora, mostra o cabeçalho do erro e o formato do retorno do erro "@!", o erro está aqui, mas não foi clareado para nós onde exatamente.

Conseguimos extrair:

  • A validação do erro
  • O formato do retorno do erro ("xRet")


E - Buscando pela quinta função da pilha "STACK { | E | ERRORDIALOG( E )}", obtemos:

 Param 1: E(O) : O
  Local CodeBlock 1: E(O) :O

Conseguimos extrair:

  • Nenhuma pista


F - Buscando pela sexta função da pilha "STACK { | E | ERRORDIALOG( E ) }(APLIB240.PRW)", obtemos:

  Param 1: E(O) : O
  Local 1: E(O) :O
  Local 2: LINSIGA(L) :.T.
  Local 3: CMSG(U) :NIL
  Local 4: NI(U) :NIL
  Local 5: CX(U) :NIL
  Local 6: CERROR(U) :NIL
  Local 7: LSKIPERROR(L) :.F.
  Local 8: AOBJLOG(A) :
  Local 9: NX(U) :NIL
  Local 10: URETURN(U) :NIL

Conseguimos extrair:

  • Nenhuma pista


E - Buscando pela sétima função da pilha "ERRORDLG(APLIB240.PRW)", obtemos:

 Param 1: E(O) : O
  Local CodeBlock 1: E(O) :O

Conseguimos extrair:

  • Nenhuma pista


OBSERVAÇÃO: Nesse caso, a análise das pilhas foi importante para nos certificar que o erro estava no formato (@!) e na tabela (SC6) no processo da rotina (MATA500), mas o erro específico não foi localizado ainda.


No error.log digite " **", ou seja, espaço-asterisco-asterisco e procure. Irá aparecer onde o documento levar, a ultima parada do sistema, importante para localizar o que ele foi gravar e não conseguiu. Obtemos esse resultado:

 _SC00; Rdd:TOPCONN; Alias:SCGN0000EF; Filter :; Recno:5000; Total Recs:0; Order:1
     Index (0) :**SC0001  X3_CAMPO
    Field 1: X3_CAMPO(C) :      


OBSERVAÇÃO: Nesse caso, não foi útil para nós, pois a última parada foi em uma tabela temporária "**SC0001", seguimos analisando.

Simboliza o último campo visto pelo sistema antes do erro, ao procurar no error.log por "SX3" temos:

SX3010; Rdd:TOPCONN; Alias:SX3; Filter :; Recno:112953; Total Recs:166831; Order:1
     Index (0) :**SX30101  X3_ARQUIVO+X3_ORDEM
     Index (1) :SX30102  X3_CAMPO
     Index (2) :SX30103  X3_GRPSXG+X3_ARQUIVO+X3_ORDEM
     Index (3) :SX30104  X3_ARQUIVO+X3_FOLDER+X3_ORDEM
     Index (4) :SX30105  X3_ARQUIVO+X3_IDXFLD+X3_CAMPO
    Field 1: X3_ARQUIVO(C) :SC6
    Field 2: X3_ORDEM(C) :AC
    Field 3: X3_CAMPO(C) :C6_SOLCOM 
    Field 4: X3_TIPO(C) :C
    Field 5: X3_TAMANHO(N) :6
    Field 6: X3_DECIMAL(N) :0
    Field 7: X3_TITULO(C) :Num. Solicit
    Field 8: X3_TITSPA(C) :Num. Solicit
    Field 9: X3_TITENG(C) :Req.No.     
    Field 10: X3_DESCRIC(C) :Número da Solicitação de 
    Field 11: X3_DESCSPA(C) :Numero de Solicitud de   
    Field 12: X3_DESCENG(C) :Number of Request of     
    Field 13: X3_PICTURE(C) :@!                                           
    Field 14: X3_VALID(C) :                                                                                                                                
    Field 15: X3_USADO(C) :x       x       x       x       x       x       x       x       x       x       x       x       x       x       x x     
    Field 16: X3_RELACAO(C) :                                                                                                                                
    Field 17: X3_F3(C) :      
    Field 18: X3_NIVEL(N) :1
    Field 19: X3_RESERV(C) :    x           
    Field 20: X3_CHECK(C) F : 
    Field 21: X3_TRIGGER(C) : 
    Field 22: X3_PROPRI(C) : 
    Field 23: X3_BROWSE(C) : 
    Field 24: X3_VISUAL(C) : 
    Field 25: X3_CONTEXT(C) : 
    Field 26: X3_OBRIGAT(C) :        
    Field 27: X3_VLDUSER(C) :                                                                                                                                
    Field 28: X3_CBOX(C) :                                                                                                                                
    Field 29: X3_CBOXSPA(C) :                                                                                                                                
    Field 30: X3_CBOXENG(C) :                                                                                                                                
    Field 31: X3_PICTVAR(C) :                    
    Field 32: X3_WHEN(C) :                                                            
    Field 33: X3_INIBRW(C) :                                                                                
    Field 34: X3_GRPSXG(C) :   
    Field 35: X3_FOLDER(C) : 
    Field 36: X3_PYME(C) :S
    Field 37: X3_CONDSQL(C) :                                                                                                                                                                                                                                                          
    Field 38: X3_CHKSQL(C) :                                                                                                                                                                                                                                                          
    Field 39: X3_IDXSRV(C) :N
    Field 40: X3_ORTOGRA(C) : 
    Field 41: X3_IDXFLD(C) :N
    Field 42: X3_TELA(C) :               
    Field 43: X3_PICBRV(C) :                                                  
    Field 44: X3_AGRUP(C) :   
    Field 45: X3_POSLGT(C) :1
    Field 46: X3_MODAL(C) :2


Conseguimos extrair:

  • O campo possui o formato do erro "@!"
  • O campo é padrão e tem suas informações (campos da SX3) no padrão.
  • O campo que antecede erro está na SC6.
  • O campo está com a ordem errada (X3_ORDEM = AC)


Pela natureza do campo, o pedido de venda proveniente veio de uma solicitação de compras, podemos ver qual valor ele carregava no sistema procurando por "C6_SOLCOM", temos:

    Field 137: C6_SOLCOM(C) :        

Nesse caso do erro, então, ele estava vazio no momento.


Após visualizar o campo, temos de verificar pois já podem ser a causa do erro:

  • É padrão?
  • Os campos da SX3 estão no padrão?
  • O campo está na ordenação (X3_ORDEM) certa?

Nessa etapa pode ser comparado o seu ambiente com o do cliente.


Simboliza o último parâmetro visto pelo sistema antes do erro, ao procurar no error.log por "SX6" temos:

SX6010; Rdd:TOPCONN; Alias:SX6; Filter :; Recno:9266; Total Recs:10702; Order:1
     Index (0) :**SX60101  X6_FIL+X6_VAR
    Field 1: X6_FIL(C) :        
    Field 2: X6_VAR(C) :MV_USAX3BR
    Field 3: X6_TIPO(C) :C
    Field 4: X6_DESCRIC(C) :Se "S" indica que nao será validado o X3_USADO do 
    Field 5: X6_DSCSPA(C) :"S" indica que no se validara el X3_USADO del     
    Field 6: X6_DSCENG(C) :When "S", the X3_USADO assigned to the field will 
    Field 7: X6_DESC1(C) :campo para exibicao no browse.                    
    Field 8: X6_DSCSPA1(C) :campo para exhibicion en el browse.               
    Field 9: X6_DSCENG1(C) :not be validated for displaying in the browser.   
    Field 10: X6_DESC2(C) :                                                  
    Field 11: X6_DSCSPA2(C) :                                                  
    Field 12: X6_DSCENG2(C) :                                                  
    Field 13: X6_CONTEUD(C) :S                                                                                                                                                                                                                                                         
    Field 14: X6_CONTSPA(C) :S                                                                                                                                                                                                                                                         
    Field 15: X6_CONTENG(C) :S                                                                                                                                                                                                                                                         
    Field 16: X6_PROPRI(C) :S
    Field 17: X6_PYME(C) :S
    Field 18: X6_VALID(C) :                                                                                                                                
    Field 19: X6_INIT(C) :                                                                                                                                
    Field 20: X6_DEFPOR(C) :S                                                                                                                                                                                                                                                         
    Field 21: X6_DEFSPA(C) :S                                                                                                                                                                                                                                                         
    Field 22: X6_DEFENG(C) :S                                                                                                                                                                                                                                                         
    Field 23: X6_EXPDEST(C) :1

Conseguimos extrair:

  • O último parâmetro olhado pelo sistema foi o MV_USAX3BR
  • Está no padrão
  • Os campos do parâmetro estão no padrão
  • O valor do parâmetro está "Default" no padrão


OBSERVAÇÃO: Logo, a provável causa do erro não é esse parâmetro.

Simboliza o último pergunte visto pelo sistema antes do erro, ao procurar no error.log por "SX1" temos:

  SX1010; Rdd:TOPCONN; Alias:SX1; Filter :; Recno:32746; Total Recs:55784; Order:1
     Index (0) :**SX10101  X1_GRUPO+X1_ORDEM
     Index (1) :SX10102  X1_IDFIL+X1_ORDEM
    Field 1: X1_GRUPO(C) :MTA510    
    Field 2: X1_ORDEM(C) :01
    Field 3: X1_PERGUNT(C) :Taxa deflacao ICMS ?          
    Field 4: X1_PERSPA(C) :¿Tasa Deflac. ICMS ?          
    Field 5: X1_PERENG(C) :ICMS Deflation Rate ?         
    Field 6: X1_VARIAVL(C) :mv_ch5
    Field 7: X1_TIPO(C) :N
    Field 8: X1_TAMANHO(N) :5
    Field 9: X1_DECIMAL(N) :2
    Field 10: X1_PRESEL(N) :0
    Field 11: X1_GSC(C) :G
    Field 12: X1_VALID(C) :                                                            
    Field 13: X1_VAR01(C) :mv_par01       
    Field 14: X1_DEF01(C) :               
    Field 15: X1_DEFSPA1(C) :               
    Field 16: X1_DEFENG1(C) :               
    Field 17: X1_CNT01(C) : 0.00                                                       
    Field 18: X1_VAR02(C) :               
    Field 19: X1_DEF02(C) :               
    Field 20: X1_DEFSPA2(C) :               
    Field 21: X1_DEFENG2(C) :               
    Field 22: X1_CNT02(C) :                                                            
    Field 23: X1_VAR03(C) :               
    Field 24: X1_DEF03(C) :               
    Field 25: X1_DEFSPA3(C) :               
    Field 26: X1_DEFENG3(C) :               
    Field 27: X1_CNT03(C) :                                                            
    Field 28: X1_VAR04(C) :               
    Field 29: X1_DEF04(C) :               
    Field 30: X1_DEFSPA4(C) :               
    Field 31: X1_DEFENG4(C) :               
    Field 32: X1_CNT04(C) :                                                            
    Field 33: X1_VAR05(C) :               
    Field 34: X1_DEF05(C) :               
    Field 35: X1_DEFSPA5(C) :               
    Field 36: X1_DEFENG5(C) :          
    Field 37: X1_CNT05(C) :                                                            
    Field 38: X1_F3(C) :      
    Field 39: X1_PYME(C) :S
    Field 40: X1_GRPSXG(C) :   
    Field 41: X1_HELP(C) :              
    Field 42: X1_PICTURE(C) :                                        
    Field 43: X1_IDFIL(C) :      
  SXK010; Rdd:TOPCONN; Alias:SXK; Filter :; Recno:5000; Total Recs:0; Order:2
     Index (0) :SXK0101  XK_GRUPO+XK_SEQ+XK_IDUSER
     Index (1) :**SXK0102  XK_IDUSER+XK_GRUPO+XK_SEQ
    Field 1: XK_GRUPO(C) :          
    Field 2: XK_SEQ(C) :  
    Field 3: XK_IDUSER(C) :       
    Field 4: XK_CONTEUD(C) :                                                                                                                                                                                                                                                          
    Field 5: XK_FORM(C) :                     

Conseguimos extrair:

  • O último parâmetro olhado pelo sistema foi do grupo "MTA510", de ordenação 1.
  • Está no padrão
  • Os campos do parâmetro estão no padrão
  • O valor do parâmetro está "Default" no padrão


OBSERVAÇÃO: Logo, a provável causa do erro não é esse pergunte.

Simboliza as customizações ativadas pelo sistema antes do erro ocorrer, basta procuramos pelos valores "XX6_CODFUN" e "XX7_CODFUN", fazendo isso temos:

 XX6010; Rdd:TOPCONN; Alias:XX6; Filter :; Recno:15; Total Recs:23; Order:1
     Index (0) :**XX60101  XX6_CODFUN+XX6_TYPE
     Index (1) :XX60102  XX6_DESC+XX6_CODFUN
    Field 1: XX6_CODFUN(C) :A097APRF
    Field 2: XX6_TYPE(C) :1
    Field 3: XX6_DESC(C) :Automaticamente adicionado pelo sistema.-29/08/2022         
  XX7010; Rdd:TOPCONN; Alias:XX7; Filter :; Recno:15; Total Recs:23; Order:1
     Index (0) :**XX70101  XX7_CODFUN+XX7_TYPE+XX7_FILIAL
     Index (1) :XX70102  XX7_TYPE+XX7_CODFUN+XX7_FILIAL
    Field 1: XX7_CODFUN(C) :A097APRF
    Field 2: XX7_TYPE(C) :1
    Field 3: XX7_FILIAL(C) :        
    Field 4: XX7_STATUS(C) :1
    Field 5: XX7_DEFRET(C) :                                        

Conseguimos extrair:

  • A customização não tem a ver com os fontes do erro.


OBSERVAÇÃO: Logo, a provável causa do erro não é esse ponto de entrada "A097APRF".


Resultado pós análise/interação



Explicação

Esse erro acontece quando é feito alguma operação com variáveis (subtração, adição, multiplicação, divisão, potenciação) de tipos diferentes (caractere, numérico, data, nula), sejam as possíveis causas:

  • Gatilhos/customizações/parâmetros injetando informações nos campos com natureza diferente do tipo do campo
  • Alteração da estrutura padrão do campo/parâmetro
  • Customizações


Tópicos de Análise (com tickets de exemplo)

Erro

Para ver o erro completo, abra o ticket: link aqui: https://totvssuporte.zendesk.com/agent/tickets/17743817

THREAD ERROR ([9556], wander.silva, SPON010117778)   07/08/2023 14:40:28
type mismatch on +  on A410TUDOK(MATV410A.PRW) 05/05/2023 11:20:05 line : 172

Ao ver o cabeçalho, podemos extrair que o erro está acontecendo na função A410TUDOK, no fonte MATV410.PRW na operação de adição:

Entre variáveis.


Tópicos de Análise

Note que na linha 172 do fonte, linha 2 abaixo, procuramos a somatória com variáveis que está gerando o erro:

	SED->(DBSetOrder(1))
	If SED->(DBSeek(xFilial("SED")+cPVNaturez) .And. !RegistroOk("SED",.F.))
		Help(" ",1,"A410NATBLK",,STR0406,1,0)	//##"Natureza utilizada encontra-se bloqueada para uso"
		lRetorna := .F.
	EndIf
EndIf


Trecho exato:

If SED->(DBSeek(xFilial("SED")+cPVNaturez) .And. !RegistroOk("SED",.F.))

Sabemos então, que na seleção do índice da tabela "SED", onde há "adição" de caracteres, o erro está ocorrendo.


A - No trecho do fonte separado, podemos isolar, como visto na linha abaixo, a operação onde o problema ocorre:

xFilial("SED") + cPVNaturez


B - Temos que verificar o que leva valor ao campo "filial da tabela SED" e valor a variável "cPVNaturez"

Por ser uma busca de índice, sabemos que o que leva valar ao: xFilial("SED") é justamente a filial do sistema no cadastro de natureza, conhecido como o campo  "ED_FILIAL".

Para sabermos o valor colocado no campo cPVNaturez, podemos varrer o fonte analisando as atribuições:

Local cPVNaturez := ""


If "C5_NATUREZ" $ cMV1DupNat
		cPVNaturez	:= M->C5_NATUREZ
ElseIf "A1_NATUREZ" $ cMV1DupNat
		cPVNaturez	:= Posicione("SA1",1,xFilial("SA1")+M->C5_CLIENTE+M->C5_LOJACLI,"A1_NATUREZ")
Else
		cPVNaturez	:= &(cMV1DupNat)
EndIf


If "C5_NATUREZ" $ cMV2DupNat
	cPVNaturez	:= M->C5_NATUREZ
ElseIf "A2_NATUREZ" $ cMV2DupNat
	cPVNaturez := Posicione("SA2",1,xFilial("SA2")+M->C5_CLIENTE+M->C5_LOJACLI,"A2_NATUREZ")
Else
	cPVNaturez	:=  &(cMV2DupNat)
EndIf



Conclusão:

  • O valor da variável pode vir dos campos "A2_NATUREZ" (linha 15 acima), "A1_NATUREZ" (linha 6 acima), "MV_1DUPNAT" (linha 3 acima) e "C5_NATUREZ" (linha 4 acima)
  • O erro pode vir tanto do conteúdo natural dos campos ou gatilhos acima, quanto de customizações/gatilhos que atribuam valor a esses campos.
  • É importante verificar se o campo ED_FILIAL tem a mesma estrutura dos campos e parâmetros acima.

Resultado pós análise/interação:

"Boa tarde e grato pelo retorno. Pode encerrar o chamado, pois já descobri o motivo, era o parâmetro mesmo."



Explicação

Este erro ocorre quando o sistema tentar colocar um valor em campo maior do que seu tamanho suporta.

  • Verifique as variáveis/campos que atribuem o valor ao campo do erro e quais suas rotinas/módulos detentores
  • Verifique se há customizações


Ticket de exemplo: #17848020

THREAD ERROR ([1328], NOVA PIRATININGA, IGOR-CONTABILID)   18/08/2023 12:49:02
Data width error - Field: ADB_QTDEMP Value: 10023570.000000 on MAAVALSC6(FATXFUN.PRX) 29/08/2022 18:15:53

[TOTVS build: 7.00.210324P-20230228]
Called from A410GRAVA(MATN410.PRW) 30/11/2022 15:39:57 line : 1307
Called from A410INCLUI(MATA410.PRX) 26/09/2022 15:59:37 line : 1317
Called from FT400PV(FATA400.PRX) 27/01/2022 15:20:43 line : 1921
Called from FT400REMES(FATA400.PRX) 27/01/2022 15:20:43 line : 1585
Called from FWFORMBROWSE:EXECUTE(FWFORMBROWSE.PRW) 04/04/2023 15:05:10 line : 1147
Called from {|| OSELF:EXECUTE("FT400REMES",              6,             0,"REMESSA",              9,"","REMESSA","",               9) }(FWFORMBROWSE.PRW) 04/04/2023 15:05:10 line : 579
Called from ::MSDIALOG:ACTIVATE
Called from FWMBROWSE:ACTIVATE(FWMBROWSE.PRW) 04/04/2023 15:05:10 line : 700
Called from FWMBROWSE(MSLIB.PRW) 04/04/2023 15:05:10 line : 10499
Called from MBROWSE(MSLIB.PRW) 04/04/2023 15:05:10 line : 170
Called from FATA400(FATA400.PRX) 27/01/2022 15:20:43 line : 91
Called from __EXECUTE(APLIB090.PRW) 04/04/2023 15:05:08 line : 721
Called from MDIEXECUTE(APLIB260.PRW) 04/04/2023 15:05:08 line : 924

1. No cabeçalho do erro, podemos ver qual o campo que o sistema está tentando inserir valor e podemos ver o valor inserido, sabendo assim, seu tamanho:

Data width error - Field: ADB_QTDEMP Value: 10023570.000000 on MAAVALSC6(FATXFUN.PRX) 29/08/2022 18:15:53

O campo está tentando inserir um campo da ordem de: 15 casas totais / 6 casas decimais após a vírgula.

OBSERVAÇÃO: Para compor o valor total se conta o ponto flutuante (o que separa as casas inteiras das casas decimais)


2. Há dois caminhos para seguir, o valor está errado e precisamos entender a origem dele, isto é, as variáveis/campos que injetam valor do erro nesse campo "ADB_QTDEMP" ou, simplesmente aumentar o campo no configurador pois pode estar correto (depende da resposta do cliente) para que o campo suporte o tamanho e não ofereça mais erro.


2.1 - Estudar origem (Pequisar no Azure e analisar)


Conclusão:

2.2 - Aumentar campo para que o erro não ocorra:

( . . . )




Explicação

Este erro ocorre quando o sistema aguarda por muito tempo na tentativa de executar alguma ação no banco de dados, devido ao tempo de espera o sistema derruba a conexão. Pontos de análise:

  • Verifique se os artefatos (Binário, Lib, DBAccess) do cliente estão atualizados;
  • Verifique se houve alguma alteração no fonte que gera o erro (Na linha ou função que gera o erro);
  • Verifique com o cliente se o erro ocorre exclusivamente em uma rotina ou se ocorre em várias.  


Ticket de exemplo: #17701851

THREAD ERROR ([7656], FATURAMENTO, DESKTOP-U30GRFJ)   02/08/2023 13:11:56
[FWCustomMetrics:InsertMetric] TCSQLError(): Error : 845 (37000) (RC=-1) - [Microsoft][SQL Server Native Client 11.0][SQL Server]Time-out occurred while waiting for buffer latch type 4 for page (1:11814786), database ID 5.( From tDBServer::ROP_SQLEXEC )

Thread ID [6120]              User [FATURAMENTO] IO [4611]             Tables [139]       MaxTables [140]              Comment [MATA460A - TCPIP - ThreadID(7656)]   SP [ ]     Traced [No]        SQLReplay [No] InTran [Yes]       DBEnv [MSSQL/BT9QI1]             DBThread [(SPID 73,74)]               Started [02/08/2023 13:06:05]   IP [127.0.0.1:55612]        IDLE [ ]                InTransact [306 s.]          Memory [0]       Running [ROP_SQLEXEC for 300 s.]          RCV [492780]     SND [1513639]                TCBuild [20191119-20200706]    TCVersion [19.2.1.1]       ARCH [64]           OS [WINDOWS] BUILD [RELEASE]             

INSERT INTO MP_CUSTOM_METRICS_EXP (MP_FEDERID, MP_MODULO, MP_ROTINA, MP_USER, MP_SUBROT, MP_IDMETRI, MP_VALUE, MP_LAPTIME, MP_DTCREAT, MP_DTSEND, MP_TPMETRI) VALUES ('61468401000165', 5, 'MATA461', '000190', 'MATA461', 'faturamento-protheus_media-itens-nota-saida_average', '3', 0, '20230802', '20230831', 'AVG') on INSERTMETRIC(FWCUSTOMMETRICS.TLPP) 30/09/2021 11:46:45 line : 472

[TOTVS build: 7.00.191205P-20200903]
Called from FWCUSTOMMETRICS:SETAVERAGEMETRIC(FWCUSTOMMETRICS.TLPP) 30/09/2021 11:46:45 line : 129
Called from MAPVLNFS2(MATA461.PRX) 19/10/2021 18:21:02 line : 4268
Called from MAPVLNFS(MATA461.PRX) 19/10/2021 18:21:02 line : 1807
Called from MA460PROC(MATA461.PRX) 19/10/2021 18:21:02 line : 1468
Called from {|LEND| MA460PROC(CALIAS, CSERIE, MV_PAR01==1, MV_PAR02==1, MV_PAR03==1, MV_PAR04==1, MV_PAR05==1, MV_PAR07, MV_PAR08, MV_PAR09, MV_PAR10, MV_PAR11==1, MV_PAR12, MV_PAR13, MV_PAR14, MV_PAR15==1, MV_PAR16==2, C460COND,@LEND,DDATAMOE)}(MATA461.PRX) 19/10/2021 18:21:02 line : 741
Called from { || FWSETSHOWKEYS( .F. ), EVAL( BACTION, @LEND ),LEND := .T. , FWSETSHOWKEYS( .T. ), ODLGMODAL:DEACTIVATE() }(MSPROCES.PRW) 30/09/2021 11:46:48 line : 104
Called from {|SELF|(EVAL(OSELF:BINIT))}(FWDIALOGMODAL.PRW) 30/09/2021 11:46:45 line : 462
Called from ::MSDIALOG:ACTIVATE
Called from FWDIALOGMODAL:ACTIVATE(FWDIALOGMODAL.PRW) 30/09/2021 11:46:45 line : 462
Called from PROCESSA(MSPROCES.PRW) 30/09/2021 11:46:48 line : 105
Called from MA460NOTA(MATA461.PRX) 19/10/2021 18:21:02 line : 741
Called from FWFORMBROWSE:EXECUTE(FWFORMBROWSE.PRW) 30/09/2021 11:46:48 line : 1144
Called from { || OSELF:EXECUTE("MA460NOTA",              4,             0,"PREP. DOC'S",              3,"","PREP. DOC'S","",               3) }(FWFORMBROWSE.PRW) 30/09/2021 11:46:48 line : 578
Called from ::MSDIALOG:ACTIVATE
Called from FWMBROWSE:ACTIVATE(FWMBROWSE.PRW) 30/09/2021 11:46:48 line : 697
Called from FWMARKBROWSE:ACTIVATE(FWMARKBROWSE.PRW) 30/09/2021 11:46:48 line : 267
Called from FWMARKBROWSE(MSLIB.PRW) 30/09/2021 11:46:48 line : 11097
Called from MARKBROWSE(MSLIB.PRW) 30/09/2021 11:46:48 line : 6123
Called from MARKBROW(MSLIB.PRW) 30/09/2021 11:46:48 line : 6103
Called from MATA460A(MATA461.PRX) 19/10/2021 18:21:02 line : 478
Called from __EXECUTE(APLIB090.PRW) 30/09/2021 11:46:45 line : 721
Called from MDIEXECUTE(APLIB260.PRW) 30/09/2021 11:46:45 line : 924

1. Na pilha de chamadas, a última função executada é do MATA461, o que indica que o processo gerador do erro foi no módulo de faturamento:

Called from MAPVLNFS2(MATA461.PRX) 19/10/2021 18:21:02 line : 4268

Sendo assim, a primeira análise é do módulo de Faturamento.


2. Verifique qual tabela o sistema está tentando acessar, pode ser verificado pela Query apresentada no cabeçalho do erro:

INSERT INTO MP_CUSTOM_METRICS_EXP (MP_FEDERID, MP_MODULO, MP_ROTINA, MP_USER, MP_SUBROT, MP_IDMETRI, MP_VALUE, MP_LAPTIME, MP_DTCREAT, MP_DTSEND, MP_TPMETRI) VALUES ('61468401000165', 5, 'MATA461', '000190', 'MATA461', 'faturamento-protheus_media-itens-nota-saida_average', '3', 0, '20230802', '20230831', 'AVG')

Neste caso, o sistema tenta realizar o Insert na tabela "MP" e como não consegue, excede o limite de tempo e derruba o sistema.


3. Validamos que o banco de dados do cliente estava em Cloud.


Conclusão:

O time de Framework nos informou que este erro está relacionado ao banco de dados do cliente, indicando a documentação: A time-out occurred while waiting for buffer latch -- type 4

Como o cliente era Cloud, o banco de dados dele estava aqui na TOTVS, então acionamos a equipe: SQUAD CLOUD DBA PROTHEUS

Eles realizaram o ajuste do banco de dados do cliente e o erro deixou de ser apresentado.


Como efetuar a análise com exemplos (PÁGINA INTERNA EXCLUSIVA PARA O SUPORTE TÉCNICO SIGAFAT): Análise da ocorrência EOF Stack de chamadas em MSRLOCK.eof Controle de transações Habilitado [INTERNO]


O que passar ao cliente: FAT0240 EOF Stack de chamadas em MSRLOCK.eof Controle de transaçoes Habilitado







Página: https://tdn.totvs.com/x/7hszJg




Causa

O retorno do erro ocorre quando inserido no inicializador padrão de um determinado campo, um conteúdo não válido com relação a tipagem do campo. 

A maioria dos casos onde ocorre este erro estão relacionados a campos do tipo caractere que recebe um inicializador padrão numérico.

Solução

Para solucionar o problema, retire a opção do inicializador padrão, uma vez  que no dicionário padrão não há validação ou coloque a informação entre aspas (" ")

Processo:

  • Acessar o ambiente Configurador - SIGACFG;
  • Atualizações - Base de Dados - Dicionário - Base de Dados - Dicionário de Dados;
  • Localize a tabela correspondente, editar;
  • Localize o campo, editar;
  • Folder Opções - Inicializador Padrão;
  • Retire o conteúdo ou insira a tratativa necessária para para sanar o retorno. 
  • Salve o campo, salve a alteração da tabela, atualize o dicionário de dados, reinicie o Smartclient e realize novamente o processo.

(aviso) Importante: A ocorrência "argument_error_in_function_Len()_on_CRIAVAR" pode ocorrer em qualquer processo do Protheus em que o conteúdo do inicializador padrão divergir do conteúdo que o campo foi configurado para receber.

Causa

Error : 468 (37000) (RC=-1) - [Microsoft][ODBC SQL Server Driver][SQL Server]Não foi possível resolver o conflito de agrupamento entre "Latin1_General_BIN" e "Latin1_General_CI_AS" na operação equal to. ( From tMSSQLConnection::GetQueryFile )

Este não é um erro relacionado ao Protheus e suas rotinas e sim, um problema que ocorre devido a um conflito de collation* entre dois databases (database onde esta os dados do Protheus x database de sistema "TempDB").

*Collation - É o mapa de caracteres utilizados em seu database. 

O database criado para armazenar as tabelas do Microsiga Protheus possui o mapa de caracteres "Latin_General_BIN" e o database de sistema "TempDB" possui o collation "Latin_General_CI_AS".

Solução

  • Opção 1) Alterar o Tipo do Agrupamento configurado no Banco de Dados.

Realizar a conversão do banco de dados de sistema "TEMPDB - Ex. SQL Server" para a collation "Latin_General_BIN (Padrão Protheus)

  • Opção 2) Atualize o ambiente com o último DBAccess , Build e LIB disponibilizados no Portal do Cliente (Havendo dificuldade, contate nosso Suporte Framework).

As novas atualizações de tecnologia do Protheus já contemplam tratamento para converter os caracteres e evitar as diferenças entre as Collations.

Causa

O erro ocorre ,por que, ao tentar executar uma query do lançamento padrão para a contabilização, o Banco de Dados está recebendo conteúdo de gravação com caractere especial (' " # @ $ % ¨! & *).

A informação a ser gravada contendo caracteres especiais na sua composição, interfere na codificação e na gravação de banco de dados, no caso de uso de apostrofo (') por exemplo,  o banco entenderá que a query finalizou seu bloco de instruções, sendo que o que vier após isso, fica caracterizado como erro de sintaxe.

Solução

1) Identifique o campo que está trazendo o caractere especial.

2) Retire o caractere especial da informação, assim não terá problemas para a gravação no Banco de Dados.

3) Em último caso, utilizar um execblock no lançamento padrão, para poder tratar caracteres especiais. Em caso de dúvidas sobre esse processo, contate nossa equipe de Atendimento Advpl para melhor orientação.

Causa

O erro ocorre ao excluir um cliente (MATA030),onde, o sistema apresenta três mensagens de erro informando que:

  1. INITTER - Erro no conteúdo do Inicializador Padrão: Campo. (Marcação)
  2. INITTER - Erro no conteúdo do Inicializador Padrão: Campo: A1_VM_MARC
  3. MA030TEMPV - Cliente não poderá ser excluído. Flial "x".

A mensagem relacionada a inconsistência no inicializador padrão do campo A1_VM_MARC ocorre ,por que, o campo A1_COD_MARC, possui a chamada do A1_VM_MARC.

Solução

1) Identifique o campo que está trazendo o caractere especial.

2) Retire o caractere especial da informação, assim não terá problemas para a gravação no Banco de Dados.

3) Em último caso, utilizar um execblock no lançamento padrão, para poder tratar caracteres especiais. Em caso de dúvidas sobre esse processo, contate nossa equipe de Atendimento Advpl para melhor orientação.

Ex: A1_COD_MARC = Ordem 20 / A1_VM_MARC = ordem 21

Causa

O erro refere-se a um tipo incompatível que está sendo utilizado para comparação na função MAPVL2SF2.

A função em questão, tem uma variável do tipo caractere que recebe a informação passada pelo parâmetro MV_HORARMT, que também é do tipo caractere. Todavia, essa variável está recebendo uma informação do tipo numérica , conforme o trecho do erro:
 

STACK MAPVL2SF2(MATA461.PRX) 06/06/2017 13:55:06
Local 30: CHORARMT(N) :2

 Veja que a variável CHORARMT, é definida como caractere, devido a letra C no início de seu nome, mas a informação que chega para ela vem entre parênteses como numérico (N), gerando incompatibilidade para a comparação de informações que variável precisa receber e o que está recebendo.

Solução

Para solucionar a questão, coloque a informação do parâmetro MV_HORARMT entre aspas duplas ("), indicando que a informação em questão é do tipo caractere: MV_HORARMT="2"

 Ticket referência : #1065455

O erro array out of bounds ( 0 of 112 ) on A410NFORIG(MATV410A.PRW) ocorre ao tentar realizar uma devolução de compra.

O erro de array ocorre sempre que os campos C6_NFORI e/ou C6_SERIORIG:

  • Não existem no SX3;
  • Não estão marcados como usados;
  • Estão com o nível alterado;
  • Não estão disponíveis para o módulo acessado.

Ao tentar incluir, alterar ou visualizar um teleatendimento na rotina TMKA503A sistema apresenta o seguinte error.log: variable does not exist ADE_GRUPO

Essa ocorrência esta relacionada ao modelo de atendimento informado no cadastro do grupo de atendimento na aba Teleatendimento.

No modelo atual a tabela que esta sendo referenciada e diferente a tabela padrão do sistema ADE. Com isso ao tentar validar um campo na query do modelo de atendimento sistema não o encontra e gera a ocorrência acima.

Solução, alterar o modelo informado no grupo de atendimento e colocar as tabelas corretas ou criar um novo modelo de atendimento.

Segue link da Faq para auxiliar na configuração ideal para o teleatendimento: https://tdn.totvs.com/x/3dJoE

The field X do reference to folder: X, but It not exist / O campo X refira à pasta: X, mas não existe. on FWFORMFIELD:PREPAREFIELDS(FWFORMFIELD.PRW)

O arquivo error.log está indicando que o processamento faz referência ao campo em questão (Neste Exemplo, U5_FUNCAO), o qual não está sendo localizado em sua Base.

Isso porque, o Dicionário de Dados está fornecendo uma localização inválida para o campo. É necessário verificar no Dicionário de Dados SX3 a coluna X3_FOLDER (Pasta)

Para corrigir indique um Folder / Pasta válido para o campo (X3_FOLDER). Ou seja, um número de Aba que realmente existe no formulário em que essa Tabela é acionada.

Exemplo:

O campo pertence à Tabela SU5 - Contatos que é alimentada através da rotina TMKA070

O campo U5_FUNCAO está com X3_FOLDER indicando Aba 5; porém, no Cadastro de Contatos não há Aba 5 (existem apenas 4 Abas no cadastro)