Erro de hoje no MySQL - erro do programador

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

Erro de hoje no MySQL - erro do programador

Mensagem por JoséQuintas »

Código: Selecionar todos

FUNCTION ze_ContabilDiario( nMes INT(11) )

BEGIN

DECLARE nMes INT(11);
A função recebe o parâmetro nMes, ao mesmo tempo que cria a variável nMes.
NÃO tem mensagem de erro na criação da função, mas.... com certeza a rotina usa a variável declarada e não o parâmetro.

Tava brigando com isto, até coloquei pra retornar as variáveis, como opção de debug:

Código: Selecionar todos

CREATE PROCEDURE ze_ContabilDiario( nOpcMes INT(11) )

BEGIN

DECLARE dInicial, dFinal, dFechamento DATE;
DECLARE nAno, nMes, nFecha INT(11);

SELECT EMANOBASE FROM JPEMPRESA WHERE IDEMPRESA = 1
   INTO nAno;

SELECT EMFECHA FROM JPEMPRESA WHERE IDEMPRESA = 1
   INTO nFecha;

SET dInicial := CONCAT( LPAD( nAno, 4, '0' ), '-01-01' );
SET dInicial := DATE_ADD( dInicial, INTERVAL nOpcMes - 1 MONTH );
SET dFinal   := LAST_DAY( dInicial );

SET nAno := YEAR( dInicial );
SET nMes := MONTH( dInicial );
SET nMes := FLOOR( ( nMes - 1 ) / nFecha ) * nFecha;
IF nMes = 0 THEN
   SET dFechamento := CONCAT( LPAD( nAno - 1, 4, '0' ), '-12-31' );
ELSE
   SET dFechamento := CONCAT( LPAD( nAno, 4, '0' ), '-', LPAD( nMes, 2, '0' ), '-01' );
END IF;
SET dFechamento := LAST_DAY( dFechamento );

SELECT nOpcMes, dInicial, dFinal, nAno, nMes, dFechamento;

/* bloqueei o resto */

END
contabil.png
O ano base é 2013, e o fechamento é anual.
Se o usuário escolher o mês 95, equivale a 11/2020.
O fechamento é 12 meses, anual, então o último fechamento oficial foi em dezembro/2019.
Ainda na dúvida, se nas procedures/functions uso o número ou a data.
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

Erro de hoje no MySQL - erro do programador

Mensagem por JoséQuintas »

[mysqld-5.5.5-10.6.3-MariaDB]Incorrect date value: '20190132' for column ``.``.`dInicial` at row 70
Mais outro erro do programador, que vai ser comum....
Campo DATE + 1, resultou em 32 de janeiro de 2019.

errado: nDate + 1 , retorna um número.
correto: DATE_ADD( nDate, INTERVAL 1 DAY )

Isso é interessante, porque de certa forma, para o MySQL tudo é letra ou número ou data ou qualquer coisa.
O tipo do resultado depende sempre da operação que está sendo feita.

Mas é uma coisa que a gente vai confundir muito.
Não dá erro na operação, só no uso do resultado.
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