Página 1 de 1

Erro de hoje no MySQL - erro do programador

Enviado: 09 Out 2021 18:49
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.

Erro de hoje no MySQL - erro do programador

Enviado: 10 Out 2021 20:04
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.