ExplicaçãoEsse 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 não existir
- Customizações de filtro
Tópicos de Análise (com tickets de exemplo) Deck of Cards |
---|
startHidden | false |
---|
effectDuration | 0.5 |
---|
id | Custo Médio |
---|
effectType | horizontal |
---|
loopCards | true |
---|
| | #17629156 | #17629156Explicaçã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. | Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| THREAD ERROR ([ | 24164taissamirandaPCL572107163317
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. |
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 |
---|
title | 1 - 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 |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| 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_= ' '
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 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 |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| 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 |
---|
title | 2 - 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 |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| 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: Image Added
O retorno: Image Added
Image Added
Image Added
Image Added
Image Added
Todos existem porém, o B8_LOTECTL está com os carácteres indevidos que bagunçam o entendimento do SQL na leitura das chamadas de Query.
|
Resultado pós análise/interaçãoCliente não retornou sobre o erro crucial para a operação, logo, problema resolvido.
|
|
|