CREATE OR ALTER function FN_ESTOQUE_SALDO_DIARIO_DISP (
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    DATA DATE)
returns numeric(18,5)
AS
DECLARE VARIABLE RET NUMERIC(18,5);
BEGIN

    SELECT FIRST 1
            ((CASE :TAMANHO
            WHEN 00 THEN A.SALDO
            WHEN 01 THEN A.T01
            WHEN 02 THEN A.T02
            WHEN 03 THEN A.T03
            WHEN 04 THEN A.T04
            WHEN 05 THEN A.T05
            WHEN 06 THEN A.T06
            WHEN 07 THEN A.T07
            WHEN 08 THEN A.T08
            WHEN 09 THEN A.T09
            WHEN 10 THEN A.T10
            WHEN 11 THEN A.T11
            WHEN 12 THEN A.T12
            WHEN 13 THEN A.T13
            WHEN 14 THEN A.T14
            WHEN 15 THEN A.T15
            WHEN 16 THEN A.T16
            WHEN 17 THEN A.T17
            WHEN 18 THEN A.T18
            WHEN 19 THEN A.T19
            WHEN 20 THEN A.T20
            ELSE 0 END) -
            COALESCE((SELECT SUM(EA.QUANTIDADE)
                        FROM TBESTOQUE_SALDO_ALOCACAO EA
                       WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                         AND EA.LOCALIZACAO_ID     = A.LOCALIZACAO_CODIGO
                         AND EA.PRODUTO_ID         = A.PRODUTO_CODIGO
                         AND EA.TAMANHO            = :TAMANHO),0)) SALDO
    FROM
        TBESTOQUE_SALDO_DIARIO A
    WHERE
        A.ESTABELECIMENTO_CODIGO    = :ESTABELECIMENTO_ID
    AND A.LOCALIZACAO_CODIGO        = :LOCALIZACAO_ID
    AND A.PRODUTO_CODIGO            = :PRODUTO_ID
    AND A.DATA                      = :DATA
    INTO RET;

    RET = COALESCE(RET,0);


  RETURN RET;
END;