Página 1 de 1

Sub-Utilização de veículo

Enviado: 25 Ago 2020 00:38
por JoséQuintas
Estou fazendo uns testes, nem tem a ver diretamente com comando SQL, mas sobre o que pesquisar.

Código: Selecionar todos

SELECT nfveiculo AS Veiculo, 
COUNT(*) as QtDias, 
Capacidade,
ROUND( AVG( litros ), 0 ) AS MediaDia, 
ROUND( SUM( litros ), 0 ) as Total
FROM
(
SELECT NFVEICULO, jpveiculo.vecapactot AS Capacidade,
nfdatsai, sum(jpitped.ipqtde) AS litros
FROM jpnotfis 
INNER JOIN jpveiculo ON jpveiculo.VEPLACA = jpnotfis.nfveiculo
INNER JOIN jppedido ON jpnotfis.nfpedido = jppedido.IDPEDIDO
INNER JOIN jpitped ON jpitped.ippedido = jppedido.idpedido
INNER JOIN jpitem ON jpitem.idproduto = jpitped.ipproduto
WHERE nfdatemi BETWEEN '2020-07-01' AND '2020-07-31' AND jpveiculo.vecapac1 > 0
GROUP BY nfveiculo, nfdatsai
) AS a
GROUP BY nfveiculo
NÃO tenho a indicação de viagem, então por enquanto pensei nisso.
Tem a capacidade do veículo, a data de saída da nota.

A média diária, comparada à capacidade, pode indicar veículo vazio, e/ou mais de uma viagem por dia
E a quantidade de dias viajados, pode indicar veículo trabalhando muito e/ou pouco

Alguma idéia de comparativo?
Por enquanto vejo a necessidade da informação sobre quais notas estão em cada viagem.

Nota:
Nisso a gente vê mais ainda como usar MySQL é sensacional, comparado com DBF.
Um comando e pronto.

Nota2:
o resultado, pelo heidisql, é igual uma planilha.
Mas postar o resultado acaba contendo informações de cliente, e isso é problema.

Sub-Utilização de veículo

Enviado: 25 Ago 2020 12:36
por JoséQuintas
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....

Código: Selecionar todos

/*
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.

Sub-Utilização de veículo

Enviado: 25 Ago 2020 12:49
por JoséQuintas
Uia, mês a mês.

Código: Selecionar todos

SELECT nfveiculo AS Veiculo, DATE_FORMAT( nfdatsai, '%Y-%m' ) AS mes,
COUNT(*) as QtDias, 
Capacidade,
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 AS Capacidade,
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 '2020-01-01' AND '2020-07-31'  AND jpveiculo.vecapac1 > 0
GROUP BY nfveiculo, nfdatsai
) AS a
GROUP BY nfveiculo, DATE_FORMAT( nfdatsai, '%Y-%m' )
mes.png