[firebase-br] Ajuda Stored Procedure

Julio F. Figueiredo tuskinhu em gmail.com
Ter Jul 12 09:34:48 -03 2016


Eu faço direto no where, adotando valores default pra nao usar, segue um
pedaço do where:

        ((:EMISSAOI is null) or ((NF.EMISSAO >= :EMISSAOI) and (NF.EMISSAO
<= :EMISSAOF))) and
        ((:REQUISITANTE_SEL = 0) or (NF.REQUISITANTE = :REQUISITANTE_SEL))
and
        ((:USUARIO_SEL = 0) or (PEDIDOSCG.USUARIO = :USUARIO_SEL)) and
        ((:SITUACAOCG_SEL = '') or (NF.SITUACAOCG = :SITUACAOCG_SEL))

Então se por ex, passar null no parametro :EMISSAOI, irei ignorar a
clausula inteira da data, é como se "((:EMISSAOI is null) or ((NF.EMISSAO
>= :EMISSAOI) and (NF.EMISSAO <= :EMISSAOF))) " não existisse no where, o
mesmo com :REQUISITANTE_SEL, se for 0, ignoro a clausula e por ai vai, foi
uma maneira que encontramos pra não ficar fazendo ifs doidos pra montar um
where



________________________________________
Att,
*Julio F. Figueiredo*
*Analista de Sistemas*

Em 12 de julho de 2016 08:44, Itauto CPD <cpd em itauto.com.br> escreveu:

> Exemplo Rápido ... Não sei se é certo essa forma . ate acho que talvez
> tinha visto algo que o pessoal andou comentando, que vc montar com blobs ,
> consumia muita memória do servidor . mais esta ai pra e funciona .
>
>
> SET TERM ^ ;
>
> create or alter procedure PROC_001 (
>     PAR_CODEMP CODTRA,
>     PAR_DTI DATA,
>     PAR_DTF DATA,
>     PAR_CODTDC_IN varchar(200),
>     PAR_CODORI_IN varchar(200))
> returns (
>     CODEMP CODTRA,
>     ANO smallint,
>     MES01 MOEDA15_2,
>     MES02 MOEDA15_2,
>     MES03 MOEDA15_2,
>     MES04 MOEDA15_2,
>     MES05 MOEDA15_2,
>     MES06 MOEDA15_2,
>     MES07 MOEDA15_2,
>     MES08 MOEDA15_2,
>     MES09 MOEDA15_2,
>     MES10 MOEDA15_2,
>     MES11 MOEDA15_2,
>     MES12 MOEDA15_2)
> as
> declare variable V_EMP CODTRA;
> declare variable V_ANO smallint;
> declare variable V_MES smallint;
> declare variable V_VALOR MOEDA15_2;
> declare variable SQL_TEXTO blob sub_type 1 segment size 80;
> begin
>
>
>   SQL_TEXTO = 'SELECT A.CODEMPRESA, EXTRACT(YEAR FROM A.DTVENC) ANO';
>   SQL_TEXTO = SQL_TEXTO || ' FROM CONTASREC A';
>   SQL_TEXTO = SQL_TEXTO || ' WHERE A.STATUS IN
> ('||'''A'''||','||'''P'''||')';
>
>   IF (TRIM(:PAR_CODTDC_IN) <> '') THEN
>   SQL_TEXTO = SQL_TEXTO || ' AND A.CODTDC '||TRIM(:PAR_CODTDC_IN);
>
>   IF (TRIM(:PAR_CODORI_IN) <> '') THEN
>   SQL_TEXTO = SQL_TEXTO || ' AND A.CODORI '||TRIM(:PAR_CODORI_IN);
>
>   IF (TRIM(:PAR_CODEMP) <> '') THEN
>   SQL_TEXTO = SQL_TEXTO || ' AND A.CODEMP = '||''''||:PAR_CODEMP||'''';
>
>   SQL_TEXTO = SQL_TEXTO || ' AND A.DTVENC >= ' || '''' || :PAR_DTI || ''''
> ||' AND A.DTVENC <= ' || '''' || :PAR_DTF || '''';
>   SQL_TEXTO = SQL_TEXTO || ' GROUP BY A.CODEMPRESA, EXTRACT(YEAR FROM
> A.DTVENC)';
>   SQL_TEXTO = SQL_TEXTO || ' ORDER BY A.CODEMPRESA, EXTRACT(YEAR FROM
> A.DTVENC)';
>
>   EXECUTE STATEMENT SQL_TEXTO
>   INTO :V_EMP, :V_ANO
>
> SET TERM ; ^
>
>
>
>
>
> Em 12/07/2016 07:15, Kelver Merlotti escreveu:
>
>> Mas você pode fazer como "no seu programa", montando uma string e usando o
>> Execute Statement ;)
>>
>> http://www.firebirdsql.org/refdocs/langrefupd20-psql-execstat.html#langrefupd20-psql-execstat-multirow
>>
>> []'s,
>> KM
>>
>> 2016-07-12 0:35 GMT-03:00 Adilson B. Cápua Jr. <juniorcapua em gmail.com>:
>>
>> PessoALL,
>>>
>>> Veja o seguinte trecho de uma SP:
>>>
>>>          FOR SELECT CAMPOX, CAMPOY, CAMPOZ
>>>              FROM TABELA
>>>              WHERE
>>>                    CAMPOX = :PARAMETRO_1 AND
>>>                    CAMPOY = :PARAMETRO_2 AND
>>>                    CAMPOZ = :PARAMETRO_3
>>>              INTO :VAR1, :VAR2. :VAR3 DO
>>>              BEGIN
>>>                         ...
>>>              END
>>>
>>> Agora imagine que PARAMETRO_1, PARAMETRO_2 e PARAMETRO_3 é opcional, ou
>>> seja,
>>> se vier diferente de 0, significa que tenho que usá-lo, caso contrário
>>> não!
>>>
>>> Como fazer isso de uma forma "elegante"?
>>>
>>> Hoje eu tenho que repetir várias vezes de acordo com o parâmetro. Tipo
>>> assim:
>>>
>>> IF (PARAMETRO_1 = 0) THEN
>>> BEGIN
>>>    IF (PARAMETRO_2 = 0) THEN
>>>     BEGIN
>>>        IF (PARAMETRO_3 = 0) THEN
>>>         BEGIN
>>>             (((QUERY DESCARTANDO TODOS PARAMETROS)))
>>>         END
>>>
>>>      IF (PARAMETRO_3 <> 0) THEN
>>>         BEGIN
>>>             (((QUERY USANDO SOMENTE PARAMETRO_3)))
>>>         END
>>>     END
>>> END
>>>
>>> Minhas SP's estão ficando gigantescas! Se fosse dentro do meu programa,
>>> era
>>> mole. Eu ia montando a query de acordo com a consulta. Agora dentro de
>>> Storeds Procedures que estou meio que perdido!
>>>
>>> Qualquer ajuda é bem vinda!
>>>
>>> Ah... Usando Firebird 2.5!
>>>
>>> Um abraço!
>>>
>>> _____________________________________
>>>    Adilson Bragança Cápua Jr.
>>>    Linhares - ES                            Brasil
>>>
>>>    Mail:* juniorcapua em me.com <juniorcapua em me.com>*
>>> *          juniorcapua em gmail.com <juniorcapua em gmail.com>*
>>> *          juniorcapua em yahoo.com.br <juniorcapua em yahoo.com.br>*
>>>    Messenger:* juniorcapua em live.com <juniorcapua em live.com>*
>>>    Skype:* dellas_capua*
>>>    Blogger: http://dellasnoites.blogspot.com/
>>> _____________________________________
>>> "Save a tree! Send an e-mail!"
>>> ______________________________________________
>>> 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://www.firebase.com.br/pesquisa_lista.html
>>>
>>> ______________________________________________
>> 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://www.firebase.com.br/pesquisa_lista.html
>>
>
>
> ---
> Este email foi escaneado pelo Avast antivírus.
> https://www.avast.com/antivirus
>
>
>
> ______________________________________________
> 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://www.firebase.com.br/pesquisa_lista.html
>



Mais detalhes sobre a lista de discussão lista