create or replace 
FUNCTION RETORNA_NRCICLO(
    P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
    P_CDSERVFILI   IN SERVICO.CDSERVFILI%TYPE,
    P_DATA    IN DATE) RETURN VARCHAR2
AS
   V_CDCARDCICLO     VARCHAR(5);
   V_NRCICLO         NUMBER;
   V_DTINICICLO      DATE;

BEGIN
   V_NRCICLO := 0;
   
   SELECT SC.CDCARDCICLO, SC.DTINICICLO
     INTO V_CDCARDCICLO, V_DTINICICLO
     FROM SERVCARDCICLO SC, CARDCICLO CC
    WHERE SC.CDFILIAL = P_CDFILIAL
      AND SC.CDSERVFILI = P_CDSERVFILI
      AND CC.CDCARDCICLO = SC.CDCARDCICLO
      AND CC.IDATIVCICLO = 'S'
      AND SC.DTINICICLO = (SELECT MAX(SERVCARDCICLO.DTINICICLO) 
                             FROM SERVCARDCICLO, CARDCICLO
                            WHERE SERVCARDCICLO.CDFILIAL = P_CDFILIAL
                              AND SERVCARDCICLO.CDSERVFILI = P_CDSERVFILI
                              AND SERVCARDCICLO.DTINICICLO <= TO_DATE(P_DATA)
                              AND CARDCICLO.CDCARDCICLO = SERVCARDCICLO.CDCARDCICLO
                              AND CARDCICLO.IDATIVCICLO = 'S') ;

   IF V_CDCARDCICLO IS NOT NULL THEN
      SELECT DECODE(MOD((P_DATA-(SC.DTINICICLO-SC.NRINICICLO)), (CC.NRSEMCICLO*7)), 0, (CC.NRSEMCICLO*7), MOD((P_DATA-(SC.DTINICICLO-SC.NRINICICLO)), (CC.NRSEMCICLO*7)))
        INTO V_NRCICLO
        FROM CARDCICLO CC, SERVCARDCICLO SC
       WHERE CC.CDCARDCICLO = SC.CDCARDCICLO
         AND SC.CDCARDCICLO = V_CDCARDCICLO
         AND SC.CDFILIAL = P_CDFILIAL
         AND SC.CDSERVFILI = P_CDSERVFILI
         AND SC.DTINICICLO = V_DTINICICLO;
   END IF;

   RETURN(V_CDCARDCICLO||TO_CHAR(V_NRCICLO));
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('RETORNA_NRCICLO','5.75.000'); END;
/