Exemplo anterior,entrada,saida,saldo

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

Exemplo anterior,entrada,saida,saldo

Mensagem 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
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

Exemplo anterior,entrada,saida,saldo

Mensagem 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
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

Exemplo anterior,entrada,saida,saldo

Mensagem 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.
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

Exemplo anterior,entrada,saida,saldo

Mensagem 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.
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Exemplo anterior,entrada,saida,saldo

Mensagem por asimoes »

Quintas,

O ideal é criar Stored Procedures e retornar uma lista ( cursor ) desta consulta
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Exemplo anterior,entrada,saida,saldo

Mensagem por asimoes »

2020-03-27 20_47_17-Window.png
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Exemplo anterior,entrada,saida,saldo

Mensagem por bencz »

1.2 segundos de tempo
Ainda ta lento... a tabela tem poucos registros, não é motivo para demorar tanto
Imagem
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Exemplo anterior,entrada,saida,saldo

Mensagem por asimoes »

2020-03-27 20_49_29-Window.png
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Exemplo anterior,entrada,saida,saldo

Mensagem 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 ;
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Exemplo anterior,entrada,saida,saldo

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Exemplo anterior,entrada,saida,saldo

Mensagem 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.
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