Relatório Customizado

Senhores Boa Noite,

Alterei a query do relatório MATR600, mas agora o relatório fica num Loop e não gera mais os dados, sou obrigado a derrubar a conexão no monitor.

Já analisei mas ainda não consegui encontrar, poderiam me ajudar?

Segue o fonte em anexo.

Obrigado.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

É díficil ver algo direto no código, uma estratégia interessante é debugar e analisar algumas coisas:

  1. Parando na linha 1037, pegar o conteudo da variável cQuery e rodar em um client do banco de dados, pode ser que o custo da query esteja tão alto que esteja demorando demais e dando a impressão que travou nos loops posteriores

  2. Se estiver passando da query, parar na linha 1036 e ver o len do array atrusc5, se está em quantidade que não demore tanto no loop a ponto de parecer que travou

  3. finalmente se passou do loop do for, parar no loop do while, na linha 1047 e ver quanto tempo está levando cada interação e se realmente está avançando os registros, se for o caso ajustar a query da linha 1037 para trazer um ou dois registros apenas e ver se completa pelo menos um loop..

Seguindo essa estratégia em algum momento vai 'tropeçar' no problema :-)

Bom dia,

Habilite a chave KillStack, com ela ativa, emita o relatório e espere o travamento, derrube a thread pelo monitor. Com essa chave ativa, é possível verificar o stack da thread que foi derrubada, com isso você encontrará o ponto do loop e ficará mais fácil compreender e atuar no erro: http://tdn.totvs.com/display/tec/%5BEnvironment%5D+KillStack

Daniel Bom Dia,

Habilitei a chave no meu ambiente, e derrubei a conexão no monitor, onde consigo ver o stack? no console.log?

Valeu.

Senhores muito obrigado, não conhecia a chave KillStack, e também farei o debug conforme orientações do Josué.

Grato pelo apoio, assim que solucionar retorno e digo o que era.

Abraços.

Vamos lá.,

Aparentemente é essa sua query que está derrubando tudo.

Pode fazer alguns ajustes 1) Verificar se todos os campos existem no banco de dados para isso é só executar a query abaixo e ver se não há erros no SQl:

SELECT DISTINCT A1NOME,A1_MUN ,C5_FILIAL, C5_NUM, C5_XFAT, C5_TIPO, C5_CLIENTE, C5_LOJACLI, C5_LOJAENT, C5_CLIENT, C5_XNOMCLI, C5_TRANSP, C5_XTRNSNO, C5_FRETE, C5_SEGURO, C5_NATUREZ, C5_TIPOCLI, C5_CONDPAG, C5_TABELA, C5_VEND1, C5_COMIS1, C5_VEND2, C5_COMIS2, C5_VEND3, C5_COMIS3, C5_VEND4, C5_COMIS4, C5_VEND5, C5_COMIS5, C5_DESC1, C5_DESC2, C5_DESC3, C5_DESC4, C5_BANCO, C5_DESCFI, C5_EMISSAO, C5_COTACAO, C5_PARC1, C5_DATA1, C5_PARC2, C5_DATA2, C5_PARC3, C5_DESPESA, C5_FRETAUT, C5_REAJUST, C5_MOEDA, C5_DATA3, C5_PARC4, C5_DATA4, C5_TPFRETE, C5_XFLAG, C5_PESOL, C5_PBRUTO, C5_REIMP, C5_REDESP, C5_VOLUME1, C5_VOLUME2, C5_VOLUME3, C5_VOLUME4, C5_ESPECI1, C5_ESPECI2, C5_INCISS, C5_LIBEROK, C5_OK, C5_NOTA, C5_SERIE, C5_ESPECI3, C5_OS, C5_ESPECI4, C5_ACRSFIN, C5_MENNOTA, C5_TXMOEDA, C5_MENPAD, C5_KITREP, C5_TIPLIB, C5_FECENT, C5_XDATFAT, C5_DATPROD, C5_DESCONT, C5_PEDEXP, C5_TPCARGA, C5_DTLANC, C5_PDESCAB, C5_BLQ, C5_FORNISS, C5_CONTRA, C5_VLR_FRT, C5_MDCONTR, C5_ORCRES, C5_MDNUMED, C5_ESTPRES, C5_GERAWMS, C5_MUNPRES, C5_ORIGEM, C5_MDPLANI, C5_NUMENT, C5_DESCMUN, C5_SOLFRE, C5_NFSUBST, C5_SERSUBS, C5_OBRA, C5_TXREF, C5_DTTXREF, C5_SOLOPC, C5_SUGENT, C5_CODED, C5_NUMPR, C5_RECISS, C5_RECFAUT, C5_VEICULO, C5_PREPEMB, C5_MOEDTIT, C5_NUMSIM, C5_INDPRES, C5_NTEMPEN, C5_TIPOBRA, C5_USERLGA, C5_DTESERV, C5_USERLGI, C5_MSBLQL, C5_TPCOMPL, C5_REMCTR, C5_REMREV, C5_TABTRF, C5_CODEMB, C5_PEDECOM, C5_RASTR, C5_STATUS, C5_CODSAF, C5_TRCNUM, C5_FILGCT, C5_CNO, C5_ECSEDEX, C5_ECVINCU, C5_IMINT, C5_ARTOBRA, C5_CGCINT, C5_CLIINT, C5_SLENVT, C5_RET20G, C5_PLACA2, C5_PLACA1, C5_MODANP, C5_CODVGLP, C5_CODMOT, C5_ECPRESN, C5_VOLTAPS, C5_SDOCSUB, C5_SDOC, C5_XDTPREV, C5_XDTCOLE, C5_PRAZMED, C5_XAPROV, C5_CLIRET, C5_LOJARET, C5_FRTCFOP, C5_CMUNOR, C5_UFDEST, C5_CMUNDE, C5_UFORIG FROM SC5010(NOLOCK) WHERE C5_EMISSAO >= '20190401' AND D_E_L_E_T = ''

2) Usar Inner Join ao inves de apenas adicionar no FROM, Substitua na linha 502: FROM %Table:SC5% SC5, %Table:SA1% SA1, %Table:SD2% SD2 por FROM %Table:SC5% SC5 INNER JOIN %Table:SA1% SA1 ON A1COD = C5_CLIENTE AND A1_LOJA = C5_LOJACLI AND C5_FILIAL = %xFilial:SC5% INNER JOIN %Table:SD2% SD2 ON D2_PEDIDO = C5_NUM AND SD2.D_E_L_E_T = '' AND D2_FILIAL = %xFilial:SD2%