Osvaldo,
Não, o cast ali (vData :=(now() + (i||' minutes')::interval) as time;) a variavel deveria pegar o agora mais o interval em minutos (exemplo agora=data hoje + 09:00 + intervalo de i minutos). Já aqui (if cast(vData as time)<='18:00:00'), ai sim, se pegando somente o horario da variavel e for igual ou superior a 18h ignore o bloco de comando. 2009/4/16 Rubens José Rodrigues <rubens.rodrigues <https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral> em batistarepresentacoes.com>: > > 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 Pessoal, 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; 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; Conto com a ajuda de vocês, Att. ---------------------------------------------------------------------------- Rubens José Rodrigues T.I, Analista de Suporte Tel: (27)3399-6419 / (27)9969-8081 [email protected] ---------------------------------------------------------------------------- Broker Nestlé do Brasil S/A Rua José Ramos de Oliveira, 91, 29111-280 Nossa Senhora da Penha, Vila Velha, ES (27)3399-6400 / (27)9975-0140
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
