Sub-Utilização de veículo

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Sub-Utilização de veículo

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Sub-Utilização de veículo

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Sub-Utilização de veículo

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder