Página 1 de 1

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 19:43
por JoséQuintas
Só um exemplo simples, de um principiante.
produto, saldo anterior, entradas, saídas, saldo atual

Código: Selecionar todos

SELECT esproduto, anterior, entradas, saidas, anterior + entradas - saidas AS saldo
FROM
(
SELECT
esproduto,
SUM( if( YEAR( esdatlan ) < 2020, if( estiplan = '1',esqtde, -esqtde), 0 ) ) AS anterior,
SUM( if( YEAR( esdatlan ) = 2020 AND estiplan='1', esqtde, 0 ) ) AS entradas,
SUM( if( YEAR( esdatlan ) = 2020 AND estiplan='2', esqtde, 0 ) ) AS saidas
FROM jpestoque
GROUP BY esproduto
) AS b
mysqlsample.png
Talvez interesse isto:
tot.png
1.102 registros é o resultado. a tabela tem 243.693 registros.
1.2 segundos de tempo (0.5 foi na segunda vez, porque fica em cache fica mais rápido).

Tentem somar 243.693 registros em DBF pra ver o que dá....rs

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 19:53
por JoséQuintas
Faltou a descrição do produto.
ela está no jpitem, chama-se IEDESCRI
Então, só relacionar o código do produto

Código: Selecionar todos

SELECT esproduto, jpitem.IEDESCRI, anterior, entradas, saidas, anterior + entradas - saidas AS saldo
FROM
(
SELECT
esproduto,
SUM( if( YEAR( esdatlan ) < 2020, if( estiplan = '1',esqtde, -esqtde), 0 ) ) AS anterior,
SUM( if( YEAR( esdatlan ) = 2020 AND estiplan='1', esqtde, 0 ) ) AS entradas,
SUM( if( YEAR( esdatlan ) = 2020 AND estiplan='2', esqtde, 0 ) ) AS saidas
FROM jpestoque
GROUP BY esproduto
) AS b
LEFT JOIN jpitem ON jpitem.IDPRODUTO = b.esproduto
Não mudou muito o tempo de execução.
lubrax.png

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 19:57
por JoséQuintas
E porque tá tudo negativo?

porque eu inverti entradas e saídas kkkkkkkk
errei na parte mais simples kkkkkkk
1 é saída, 2 é entrada, e fiz o contrário.

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:12
por JoséQuintas
Só comentário a mais:

Pra quem não conhece, esse programa é o HEIDISQL, que permite mexer com base de dados MySQL, MariaDB, e outras.
Encima é o comando que vai pro servidor, e embaixo é o que o servidor devolve, em forma de browse/grid.

No caso do aplicativo, o aplicativo envia o comando de cima, e recebe o resultado de baixo.

É um bom programa pra "brincar", testando comandos pra ver o que acontece, ou pra conferir alguma coisa.

Acho que ele dá uma boa visão do que é SQL.
Envia o comando de cima, recebe o retorno de baixo.

No caso do ADO, o retorno vém em formato ADO
No caso de SQLMIX, o retorno vém em formato DBF
No caso de hbmysql, o retorno vém em formato array

Como eu já disse, é como se fosse um "temporário", que o servidor manda pronto pra uso.
Quanto mais o servidor puder fazer, melhor.

No caso acima, eram 243.693 registros.
Como o servidor mandou pronto, vieram só 1.102 registros com os totais.

Processamento rápido, porque é local no servidor, e economizou rede e terminal, porque evitou 242.000 registros inúteis pela rede.
Por mais que um acesso DBF agilize, não tem comparação.

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:44
por asimoes
Quintas,

O ideal é criar Stored Procedures e retornar uma lista ( cursor ) desta consulta

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:48
por asimoes
2020-03-27 20_47_17-Window.png

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:48
por bencz
1.2 segundos de tempo
Ainda ta lento... a tabela tem poucos registros, não é motivo para demorar tanto

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:50
por asimoes
2020-03-27 20_49_29-Window.png

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:54
por asimoes
Exemplo simples:

Código: Selecionar todos

DELIMITER //
 
CREATE OR REPLACE PROCEDURE Busca(IN p_sCodigo VARCHAR(5), INOUT p_sErro VARCHAR(4000))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
    SET p_sErro = '';
    SELECT * FROM CADASTROSOCIOS CAD WHERE CAD.CODIGO = p_sCodigo;
END //
DELIMITER ;

Exemplo anterior,entrada,saida,saldo

Enviado: 27 Mar 2020 20:57
por asimoes
Exemplo chamando a SP

Código: Selecionar todos

     cPLSQL := "asaprev.Busca"
      
      aVarS  := { { "p_sCodigo", '20735',      "V", "I" }, ; 
   	              { "p_sErro",   Space(100),   "V", "O" } ;
                }
        
      aNmCampo := { "CODIGO", "NOME", "ENDERECO"  }
      
      aDados := {}
      
      IF oConexao:AdoPLSQL( @oRecordSet, cPLSQL, @aVarS, "P", @cErro, .T., @aDados, aNmCampo ) != 0
      ENDIF

Exemplo anterior,entrada,saida,saldo

Enviado: 29 Mar 2020 09:21
por JoséQuintas
bencz escreveu:Ainda ta lento... a tabela tem poucos registros, não é motivo para demorar tanto
Depois vou pesquisar.

Já descobri uma coisa: porque as vezes o comando é lento ou rápido:
Num campo string usado como número... depende de existir algum valor que NÃO pode ser traduzido pra número.

É que preciso alterar com cuidado, porque checagens IF ! Empty( campo ) deixam de funcionar se o defalt passou a ser '0'.
Mas de qualquer forma, acabando com campos texto aonde pode ser fixado número.
Ao invés de converter pra ficar igual DBF, passei a converter somente na leitura/gravação do DBF, aonde ainda existe DBF.