[firebase-br] Procedure

Gladiston Santana gladiston em vidy.com.br
Qui Set 12 11:51:16 -03 2013


Uma procedure só para um insert é um pouco de disperdicio, não?
Tente dar uma encorpada nela, juntando mais operações, ex:
create or alter procedure SP_CLIENTES (
    P_ACAO D_CODIGO30,
    P_ID_CLIENTE D_ROWID,
    P_RAZAO_SOCIAL D_NOMECOMPLETO = '',
    P_NOME_ALTERNATIVO D_NOMECOMPLETO = '',
    P_CNPJ D_CNPJ = '',
    P_RG D_RG = '',
    P_CPF D_CPF = '',
    P_ENDERECO D_ENDERECO = '',
    P_END_NUMERO D_END_NUMERO = '',
    P_END_COMPLEMENTO D_END_COMPLEMENTO = '',
    P_END_BAIRRO D_END_BAIRRO = '',
    P_END_CIDADE D_END_CIDADE = '',
    P_END_CEP D_END_CEP = '',
    P_END_ESTADO D_END_ESTADO = 'SP',
    P_END_PAIS D_END_PAIS = 'BRA',
    P_SUFRAMA D_SUFRAMA = '',
    P_OBSERVACAO D_MEMO = '',
    P_ATIVIDADE_PRINCIPAL D_CODIGO30 = '',
    P_ATIVIDADE_PRINCIPAL_DESC D_DESCRICAO = '',
    P_ATIVIDADE_SECUNDARIA D_CODIGO30 = '',
    P_ATIVIDADE_SECUNDARIA_DESC D_DESCRICAO = '',
    P_RESTRICAO_FINANCEIRA D_RESPOSTA = 'N',
    P_SE_CLIENTE D_RESPOSTA = 'N',
    P_END_ESTRANGEIRO1 D_ENDERECO = '',
    P_END_ESTRANGEIRO2 D_ENDERECO = '',
    P_END_ESTRANGEIRO3 D_ENDERECO = '',
    P_STATUS D_STATUS = 'A')
returns (
    RESULT_VALUE D_ROWID)
as
declare variable NEXT_ID integer = 0;
declare variable RESULT_ESTATISTICA integer = 0;
declare variable P_SE_ESTRANGEIRO D_RESPOSTA = 'N';
declare variable LRAZAO_SOCIAL D_NOMECOMPLETO = '';
declare variable LSOMA_RECEBIDO D_VALOR2 = 0;
begin
  result_value=0;
  next_id=0;
  if (:p_acao not in ('INCLUIR','ALTERAR','EXCLUIR',
'PARALIZAR','CANCELAR','ATIVAR','RANKING')) then
  begin
    exception ERR 'Ação solicitada ('||:p_acao||') fora dos parametros
permitidos !';
    suspend;
    exit;
  end

  /* Quando o CNPJ e INSC.Estadual estiver preenchido, entao o RG e CPF
devem estar brancos */
  if (:p_cnpj<>'')  then
  begin
    p_rg='';
    p_cpf='';
  end

  /* Quando o RG e CPF estiver preenchido, entao o CNPJ e INSC.Estadual
devem estar brancos */
  if ((:p_rg<>'') and (:p_cpf<>'')) then
  begin
    p_cnpj='';
  end

  /* verifica se é estrangeiro ou nao, caso seja alguns campos devem ser
limpos e vice-versa */
  if (:p_end_pais<>'BRA') then
  begin
    p_se_estrangeiro ='S';
    p_cnpj='';
    p_cpf='';
    p_rg='';
    p_endereco='';
    p_end_numero='';
    p_end_complemento='';
    p_end_bairro='';
    p_end_cidade='';
    p_end_cep='';
    p_end_estado='**';
    p_atividade_principal='';
    p_atividade_principal_desc='';
    p_atividade_secundaria='';
    p_atividade_secundaria_desc='';
    p_suframa='';
  end
  else
  begin
    p_end_estrangeiro1='';
    p_end_estrangeiro2='';
    p_end_estrangeiro3='';
  end
  if (:p_acao='INCLUIR') then
  begin
    next_id=0;
    /* Buscando o no. do id */
    select coalesce(max(id_cliente),0) from clientes
    into :next_id;

    next_id=:next_id+1;
    insert into clientes(
      id_cliente,
      razao_social,
      nome_alternativo,
      ranking,
      cnpj,
      cpf,
      rg,
      endereco,
      end_numero,
      end_complemento,
      end_bairro,
      end_cidade,
      end_cep,
      end_estado,
      end_pais,
      end_estrangeiro1,
      end_estrangeiro2,
      end_estrangeiro3,
      atividade_principal,
      atividade_principal_desc,
      atividade_secundaria,
      atividade_secundaria_desc,
      suframa,
      observacao,
      restricao_financeira,
      se_cliente,
      se_estrangeiro,
      excluir_codigo,
      last_update,
      last_owner,
      status)
    values(
      :next_id,
      :p_razao_social,
      :p_nome_alternativo,
      0,
      :p_cnpj,
      :p_cpf,
      :p_rg,
      :p_endereco,
      :p_end_numero,
      :p_end_complemento,
      :p_end_bairro,
      :p_end_cidade,
      :p_end_cep,
      :p_end_estado,
      :p_end_pais,
      :p_end_estrangeiro1,
      :p_end_estrangeiro2,
      :p_end_estrangeiro3,
      :p_atividade_principal,
      :p_atividade_principal_desc,
      :p_atividade_secundaria,
      :p_atividade_secundaria_desc,
      :p_suframa,
      :p_observacao,
      :p_restricao_financeira,
      :p_se_cliente,
      :p_se_estrangeiro,
      '',
      current_time,
      current_user,
      'A');
      -- atualiza estatistica de uso desse cliente
      execute procedure SP_ESTATISTICAS 'CLIENTES',:next_id
returning_values :result_estatistica;
      result_value=:next_id;
  end
  if (:p_acao='ALTERAR') then
  begin
    update clientes
    set razao_social=:p_razao_social,
        nome_alternativo=:p_nome_alternativo,
        cnpj=:p_cnpj,
        cpf=:p_cpf,
        rg=:p_rg,
        endereco=:p_endereco,
        end_numero=:p_end_numero,
        end_complemento=:p_end_complemento,
        end_bairro=:p_end_bairro,
        end_cidade=:p_end_cidade,
        end_cep=:p_end_cep,
        end_estado=:p_end_estado,
        end_pais=:p_end_pais,
        end_estrangeiro1=:p_end_estrangeiro1,
        end_estrangeiro2=:p_end_estrangeiro2,
        end_estrangeiro3=:p_end_estrangeiro3,
        atividade_principal=:p_atividade_principal,
        atividade_principal_desc=:p_atividade_principal_desc,
        atividade_secundaria=:p_atividade_secundaria,
        atividade_secundaria_desc=:p_atividade_secundaria_desc,
        suframa=:p_suframa,
        observacao=:p_observacao,
        restricao_financeira=:p_restricao_financeira,
        se_cliente=:p_se_cliente,
        se_estrangeiro=:p_se_estrangeiro,
        last_update=current_time,
        last_owner=current_user,
        status=:p_status
    where id_cliente=:p_id_cliente;

    -- atualiza estatistica de uso desse cliente
    execute procedure SP_ESTATISTICAS 'CLIENTES',:p_id_cliente
returning_values :result_estatistica;

    result_value=:p_id_cliente;
  end
  if (:p_acao='EXCLUIR') then
  begin
    select count(*) from clientes_contatos
    where id_cliente=:p_id_cliente
    into :next_id;
    if (:next_id > 0) then
    begin
      EXCEPTION ERR 'Não posso eliminar um cliente enquanto houver contatos
relacionados a ele !';
      suspend;
      exit;
    end
    delete from internet_emails
    where id_cliente=:p_id_cliente;
    delete from internet_sites
    where id_cliente=:p_id_cliente;
    delete from telefones
    where id_cliente=:p_id_cliente;
    delete from clientes_assuntos
    where id_cliente=:p_id_cliente;
    delete from clientes_caracteristicas
    where id_cliente=:p_id_cliente;
    delete from clientes_ramos_atividade
    where id_cliente=:p_id_cliente;
    delete from clientes
    where id_cliente=:p_id_cliente;
    -- remove estatistica de uso desse cliente
    execute procedure SP_ESTATISTICAS 'CLIENTES',:next_id,'','EXCLUIR'
returning_values :result_estatistica;
    result_value=:p_id_cliente;
  end

  if (:p_acao='RANKING') then
  begin
    execute procedure SP_CLIENTES_RANKING returning_values
:next_id,:lrazao_social,:lsoma_recebido;
  end

  suspend;
end


Em 12 de setembro de 2013 10:51, Marcelo Borges <
borgesmarcelo em rocketmail.com> escreveu:

> Galera estou estudando sobre firebid e me enrosquei em procedure
> estou tentando fazer esta sp de insert e para no end : alguém sabe me
> dizer o que está errado?
>
>
> create or alter procedure grava_clientes(
>  pnome varchar(100),
>  prg   varchar(20),
>  pcpf varchar(20),
>  pcnpj varchar(20),
>  pincricao varchar(50),
>  prazao
> varchar(50),
>  pendereco varchar(50),
>  pnumero varchar(6),
>  pcomplemento varchar(50),
>  pbairro varchar(50),
>  pcidade varchar(50),
>  pestado varchar(2),
>  pcep varchar(20),
>  ptelefone varchar(20),
>  pcelular varchar(20),
>  pemail varchar(50),
>  pvalorcredito decimal(15,2),
>  pdatainclusao date,
>  pativo char(1),
>  pusuario varchar(20),
>  pobservacao varchar(250))
>  as
>  begin
>     insert into clientes(nomeclienteempresa,
>                           rg,
>                           cpf,
>                           cnpj,
>                           incricaoestadual,
>                           razaosocial,
>                           endereco,
>                           numero,
>                           complemento,
>                           bairro,
>                           cidade,
>                           estado,
>                           cep,
>                           telefone,
>                           celular,
>                           email,
>                           valorcredito,
>                           datainclusao,
>                           ativo,
>                           usuario,
>                           observacao )
>                  values(
>                         :pnome,
>                         :prg,
>                         :pcpf,
>                         :pcnpj,
>                         :pincricao,
>                         :prazao,
>                         :pendereco,
>                         :pnumero,
>                         :pcomplemento,
>                         :pbairro,
>                         :pcidade,
>                         :pestado,
>                         :pcep,
>                         :ptelefone,
>                         :pcelular,
>                         :pemail,
>                         :pvalorcredito,
>                         :pdatainclusao,
>                         :pativo,
>                         :pusuario,
>                         :pobservacao)
> end --- da erro nesta linha e ja pesquisei e não sei como fazer(Dynamic
> SQL Error.SQL error code = -104.Token unknown
> -line 69, char 1.
> end.
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista