Publicado por: Gustavo Henrique | Abril 17, 2008

Stored Procedure no Firebird utilizando Vários Recursos.

CREATE PROCEDURE SP_MEDIA_INCLUITE
AS
DECLARE VARIABLE DATAINICIAL DATE;
DECLARE VARIABLE PREFIXO VARCHAR(5);
DECLARE VARIABLE TIPO VARCHAR(6);
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE KMINICIAL NUMERIC(18,2);
DECLARE VARIABLE KMFINAL NUMERIC(18,2);
DECLARE VARIABLE MEDIA NUMERIC(18,2);
DECLARE VARIABLE COMBUSTIVELQTD NUMERIC(18,2);
DECLARE VARIABLE COMBUSTIVELVLR NUMERIC(18,2);
DECLARE VARIABLE GRAXAQTD NUMERIC(18,2);
DECLARE VARIABLE MANUTENCAOVLR NUMERIC(18,2);
DECLARE VARIABLE LUBRIFACANTEQTD NUMERIC(18,2);
DECLARE VARIABLE FILTROQTD NUMERIC(18,2);
DECLARE VARIABLE FILTROVLR NUMERIC(18,2);
DECLARE VARIABLE MAQUINAVEICULO VARCHAR(1);
DECLARE VARIABLE OBSERVACAO VARCHAR(200);
DECLARE VARIABLE RESPONSAVEL VARCHAR(100);
DECLARE VARIABLE HORAKM NUMERIC(18,2);
DECLARE VARIABLE IMPORTACAO INTEGER;
DECLARE VARIABLE DATAFINAL DATE;
BEGIN
/*
 PONTOS IMPORTANSSIMOS : ERROS QUE NÃO PODERÍAM DAR
 MEDIA, MEDIALEVES, MEDIAPESADOS COM 0;
 KMINICIAL E KMFINAL IGUAIS;
 QTDCOMBUSTIVEL 0;
*/
  FOR
    SELECT PREFIXO, DATA FROM IMPORTACAO INTO :P REFIXO, :D ATA
  DO
  BEGIN
    FOR
        SELECT PREFIXO, TIPO, DATA, KMFINAL, OBSERVACAO, RESPONSAVEL
        FROM MEDIAINTERMEDIARIA
        WHERE  PREFIXO = :P REFIXO AND DATA > :D ATA  AND (COALESCE(MEDIALEVES,0) <> 0)
        ORDER BY 1,3
        INTO :P REFIXO, :TIPO, :D ATAFINAL, :KMFINAL, :OBSERVACAO, :RESPONSAVEL
    DO
    BEGIN
        SELECT FIRST 1 DATA FROM MEDIAINTERMEDIARIA
        WHERE PREFIXO = :P REFIXO AND DATA < :D ATAFINAL AND (COALESCE(MEDIALEVES,0) <> 0)
        ORDER BY DATA DESC INTO :D ATAINICIAL;
 
        IF (DATAINICIAL IS NULL) THEN
        BEGIN
            DATAINICIAL = DATAFINAL;
        END
 
        IF (DATAINICIAL <> DATAFINAL) THEN
        BEGIN
           DATAINICIAL = DATAINICIAL + 1;
        END
 
        SELECT SUM(MEDIA) AS MEDIA, SUM(COMBUSTIVELQTD) AS COMBUSTIVELQTD, SUM(COMBUSTIVELVLR) AS COMBUSTIVELVLR, SUM(GRAXAQTD) AS GRAXAQTD, SUM(MANUTENCAOVLR) AS MANUTENCAOVLR, SUM(LUBRIFACANTEQTD) AS LUBRIFACANTEQTD, SUM(FILTROQTD) AS FILTROQTD, SUM(FILTROVLR) AS FILTROVLR
        FROM MEDIAINTERMEDIARIA
        WHERE PREFIXO = :P REFIXO AND DATA >= :D ATAINICIAL AND DATA <= :D ATAFINAL
        INTO :MEDIA, :COMBUSTIVELQTD, :COMBUSTIVELVLR, :GRAXAQTD, :MANUTENCAOVLR, :LUBRIFACANTEQTD, :FILTROQTD, :FILTROVLR;
 
        SELECT MIN(KMINICIAL)
        FROM MEDIAINTERMEDIARIA
        WHERE PREFIXO = :P REFIXO AND DATA = :D ATAINICIAL
        INTO :KMINICIAL;
        IF ((COALESCE(KMINICIAL,0) = 0) OR (KMINICIAL IS NULL)) THEN
        BEGIN
            SELECT MIN(KMFINAL)
            FROM MEDIAINTERMEDIARIA
            WHERE PREFIXO = :P REFIXO AND DATA = :D ATAINICIAL – 1
            INTO :KMINICIAL;
        END
        IF ((COALESCE(KMINICIAL,0) <> 0) AND (COALESCE(KMFINAL,0) <> 0) AND (COALESCE(COMBUSTIVELQTD,0) <> 0) AND ( (COALESCE(KMINICIAL,0) – COALESCE(KMFINAL,0) <> 0))  ) THEN
        BEGIN
            IF (TIPO = ‘L’) THEN
                MEDIA = COALESCE( (KMFINAL – KMINICIAL) / COMBUSTIVELQTD, 0 );
            IF (TIPO = ‘P’) THEN
                MEDIA = COALESCE( COMBUSTIVELQTD / (KMFINAL – KMINICIAL), 0 );
        END
        ELSE
        BEGIN
            MEDIA = 0;
        END
        EXECUTE PROCEDURE SP_MEDIA_INCLUI ( :P REFIXO, :D ATAINICIAL, :D ATAFINAL, MEDIA, :KMINICIAL, :KMFINAL, :COMBUSTIVELVLR, :GRAXAQTD, :MANUTENCAOVLR, :COMBUSTIVELQTD, :LUBRIFACANTEQTD, :KMFINAL – :KMINICIAL, :FILTROQTD, :FILTROVLR, :TIPO);
 
        SELECT COALESCE(COUNT(*),0) FROM IMPORTACAO WHERE PREFIXO = :P REFIXO INTO :IMPORTACAO;
        IF (IMPORTACAO = 0) THEN
        BEGIN
            INSERT INTO IMPORTACAO ( PREFIXO, DATA) VALUES (:PREFIXO,:DATA);
        END
        ELSE
        BEGIN
          UPDATE IMPORTACAO
          SET  DATA = :D ATAFINAL
          WHERE (PREFIXO = :P REFIXO);
        END
   /*     DELETE FROM MEDIA WHERE PREFIXO = :P REFIXO AND (MEDIA = 0 OR MEDIA IS NULL OR MEDIA < 0);*/
 /*       DELETE FROM MEDIAINTERMEDIARIA WHERE PREFIXO = :P REFIXO;*/
    END
  END
  DELETE FROM MEDIA WHERE MEDIA = 0 OR MEDIA IS NULL OR MEDIA < 0;
  DELETE FROM MEDIAINTERMEDIARIA;
END


Deixe uma resposta

Sua resposta:

Categorias