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.
Expandir |
---|
| Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| 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 |
---|
| 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 |
---|
| 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 |
---|
| // 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 |
---|
| 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 |
---|
| 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 |
---|
| 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. |
|