ExplicaçãoEsse 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) ExplicaçãoO 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 |
|
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. |
|
|
ErroPara 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: ![Linha Microsiga Protheus > Acompanhamento de Log de Erros (FAT/SER/JUR) [INTERNO] > image2023-8-7_16-48-13.png](/download/thumbnails/781196626/image2023-8-7_16-48-13.png?version=1&modificationDate=1691437693667&api=v2)
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
|
Podemos extrair que: - 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."
|
|
|