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