Olá,

2009/12/21 Rudinei Dias <[email protected]>

> *A função completa (FUNCIONAL)*
>
> -- DROP FUNCTION fn_verifica_lcto_ficha_avaliacao(integer, integer,
> integer);
>
> CREATE OR REPLACE FUNCTION fn_verifica_lcto_ficha_avaliacao(
>   INOUT pCodTurma integer, INOUT pCodDisciplina integer, INOUT
> pCodProfessor integer,
>   OUT oPercLancadoB1 numeric, OUT oPercLancadoB2 numeric,
>   OUT oPercLancadoB3 numeric, OUT oPercLancadoB4 numeric
>   )
>   RETURNS SETOF record AS
> $BODY$DECLARE
>  recTurma RECORD;  -- para utilização em consultas
>  recLctos RECORD;  -- para utilização em consultas
>  vCont    INTEGER;
> BEGIN
>   -- ESTA FUNÇÃO VERIFICA A SITUAÇÃO DE PENDÊNCIA DO MODELO DE AVALIACAO NO
> PLANO DE ENSINO
>   -- com a especificação que é só para um bimestre em específico
>   select t.*
>     into recTurma
>   from sie_turma_disciplinaxprofessor td
>     join turmas t on td.cod_turma=t.cod_turma
>   where t.cod_turma=pCodTurma
>    and td.cod_disciplina=pCodDisciplina
>    and td.cod_professor=pCodProfessor
>   limit 1;
>
>   -- select td.*, t.* from sie_turma_disciplinaxprofessor td join turmas t
> on td.cod_turma=t.cod_turma where t.cod_turma=1859 and td.cod_disciplina=496
> and td.cod_professor=84;
>   if not found then
>     RAISE NOTICE 'Turma não localizada';
>     return;
>   end if;
>   RAISE NOTICE 'Turma localizada % % %', recTurma.cod_curso,
> recTurma.sedi_ano, recTurma.sedi_mes;
>
>   vCont:=0;
>   for recLctos IN
>     select avg(
>       case
>          when sfar_av_nc='S' then 1
>          when sfar_nota is not null then 1
>          else 0 end
>       )*100
>        as lancada
>        , pa.spensa_bimestre
>       -- , fr.*,  ta.*,   pa.* --, pe.*
>     from sie_planos_ensino pe
>      join turma_alunos ta
>        on pe.cod_turma=ta.cod_turma and pe.cod_disciplina=ta.cod_disciplina
> and ativo='S'
>      left outer join sie_planos_ensino_avaliacao pa
>        on pe.spens_id=pa.spens_id
>      left outer join sie_ficha_avaliacao_registro fr
>        on pa.spens_id=fr.spens_id and pa.spensa_bimestre=fr.spensa_bimestre
>        and pa.spensa_tipo=fr.spensa_tipo and
> pa.spensa_data_prevista_seq=fr.spensa_data_prevista_seq
>        and ta.cod_turma_aluno=fr.cod_turma_aluno
>     where pe.cod_disciplina=pCodDisciplina
>      and pe.cod_professor=pCodProfessor
>      and pe.cod_curso=recTurma.cod_curso
>      and pe.sedi_ano=recTurma.sedi_ano
>      and pe.sedi_mes=recTurma.sedi_mes
>      -- and ta.cod_turma_aluno=159607
>     group by 2
>     order by 2
>   loop
>     if recLctos.spensa_bimestre = 1 then
>       oPercLancadoB1:=trunc(recLctos.lancada,1);
>     end if;
>     if recLctos.spensa_bimestre = 2 then
>       oPercLancadoB2:=trunc(recLctos.lancada,1);
>     end if;
>     if recLctos.spensa_bimestre = 3 then
>       oPercLancadoB3:=trunc(recLctos.lancada,1);
>     end if;
>     if recLctos.spensa_bimestre = 4 then
>       oPercLancadoB4:=trunc(recLctos.lancada,1);
>     end if;
>     vCont:=vCont+1;
>   end loop;
>   return next;
>   RAISE NOTICE ' Encontrados %',vCont;
>
> END;$BODY$
>   LANGUAGE 'plpgsql' VOLATILE;
>
>
> *A consulta completa (sem o join com a função e com a devida alteração no
> group by a consulta é funcional e está correta)*
>
> select
>
> 'cadLancNotas.php?semestre='||t.sedi_ano||'-'||t.sedi_mes||'&codProfessor='||d.cod_professor||'&codTurma='||t.cod_turma||'&codDisciplina='||d.cod_disciplina||'&action=LISTA_TURMAS'
> as link,
>      e.sedi_ano, e.sedi_mes, e.sedi_periodo_identificacao, p.nome,
> c.cod_curso, c.curso,
>     di.cod_disciplina, di.disciplina, t.turma, t.cod_turma, c.num_medias,
> count(ta.matricula) as matriculas,
>      case when c.num_medias >0 then to_char(sum(case when nota_m1 is null
> then 0 else 1 end),'9999') else '-' end as n1,
>      case when c.num_medias >1 then to_char(sum(case when nota_m2 is null
> then 0 else 1 end),'9999') else '-' end as n2,
>      case when c.num_medias >2 then to_char(sum(case when nota_m3 is null
> then 0 else 1 end),'9999') else '-' end as n3,
>      case when c.num_medias >3 then to_char(sum(case when nota_m4 is null
> then 0 else 1 end),'9999') else '-' end as n4,
>      case when c.num_medias >4 then to_char(sum(case when nota_m5 is null
> then 0 else 1 end),'9999') else '-' end as n5,
>      sum(case when aprovado='0' and fez_exame<>'S' then 1 else 0 end) as
> a_fazer_exame,
>      sum(case when fez_exame='S' then 1 else 0 end) as ja_fez_exame,
>      sum(case when aprovado='1' then 1 else 0 end) as aprovados ,
>      f.*
>   from sie_edicao e
>     JOIN turmas t
>     ON e.sedi_ano=t.sedi_ano and e.sedi_mes=t.sedi_mes and
> e.cod_curso=t.cod_curso
>       JOIN turma_disciplinas d
>       ON t.cod_turma=d.cod_turma
>         JOIN professores p
>         ON d.cod_professor=p.cod_professor
>           JOIN disciplinas di
>           ON d.cod_disciplina=di.cod_disciplina
>             JOIN cursos c
>             ON e.cod_curso=c.cod_curso
>               JOIN turma_alunos ta
>               ON d.cod_turma=ta.cod_turma and
> d.cod_disciplina=ta.cod_disciplina
>                 LEFT OUTER JOIN notas n
>                 ON t.cod_curso=n.cod_curso and ta.matricula=n.matricula and
> ta.cod_disciplina=n.cod_disciplina
>                   -- LEFT OUTER JOIN
> fn_verifica_lcto_ficha_avaliacao(t.cod_turma,di.cod_disciplina,d.cod_professor)
> f
>
>                   -- LEFT OUTER JOIN
> fn_verifica_lcto_ficha_avaliacao(t.cod_turma,di.cod_disciplina,d.cod_professor)
> f on f.pCodDisciplina=t.cod_turma and f.pCodTurma=di.cod_disciplina and
> f.pCodProfessor=d.cod_professor
>                   --LEFT OUTER JOIN
> fn_verifica_lcto_ficha_avaliacao(t.cod_turma,di.cod_disciplina,d.cod_professor)
> f on f.pCodDisciplina=t.cod_turma and f.pCodTurma=di.cod_disciplina and
> f.pCodProfessor=d.cod_professor
>                   -- LEFT OUTER JOIN
> fn_verifica_lcto_ficha_avaliacao(1726,496,84) f on
> f.pCodDisciplina=t.cod_turma and f.pCodTurma=di.cod_disciplina and
> f.pCodProfessor=d.cod_professor
>
>                   LEFT OUTER JOIN fn_verifica_lcto_ficha_avaliacao() f on
> f.pCodDisciplina=t.cod_turma and f.pCodTurma=di.cod_disciplina and
> f.pCodProfessor=d.cod_professor
>  where  to_date('15/12/2009','dd/mm/yyyy') between e.sedi_dt_inicio_edicao
> and e.sedi_dt_final_edicao
>  and e.cod_curso = 9
>  and ta.ativo='S'
>   group by 1, e.sedi_ano, e.sedi_mes, e.sedi_periodo_identificacao,
> c.cod_curso, c.curso, p.nome, di.cod_disciplina, di.disciplina, t.turma,
> t.cod_turma, c.num_medias,
>   pCodTurma, pCodDisciplina, pCodProfessor, oPercLancadoB1, oPercLancadoB2,
> oPercLancadoB3, oPercLancadoB4
>   order by e.sedi_ano, e.sedi_mes, e.sedi_periodo_identificacao,
> c.cod_curso, c.curso, p.nome, di.cod_disciplina, di.disciplina, t.turma
>
> Pelo que percebi você está passando para a função dados de uma tabela como
> parâmetro de entrada e isso não vai dar certo, a menos que você processe
> primeiro a consulta da tabela e o resultado seja passado como parâmetro para
> a função.
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

[]s
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a