2009/4/16 Rubens José Rodrigues <[email protected]>:

>
> Estou com um pequeno problema (que está me tirando o sono), por favor,
> ajudem-me.
>
> Cenário: PostgreSQL 8.3.6 on x86_64-pc-linux-gnu, compiled by GCC
> gcc-4.3.real (Ubuntu 4.3.2-1ubuntu12) 4.3.2.
>
> Problema: A função abaixo “deveria” organizar uma tabela de agendamento
> (somente o horário), porém quando “chamo” a function ela coloca qualquer
> horário menos o atual mais o intervalo, somente depois da terceira ou quarta
> tentativa é que funciona.
>
> O cliente pode ser tanto o Delphi, quanto o psql, quanto outro qualquer que
> o problema persiste.
>
> Abaixo segue a função, observem que existe um parâmetro de entrada (não o
> uso por enquanto).
>
> Repetindo, supondo que existam horários na agenda (registros) nos horários
> de 8h, 9h, 10h e agora são 12h e “chamo” a function para atualizar a agenda
> para reordenar por exemplo o que é 8h passaria para 12:10h (devido ao
> intervalo) e assim por diante, mas, o sistema coloca qualquer horário menos
> o que deveria ser (agora now()).
>
>
> CREATE OR REPLACE FUNCTION "public"."fnc_titulovenc_controle_agenda"
> ("eCodCli" integer) RETURNS boolean AS
>
> $body$
>
> DECLARE
>        -- Cursor para registros da agenda
>        _Registro cursor for  select codcli,
>                                     data
>                                from titulosvenc_agenda
>                               where cast(data as date)=current_date
>                                 and horafim is null
>                                 and automatico='S'
>                               order by data asc;
>
>        -- Variavel que recebera o resultset do cursor
>        Registro record;
>
>        -- Variavel para intervalo de tempo em minutos
>        i integer;
>
>        -- Valor de referencia para o horario de fim
>        vData timestamp;
>
> BEGIN
>
>  -- Determinando o intervalo
>  i:=10;
>
>  -- Abrindo o cursor
>  open _Registro;
>  loop
>    fetch _Registro into Registro;
>    exit when not found;
>
>    vData :=(now() + (i||' minutes')::interval) as time;

Creio que com este cast você está armazenando em vData apenas a hora,
min, seg etc do dia, você está desprezando a parte referente a data, é
isto mesmo?

Recomenda-se fazer: i*'1 minute'::interval.


>
>    if cast(vData as time)<='18:00:00' then
>
>      -- Atualizando a agenda
>      update titulosvenc_agenda
>         set data= vData
>       where codcli=registro.codcli
>         and cast(data as date)=current_date;
>
>      -- Atualizando a folha de rosto de cobrança
>      update titulosvenc set dataagenda=vData where codcli=registro.codcli;
>    end if;
>    i:=i+10;
>  end loop;
> close _Registro;
> return true;
> END;
> $body$
> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a