Só comentar novamente:
Como o comando SQL é praticamente o módulo....
E como um módulo pode ser um diferencial num aplicativo....
Uso mais pesado de comando SQL acaba não sendo mostrado.
É que em muitos casos, acaba sendo como entregar fontes importantes do aplicativo, e perder o diferencial...
Então.... depois de testar no HeidiSQL, estou liberando um módulo pra primeiros testes, e ver se ajuda em alguma coisa.
O fonte Harbour ficou ridÃculo, de tão simples....
/*
PNOTAVIAGEM - VIAGEM DOS VEICULOS
*/
PROCEDURE PNOTAVIAGEM
LOCAL dInicial := Date() - Day( Date() )
LOCAL dFinal := Date()
LOCAL cnSQL := ADOClass():New( AppConexao() )
DO WHILE .T.
Cls()
@ 2, 1 SAY "PerÃodo:" GET dInicial
@ Row(), Col() + 2 SAY "a" GET dFinal
READ
IF LastKey() == K_ESC
EXIT
ENDIF
WITH OBJECT cnSQL
:cSQL := "SELECT NFVEICULO, COUNT(*) AS QTDIAS, VECAPACTOT," + ;
" ROUND( AVG( LITROS ), 0 ) AS MEDIADIA," + ;
" ROUND( MIN( LITROS ), 0 ) AS MINIMA," + ;
" ROUND( MAX( LITROS ), 0 ) AS MAXIMA," + ;
" SUM( IF( LITROS < CAPACIDADE, 1, 0 ) ) AS ABAIXO," + ;
" SUM( IF( LITROS = CAPACIDADE, 1, 0 ) ) AS NORMAL," + ;
" SUM( IF( LITROS > CAPACIDADE, 1, 0 ) ) AS ACIMA," + ;
" ROUND( SUM( LITROS ), 0 ) AS TOTAL" + ;
" FROM" + ;
" (" + ;
" SELECT NFVEICULO, JPVEICULO.VECAPACTOT," + ;
" NFDATSAI, SUM( JPITPED.IPQTDE ) AS LITROS" + ;
" FROM JPNOTFIS =" + ;
" LEFT JOIN JPVEICULO ON JPVEICULO.VEPLACA = JPNOTFIS.NFVEICULO" + ;
" LEFT JOIN JPPEDIDO ON JPNOTFIS.NFPEDIDO = JPPEDIDO.IDPEDIDO" + ;
" LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO" + ;
" LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
" WHERE NFDATEMI BETWEEN " + DateSQL( dInicial ) + " AND " + DateSQL( dFinal ) + ;
" GROUP BY NFVEICULO, NFDATSAI" + ;
" ) AS A" + ;
" GROUP BY NFVEICULO" + ;
" ORDER BY NFVEICULO"
:ExecuteCmd()
oTBrowse := { ;
{ "VEICULO", { || :String( "NFVEICULO", 10 ) } }, ;
{ "QTDIAS", { || Str( :Number( "QTDIAS" ), 3 ) } }, ;
{ "CAPACIDADE", { || Str( :Number( "VECAPACTOT" ), 6 ) } }, ;
{ "MEDIA/DIA", { || Str( :Number( "MEDIADIA" ), 6 ) } }, ;
{ "MINIMA", { || Str( :Number( "MINIMA" ), 6 ) } }, ;
{ "MAXIMA", { || Str( :Number( "MAXIMA" ), 6 ) } }, ;
{ "ABAIXO", { || Str( :Number( "ABAIXO" ), 6 ) } }, ;
{ "NORMAL", { || Str( :Number( "NORMAL" ), 6 ) } }, ;
{ "ACIMA", { || Str( :Number( "ACIMA" ), 6 ) } }, ;
{ "TOTAL", { || Str( :Number( "TOTAL" ), 6 ) } } }
BrowseADO( cnSQL, oTBrowse, "VEICULO", { || "" } )
:CloseRecordset()
ENDWITH
ENDDO
RETURN NIL
Então...
Tente imaginar como seria isso em DBF, quanto fonte, e quanto tempo de processamento iria precisar....
Pois é... em SQL foi fazer o teste, 1 segundo pra ver o resultado, e depois colocar o comando num fonte.
Destaque:
Não precisa DBF, Alias(), SELECT, SEEK... dá até pra colocar no cadastro do veÃculo pra ver o uso dele.