Executar Procedimentos do FireBird

Olá,

Amigos, como faço para executar um procedimento do FireBird no Scriptcase. Existe um exemplo no site do scriptcase mas não me atendeu.

A estrutura é que para ele mostrar o resultado, temos que digitar o Ano, dai ele mostrar o relatorio.

Como posso fazer isso?

Primeiro montar a SQL que você quer no seu gerenciador de Firebird preferido, na SQL colocar o comando junto aos campos: EXTRACT(YEAR FROM DataVenda) as AnoVenda,

Ai copie toda a SQL para criar uma consulta no SC, e no Filtro escolha esse campo: AnoVenda, pronto só testar que vai funcionar.

Não entendi,
Tem cmo vc colocar um exemplo de codigo…??

Qual o programa que você usa para gerenciar sua base de dados? criar tabelas, etc? ou não usa nada? nunca usou e nunca fez um SQL?

Exemplo programa: IbExpert: http://www.ibexpert.net/ibe/

Ai você monta sua SQL normal e adiciona a extração da data neste SQL depois só copiar para o SC em uma nova Grid e usar esse ano extraído no filtro do SC.

Amigão, ja fiz…

Onde eu coloco essa procedure??

Segue minha “Procedure”.

Nome.: PROC_REL_FREQUENCIA_CELULA

=========================================

begin

for
select c.id,c.nome
from celulas c
into :celula_id,:celula_nome
do
begin
celula = celula_id||’-’||celula_nome;

mes = 1;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

jan_a = 0; jan_p = 0; jan_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    jan_p = (jan_p + 1);
  end
  else
  begin
    jan_v = (jan_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
jan_a = (:v_total_alunos - :jan_p);


mes = 2;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

fev_a = 0; fev_p = 0; fev_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    fev_p = (fev_p + 1);
  end
  else
  begin
    fev_v = (fev_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
fev_a = (:v_total_alunos - :fev_p);


mes = 3;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

mar_a = 0; mar_p = 0; mar_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    mar_p = (mar_p + 1);
  end
  else
  begin
    mar_v = (mar_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
mar_a = (:v_total_alunos - :mar_p);

mes = 4;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

abr_a = 0; abr_p = 0; abr_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    abr_p = (abr_p + 1);
  end
  else
  begin
    abr_v = (abr_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
abr_a = (:v_total_alunos - :abr_p);

mes = 5;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

mai_a = 0; mai_p = 0; mai_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    mai_p = (mai_p + 1);
  end
  else
  begin
    mai_v = (mai_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
mai_a = (:v_total_alunos - :mai_p);

mes = 6;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

jun_a = 0; jun_p = 0; jun_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    jun_p = (jun_p + 1);
  end
  else
  begin
    jun_v = (jun_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
jun_a = (:v_total_alunos - :jun_p);

mes = 7;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

jul_a = 0; jul_p = 0; jul_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    jul_p = (jul_p + 1);
  end
  else
  begin
    jul_v = (jul_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
jul_a = (:v_total_alunos - :jul_p);

mes = 8;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

ago_a = 0; ago_p = 0; ago_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    ago_p = (ago_p + 1);
  end
  else
  begin
    ago_v = (ago_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
ago_a = (:v_total_alunos - :ago_p);

mes = 9;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

set_a = 0; set_p = 0; set_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    set_p = (set_p + 1);
  end
  else
  begin
    set_v = (set_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
set_a = (:v_total_alunos - :set_p);

mes = 10;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

out_a = 0; out_p = 0; out_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    out_p = (out_p + 1);
  end
  else
  begin
    out_v = (out_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
out_a = (:v_total_alunos - :out_p);

mes = 11;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

nov_a = 0; nov_p = 0; nov_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    nov_p = (nov_p + 1);
  end
  else
  begin
    nov_v = (nov_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
nov_a = (:v_total_alunos - :nov_p);

mes = 12;
-- prepara a data de inicio
data_inicio = cast(''||:mes||'/01/'||ano||'' as date);
-- captura data final
select dateadd(-extract(day from dateadd(1 month to :data_inicio )) day to
       dateadd(1 month to :data_inicio)) last_day from rdb$database
into :data_fim;

dez_a = 0; dez_p = 0; dez_v = 0;
for
  select x.id_participante from celulas_reuniao_presenca x
  where x.id_celula = :celula_id
  and x.data_reuniao between :data_inicio and :data_fim
  into :v_id_pessoa
do
begin
  if (exists(select y.id_pessoa from celulas_participantes y
             where y.id_pessoa = :v_id_pessoa)) then
  begin
    dez_p = (dez_p + 1);
  end
  else
  begin
    dez_v = (dez_v + 1);
  end
end

select count(w.id_pessoa)  from celulas_participantes w
where w.id_celula = :celula_id
into v_total_alunos;
dez_a = (:v_total_alunos - :dez_p);

suspend;

end
end

================================================

Dai ele vai pedir o “Ano”…

Onde eu coloco isso no scriptcase…?

Você pode chamar a rotina assim:

$sql="
call PROC_REL_FREQUENCIA_CELULA()
";

sc_exec_sql($sql);

Ou se quiser passar um parâmetro assim:
$sql="
call PROC_REL_FREQUENCIA_CELULA({AnoPesquisa})
";

sc_exec_sql($sql);

Uma Observação importante no SC você pode chamar as funções, procedures, mas só use elas para fazer os cálculos, e grave-os em uma tabela temporária,
depois você vai usar esta tabela temporária ou view em uma consulta para mostrar esses valores, o SC não vai mostrar Diretamente os SELECTS da sua Procedure.

A Chamada da Procedure você pode colocar no Evento: OnValidate do Filtro de uma consulta (Grid), ai já coloca um campo pedindo o ano e passa a variável do campo,
para a procedure, ele executa e já mostra o resultado na mesma Grid usando uma tabela temporária ou view.

Kleber Almeida,

As dicas e sugestões do colega Jailton resolveram o seu problema? Se sim, como é que foi resolvido, compartilhe pois temos interesse em saber.

Antecipadamente agradecido.