Erro em cálculo na procedure.

Firebird

25/04/2007

Colegas.. tenho um relatório que é gerado a partir dos dados de uma procedure...é um relatório bem simples de estatística de propostas de serviço..

segue o código..

CREATE PROCEDURE RELATORIO_DESEMPENHO_COMERCIAL(
    I_DATA_INICIO DATE,
    I_DATA_FIM DATE,
    I_DESC_EMPRESA VARCHAR(100),
    I_COD_EMPRESA CHAR(3))
RETURNS (
    C_COUNT_EMITIDAS INTEGER,
    C_DESC_EMPRESA VARCHAR(100),
    C_DATA_FIM DATE,
    C_COUNT_TOTAL_APROVADAS INTEGER,
    C_PERC_APROVADAS_TOTAL FLOAT,
    C_COUNT_TOTAL_CANCELADAS INTEGER,
    C_PERC_CANCELADAS_TOTAL FLOAT,
    C_COD_GRUPO CHAR(2),
    C_DESC CHAR(7),
    C_PERC_EMITIDAS_TOTAL FLOAT,
    C_COD_SUB_GRUPO CHAR(2),
    C_PERC_CONVERT_SUB_GRUPO FLOAT,
    C_COUNT_APROVADAS INTEGER,
    C_COUNT_TOTAL_EMITIDAS INTEGER,
    C_COUNT_CANCELADAS INTEGER,
    C_DATA_INICIO DATE)
AS
begin
    C_DATA_INICIO = :I_DATA_INICIO;
    C_DATA_FIM = :I_DATA_FIM;

    if (RTrim(LTrim(:I_DESC_EMPRESA)) = ´´) then
    begin
        C_DESC_EMPRESA = ´Todas as Empresas´;

        select count(C_COD_PROPOSTA)
        from PO0100
        where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
        into :C_COUNT_TOTAL_EMITIDAS;

        select count(C_COD_PROPOSTA)
        from PO0100
        where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
              and C_COD_STATUS = ´AP´
        into :C_COUNT_TOTAL_APROVADAS;

        select count(C_COD_PROPOSTA)
        from PO0100
        where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
              and C_COD_STATUS = ´CA´
        into :C_COUNT_TOTAL_CANCELADAS;

        for select distinct C_COD_GRUPO, C_COD_SUB_GRUPO
            from PO0100
            into :C_COD_GRUPO, :C_COD_SUB_GRUPO
        do
        begin
            C_DESC = :C_COD_GRUPO || ´ - ´ || :C_COD_SUB_GRUPO;

            select count(C_COD_PROPOSTA)
            from PO0100
            where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
                  and C_COD_SUB_GRUPO = :C_COD_SUB_GRUPO
            into :C_COUNT_EMITIDAS;

            select count(C_COD_PROPOSTA)
            from PO0100
            where C_COD_STATUS = ´AP´
                  and C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
                  and C_COD_SUB_GRUPO = :C_COD_SUB_GRUPO
            into :C_COUNT_APROVADAS;

            select count(C_COD_PROPOSTA)
            from PO0100
            where C_COD_STATUS = ´CA´
                  and C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
                  and C_COD_SUB_GRUPO = :C_COD_SUB_GRUPO
            into :C_COUNT_CANCELADAS;

            C_PERC_CONVERT_SUB_GRUPO = 0;
            if (:C_COUNT_EMITIDAS > 0) then
            begin
                C_PERC_CONVERT_SUB_GRUPO = (:C_COUNT_APROVADAS / :C_COUNT_EMITIDAS) * 100;
            end

            C_PERC_EMITIDAS_TOTAL = 0;
            if (:C_COUNT_TOTAL_EMITIDAS > 0) then
            begin
                C_PERC_EMITIDAS_TOTAL = (:C_COUNT_EMITIDAS / :C_COUNT_TOTAL_EMITIDAS) * 100;
            end

            C_PERC_APROVADAS_TOTAL = 0;
            if (:C_COUNT_TOTAL_APROVADAS > 0) then
            begin
                C_PERC_APROVADAS_TOTAL = (:C_COUNT_APROVADAS / :C_COUNT_TOTAL_APROVADAS) * 100;
            end

            C_PERC_CANCELADAS_TOTAL = 0;
            if (:C_COUNT_TOTAL_CANCELADAS > 0) then
            begin
                C_PERC_CANCELADAS_TOTAL = (:C_COUNT_CANCELADAS / :C_COUNT_TOTAL_CANCELADAS) * 100;
            end

            suspend;
        end
    end
    else
    begin
        C_DESC_EMPRESA = :I_DESC_EMPRESA;

        select count(C_COD_PROPOSTA)
        from PO0100
        where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
              and C_COD_EMPRESA = :I_COD_EMPRESA
        into :C_COUNT_TOTAL_EMITIDAS;
        select count(C_COD_PROPOSTA)
        from PO0100
        where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
              and C_COD_STATUS = ´AP´ and C_COD_EMPRESA = :I_COD_EMPRESA
        into :C_COUNT_TOTAL_APROVADAS;
        select count(C_COD_PROPOSTA)
        from PO0100
        where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
              and C_COD_STATUS = ´CA´ and C_COD_EMPRESA = :I_COD_EMPRESA
        into :C_COUNT_TOTAL_CANCELADAS;

        for select distinct C_COD_GRUPO, C_COD_SUB_GRUPO
            from PO0100
            into :C_COD_GRUPO, :C_COD_SUB_GRUPO
        do
        begin
            C_DESC = :C_COD_GRUPO || ´ - ´ || :C_COD_SUB_GRUPO;

            select count(C_COD_PROPOSTA)
            from PO0100
            where C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
                  and C_COD_SUB_GRUPO = :C_COD_SUB_GRUPO and C_COD_EMPRESA = :I_COD_EMPRESA
            into C_COUNT_EMITIDAS;
            select count(C_COD_PROPOSTA)
            from PO0100
            where C_COD_STATUS = ´AP´
                  and C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
                  and C_COD_SUB_GRUPO = :C_COD_SUB_GRUPO and C_COD_EMPRESA = :I_COD_EMPRESA
            into C_COUNT_APROVADAS;
            select count(C_COD_PROPOSTA)
            from PO0100
            where C_COD_STATUS = ´CA´
                  and C_DTA_EMISSAO_PROPOSTA between :I_DATA_INICIO and :I_DATA_FIM
                  and C_COD_SUB_GRUPO = :C_COD_SUB_GRUPO and C_COD_EMPRESA = :I_COD_EMPRESA
            into C_COUNT_CANCELADAS;

            C_PERC_CONVERT_SUB_GRUPO = 0;
            if (:C_COUNT_EMITIDAS > 0) then
            begin
                C_PERC_CONVERT_SUB_GRUPO = (:C_COUNT_APROVADAS / :C_COUNT_EMITIDAS) * 100;
            end

            C_PERC_EMITIDAS_TOTAL = 0;
            if (:C_COUNT_TOTAL_EMITIDAS > 0) then
            begin
                C_PERC_EMITIDAS_TOTAL = (:C_COUNT_EMITIDAS / :C_COUNT_TOTAL_EMITIDAS) * 100;
            end

            C_PERC_APROVADAS_TOTAL = 0;
            if (:C_COUNT_TOTAL_APROVADAS > 0) then
            begin
                C_PERC_APROVADAS_TOTAL = (:C_COUNT_APROVADAS / :C_COUNT_TOTAL_APROVADAS) * 100;
            end

            C_PERC_CANCELADAS_TOTAL = 0;
            if (:C_COUNT_TOTAL_CANCELADAS > 0) then
            begin
                C_PERC_CANCELADAS_TOTAL = (:C_COUNT_CANCELADAS / :C_COUNT_TOTAL_CANCELADAS) * 100;
            end

            suspend;
        end
   end
end


O relatório roda direitinho.. só tem um problema.. os dados de percentual (campos com PERC no nome) retonam sempre 0, mas existem dados para o cálculo..

alguém sabe o que está acontecendo ???

Agradeço a todos antecipadamente.

um abraço..


Cabelo

Cabelo

Curtidas 0
POSTAR