Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Expandir
titleModelo para copiar e criar novo Expandir de error.log

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)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#Ticket
label#Ticket

Erro

Expandir
titleVer erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
THREAD


Tópicos de Análise

Expandir
title1 - Avaliar o retorno dentro da primeira função

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
THREAD ERROR


Trecho exato:

Sabemos então, que (...)




Expandir
title2 - Procurar em cada função da pilha, indícios do que gerou o erro (pergunte/campo/tabela/filtro)
Bloco de código
firstline1
titleTrecho
linenumberstrue
Called from FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 1004


A - Buscando pela função da primeira pilha

Bloco de código
firstline1
titleTrecho
linenumberstrue
STACK

Conseguimos extrair:

  • A
  • B


B - Anotação 2

Bloco de código
firstline1
titleTrecho
linenumberstrue
STACK 

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



Expandir
titleWARNING - TCSetField - Invalid field XXX on {|X| IF(X[X] <> "X", TCSETFIELD(XXX,X[1],X[2],X[3],X[4]),NIL)}

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)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#19278994
label#19278994

Erro

Expandir
titleVer erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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

Expandir
title1 - Visualizar validações

: 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)}


Expandir
title2 - Estudar a função

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.

Expandir
title3 - Procurar o valor e tabela possível com o erro

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

-



Expandir
titleinvalid macro source (_____: Invalid token, Line _, Offset __, ?)

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)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#18617044
label#18617044

Erro

Expandir
titleVer erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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

Expandir
titleVisualizar validações

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])

Expandir
title2 - Avaliar se algum campo utilizado na Query possui os símbolos: < > ! ' = | + - * / %

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"



Expandir
titleCOUNT field incorrect or syntax error | Campo COUNT incorreto ou erro de sintaxe

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)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#18537428
label#18537428

Erro

Expandir
titleVer erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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

Expandir
title1 - Encontrar QUERY do erro

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"

Bloco de código
firstline1
titleTrecho
linenumberstrue
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 "?"

Bloco de código
firstline1
titleTrecho
linenumberstrue
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.


Expandir
title2 - Avaliar se algum campo utilizado na Query possui os símbolos: < > ! ' = | + - * / %

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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.



Card
defaulttrue
id#18573677
label#18573677

Erro

Expandir
titleVer erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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

Expandir
title1 - Encontrar QUERY do erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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.


Expandir
title2 - Avaliar se algum campo utilizado na Query possui os símbolos: < > ! ' = | + - * / %

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.



Expandir
titlearray out of bounds [_] of [_] on aArray (_____.PR_)
Card
defaulttrue
id#17629156
label#17629156

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.


Expandir
titleVer erro
Bloco de código
firstline1
titleTrecho
linenumberstrue
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
Expandir
titleAnálise realizada

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:

Bloco de código
titleSTACK
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":

Bloco de código
titleFonte
	// 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":

Bloco de código
titleCarrega
	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":

Bloco de código
titleaAtividades
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)


  

Expandir
titleConclusão do caso

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.

Expandir
titleInvalid macro source (_____: Error token failed, no valid token)

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)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#17597701
label#17597701

Erro

Expandir
titleVer erro

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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

Expandir
title1 - Avaliar o retorno dentro da primeira função

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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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 "@!".


Expandir
title2 - Procurar em cada função da pilha, indícios do que gerou o erro (pergunte/campo/tabela/filtro)
Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
 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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
  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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
 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.


Expandir
title3 - Localizar a última tabela olhada pelo sistema antes do erro

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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
 _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.

Expandir
title4 - Localizar campo na tabela SX3

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
    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.


Expandir
title5 - Localizar parâmetro na tabela SX6

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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.

Expandir
title6 - Localizar pergunte na tabela SX1

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
  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.

Expandir
title7 - Localizar pontos de entrada influentes

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
 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



Expandir
titletype mismatch on _ on _____(_____.PR_)

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)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#17743817
label#17743817

Erro

Expandir
titleVer erro (cabeçalho)

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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

Expandir
title1 - Avaliar o retorno dentro da primeira função

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
	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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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.


Expandir
title2 - Procurar qual variável está recebendo um valor incorreto diferente da outra

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

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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."



Expandir
titleData width error - Field: ___._____ Value: _____._____ on _____(_____.PR_)

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


Dica
titleComplemento

Ticket de exemplo: #17848020

Expandir
titleVer erro
Bloco de código
firstline1
titleTrecho
linenumberstrue
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
Expandir
titleAnálise realizada

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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Expandir
titleConclusão do caso

( . . . )




Expandir
titleTime-out occurred while waiting for buffer latch type 4 for page

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.  


Dica
titleComplemento

Ticket de exemplo: #17701851

Expandir
titleVer erro
Bloco de código
firstline1
titleTrecho
linenumberstrue
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
Expandir
titleAnálise realizada

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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Bloco de código
firstline1
titleTrecho
linenumberstrue
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:

Expandir
titleConclusão do caso

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.

...