PERGUNTAS E RESPOSTAS
 
Bem Vindo, Visitante  Todos os Fórums
  ADVPL
Enviar para a impressoraImprimir  Enviar e-mail para um amigoEnviar Para um Amigo
Precisa estar Logado

Subject Assunto:
Resultado da query vazia
Versão:
12
Plataforma:
Microsoft
Complemento:
12.1.17
DB:
SQL Server
Complemento:
Fonte e Pergunta.zip (anexo)
LinkedIn
Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário PBARRETO PBARRETO em 26/12/2018, 12:07 h
Local: CE  Registro: 12/01/2010  Postagens: 15
Bom dia.

Como se pode ver abaixo, é gerada uma QUERY e atribuído a uma MATRIZ "aPag" o resultado da query(Mês, ano, Total).
Na linha do "FOR" subtraio o valor (aPag[3] com o valor do recebimento, só que como o valor do "aPag" está vazio, apresenta o erro: array out of bounds (2 of 1). COMO FAÇO PARA ATRIBUIR AO ARRAY UM VALOR IGUAL A ZERO(0)?

dbUseArea(.T., "TOPCONN", TCGenQry(,,cQueryPag), cQryPag, .T., .T.)
(cQryPag)->(DbGoTop())

While !(cQryPag)->(EOF())
     AADD(aPag,{(cQryPag)->MES,(cQryPag)->Ano,(cQryPag)->TotPag})

(cQryPag)->(dbSkip())
ENDDO     

(cQryPag)->(DbCloseArea())

For i:=1 To Len(aRec)
     nResFin := aRec[3] - aPag[3]

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário JALBERTO JALBERTO em 26/12/2018, 13:19 h
Local: RS  Registro: 20/08/2009  Postagens: 167
Coloca esse trecho abaixo do ENDDO

If Len( aPag ) <= 0
   AADD( aPag, {"","",0} )
EndIf


Jorge Alberto

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 26/12/2018, 14:47 h
Local: SP  Registro: 20/08/2010  Postagens: 470
não é a melhor forma de solucionar o problema, de qualquer forma, você pode adicionar o for..next abaixo, imediatamente antes desse que você publicou:

For i := len(aPag) To Len(aRec)
aAdd( aPag, 0 )
Next i


Então ficaria assim:

dbUseArea(.T., "TOPCONN", TCGenQry(,,cQueryPag), cQryPag, .T., .T.)
(cQryPag)->(DbGoTop())

While !(cQryPag)->(EOF())
   AADD(aPag,{(cQryPag)->MES,(cQryPag)->Ano,(cQryPag)->TotPag})
   (cQryPag)->(dbSkip())
ENDDO      

(cQryPag)->(DbCloseArea())

For i := len(aPag) To Len(aRec)
aAdd( aPag, 0 )
Next i

For i:=1 To Len(aRec)
     nResFin := aRec[3] - aPag[3]

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário PBARRETO PBARRETO em 26/12/2018, 15:28 h
Local: CE  Registro: 12/01/2010  Postagens: 15
JOrge e Emerson, em ambos as soluções, continua apresentando "array of bounds".

Como o query está vazio, ou seja, nem as colunas aparecem, quando rodo no SQL, ambas as soluções são excelentes, mas como informar ao ADVPL que a query está vazia?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário PBARRETO PBARRETO em 26/12/2018, 15:40 h
Local: CE  Registro: 12/01/2010  Postagens: 15
Para ficar fácil compreensão, segue o fonte com o arquivo de pergunta do SX1.

O relatório é simples, gera o resultado em Excel, pegando de um exercicio, todos os recebimento e pagamentos mês a mês.



Agradeço toda ajuda!!

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário CRIS.POLLI CRIS.POLLI em 26/12/2018, 15:58 h
Local: SP  Registro: 16/09/2005  Postagens: 56
Boa tarde,
Sugiro incluir isnull na linha do select, exemplo: select mês,ano, isnull(total, 0), caso o valor do campo total seja nulo retornará 0 evitando o erro, mais veja pelo querys analyser do apsdu ou pelo sql.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário MARCOSSTAR MARCOSSTAR em 26/12/2018, 16:07 h
Local: SP  Registro: 26/06/2015  Postagens: 16
PBARRETO se a query nao retorna nenhum resultado quando você realizasse o laço :

While !cAlias->(EOF())

o mesmo não deveria entrar!

Se na sua query está trazendo o Ano e o Mês mas o somatório do E5_VALOR está nulo, faça o seguinte na coluna TotRec:
cQueryRec += "CASE WHEN SUM(E5_VALOR) > 0 THEN SUM(E5_VALOR) ELSE 0 END TotRec "


Att,

Marcos Vieira
Ing. Consultor ERP

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário CRIS.POLLI CRIS.POLLI em 26/12/2018, 16:09 h
Local: SP  Registro: 16/09/2005  Postagens: 56
Ops, depois do dbusearea inclua a verificação se a tabela está vazia com o If e feche o If depois do for.
Exemplo:

If !(cquerypag)->(eof())
.....
While
.....
For...

Endif

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário MARCELLOW MARCELLOW em 26/12/2018, 16:35 h
Local: SP  Registro: 22/01/2009  Postagens: 258
TENTA ASSIM APOS O ENDDO

IF EOF() .and. len(aRec) = 0
AADD(aPag,{"","",0})
Endif

espero ter ajudado

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário PBARRETO PBARRETO em 26/12/2018, 16:48 h
Local: CE  Registro: 12/01/2010  Postagens: 15
Obrigado à todos pela ajuda!
MARCELLOW, deu certo!

Para postar no Fórum você precisa efetuar o seu login ou se registrar

 Mudar para Fórum

 

 

 
 
   
Pagina Principal Shopping PROTHEUS Tire suas duvidas Vagas Microsiga em todo Brasil Aprofunde seus conhecimentos Noticias Online Fale Conosco Pagina Principal