Clipper On Line • Ver Tópico - Sub-Utilização de veículo

Sub-Utilização de veículo

Discussão sobre SQL

Moderador: Moderadores

 

Sub-Utilização de veículo

Mensagempor JoséQuintas » 25 Ago 2020 00:38

Estou fazendo uns testes, nem tem a ver diretamente com comando SQL, mas sobre o que pesquisar.

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Sub-Utilização de veículo

Mensagempor JoséQuintas » 25 Ago 2020 12:36

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Sub-Utilização de veículo

Mensagempor JoséQuintas » 25 Ago 2020 12:49

Uia, mês a mês.

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro