Procedure Avançada no Firebird, utilizando vários recursos ….

CREATE PROCEDURE SP_TIPODOCUMENTO_TEMPO (
    ipcodigotipodocumento integer,
    ipdatafinal date)
returns (
    opdataprevistaretirada date,
    opdatarealretirada date)
as
declare variable vtempoarquivoanos integer;
declare variable vtempoarquivomeses integer;
declare variable vtempoarquivoanosusuario integer;
declare variable vtempoarquivomesusuario integer;
declare variable vfinalconcessao varchar(1);
declare variable vtempoesperaano integer;
declare variable vtempoesperameses integer;
declare variable vdatafinalconcessao date;
declare variable vdiapadrao integer;
BEGIN
    VDIAPADRAO = 1;

    /* LEMBRANDO QUE NO PROGRAMA SÓ VOU ACEITAR 3 6 E 9 PARA OS MESES*/
    SELECT TEMPOARQUIVOANO, TEMPOARQUIVOMESES, TEMPOARQUIVOANOSUSUARIO, TEMPOARQUIVOMESUSUARIO, FINALCONCESSAO, TEMPOESPERAANO, TEMPOESPERAMESES
    FROM TIPODOCUMENTO
    WHERE CODIGOTIPODOCUMENTO = :IPCODIGOTIPODOCUMENTO
    INTO :VTEMPOARQUIVOANOS, :VTEMPOARQUIVOMESES, :VTEMPOARQUIVOANOSUSUARIO, :VTEMPOARQUIVOMESUSUARIO, :VFINALCONCESSAO, :VTEMPOESPERAANO, :VTEMPOESPERAMESES;

    IF (:VTEMPOARQUIVOANOS IS NULL) THEN
        VTEMPOARQUIVOANOS = 0;

    IF (:VTEMPOARQUIVOMESES IS NULL) THEN
        VTEMPOARQUIVOMESES = 0;

    IF (:VTEMPOARQUIVOANOSUSUARIO IS NULL) THEN
        VTEMPOARQUIVOANOSUSUARIO = 0;

    IF (:VTEMPOARQUIVOMESUSUARIO IS NULL) THEN
        VTEMPOARQUIVOMESUSUARIO = 0;

    IF (:VTEMPOESPERAANO IS NULL) THEN
        VTEMPOESPERAANO = 0;

    IF (:VTEMPOESPERAMESES IS NULL) THEN
        VTEMPOESPERAMESES = 0;

    IF (EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES < 12) THEN
    BEGIN
        OPDATAPREVISTARETIRADA =
        CAST((EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES) AS VARCHAR(5)) || ‘/’ ||
        :VDIAPADRAO || ‘/’ ||
        CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS) AS VARCHAR(5));

        /** NO CASO DE MESES MENORES **/
        IF (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES < 12) THEN
        BEGIN
            /** NO CASO DE MESES MENORES PREENCHIDOS OS MESES**/
            IF (:VTEMPOESPERAMESES <> 0) THEN
            BEGIN
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 1) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 3) ) THEN
                    OPDATAREALRETIRADA = ’04/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 4) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 6) ) THEN
                    OPDATAREALRETIRADA = ’07/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 7) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 9) ) THEN
                    OPDATAREALRETIRADA = ’10/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 10) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 12) ) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1) AS VARCHAR(5));
                IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));

            END
            ELSE
            BEGIN
                /** NO CASO DE MESES MENORES PREENCHIDOS ANOS **/
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + VTEMPOESPERAANO)AS VARCHAR(5));
            END
        END
        ELSE
        BEGIN
            /** NO CASO DE MESES IGUAIS E MAIORES **/
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 1) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 3)) THEN
                OPDATAREALRETIRADA = ’04/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 4) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 6)) THEN
                OPDATAREALRETIRADA = ’07/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 7) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 9)) THEN
                OPDATAREALRETIRADA = ’10/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 10) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 12)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 2 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
        END
    END
    ELSE
    BEGIN
        /* CASO SEJA 12 TENHO QUE SOMAR 1 AO ANO*/
        IF (EXTRACT (MONTH FROM IPDATAFINAL) + :VTEMPOARQUIVOMESES = 12) THEN
        BEGIN
            OPDATAPREVISTARETIRADA =
            CAST(EXTRACT (MONTH FROM IPDATAFINAL) AS VARCHAR(5)) || ‘/’ ||
            :VDIAPADRAO || ‘/’ ||
            CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS + 1) AS VARCHAR(5));
        END
        ELSE
        BEGIN
            OPDATAPREVISTARETIRADA =
            CAST((EXTRACT (MONTH FROM IPDATAFINAL) – 12 + :VTEMPOARQUIVOMESES) AS VARCHAR(5)) || ‘/’ ||
            :VDIAPADRAO || ‘/’ ||
            CAST((EXTRACT (YEAR FROM IPDATAFINAL) + :VTEMPOARQUIVOANOS + 1) AS VARCHAR(5));
        END
        /** NO CASO DE MESES MENORES **/
        IF (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES < 12) THEN
        BEGIN
            /** NO CASO DE MESES MENORES PREENCHIDOS OS MESES**/
            IF (:VTEMPOESPERAMESES <> 0) THEN
            BEGIN
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 1) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 3) ) THEN
                    OPDATAREALRETIRADA = ’04/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 4) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 6) ) THEN
                    OPDATAREALRETIRADA = ’07/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 7) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 9) ) THEN
                    OPDATAREALRETIRADA = ’10/01/’ || CAST(EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) AS VARCHAR(5));
                IF ( (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) >= 10) AND (:VTEMPOESPERAMESES + EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) <= 12) ) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1) AS VARCHAR(5));
                IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                    OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            END
            ELSE
            BEGIN
                /** NO CASO DE MESES MENORES PREENCHIDOS ANOS **/
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + VTEMPOESPERAANO)AS VARCHAR(5));
            END
        END
        ELSE
        BEGIN
            /** NO CASO DE MESES IGUAIS E MAIORES **/
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 1) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 3)) THEN
                OPDATAREALRETIRADA = ’04/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 4) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 6)) THEN
                OPDATAREALRETIRADA = ’07/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 7) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 9)) THEN
                OPDATAREALRETIRADA = ’10/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 >= 10) AND (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 <= 12)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 2 + VTEMPOESPERAANO)AS VARCHAR(5));
            IF ( (EXTRACT (MONTH FROM OPDATAPREVISTARETIRADA) + :VTEMPOESPERAMESES – 12 = 0)) THEN
                OPDATAREALRETIRADA = ’01/01/’ || CAST((EXTRACT (YEAR FROM OPDATAPREVISTARETIRADA) + 1 + VTEMPOESPERAANO)AS VARCHAR(5));
        END
    END

    IF (VFINALCONCESSAO = ‘S’) THEN
    BEGIN
        SELECT DATAFINAL FROM FINALCONCESSAO INTO :VDATAFINALCONCESSAO;
        IF (:VDATAFINALCONCESSAO > :OPDATAREALRETIRADA) THEN
        BEGIN
            OPDATAPREVISTARETIRADA = VDATAFINALCONCESSAO;
            OPDATAREALRETIRADA = VDATAFINALCONCESSAO;
        END
        SUSPEND;
        EXIT;
    END
    SUSPEND;
END^

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s