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
Talvez interesse isto:
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.
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
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
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.