Re: [firebase-br] Função do Suspende em uma procedure

RedDevil reddevil em reddevil.eti.br
Dom Nov 14 19:39:51 -03 2004


ola Angela.
tudo bem contigo?
sincerely, espero que sim.

na resposta anterior que eu postei para esta msg eu fui um tanto quanto "teorico", por isso resolvi postar outra resposta com um exemplo pratico...

no hospital onde eu trabalho a gente tem algo semelhante a um convenio proprio, o qual da direito a descontos em consultas, internaçoes, etc e talz, e o conveniado paga uma mensalidade, atraves de um boleto bancario, sendo que inicialmente ele recebe 12 boletos, e quando existem 3 mensalidades para serem pagas, a gente envia um arquivo para o banco informando que o banco devera gerar mais 12 boletos...

eu fiz uma stored procedure selecionavel para verificar, diariamente, quais sao os conveniados cuja solicitaçao de boletos devera ser solicitada ao banco... estou colocando essa SP æ abaixo e depois eu explico como o SUSPEND eh usado nela...

CREATE PROCEDURE XHIGH (
  CONV INTEGER,
  EMPR INTEGER,
  CON INTEGER )
RETURNS (
  GERA INTEGER )
AS
DECLARE VARIABLE CONT INTEGER;
DECLARE VARIABLE WCONV INTEGER;
DECLARE VARIABLE  WEMPR INTEGER;
DECLARE VARIABLE  WCON INTEGER;
DECLARE VARIABLE  WDATAVEN DATE;
DECLARE VARIABLE  WDATAPAG DATE;

BEGIN
  GERA = 2;   /* GERA=1 solicida boleto, GERA=2 nao solicita */
  CONT = 0;

FOR SELECT mens.menconvcod, mens.menempcod, mens.menconcod, mens.mendve, mens.mendpa
        FROM mensalidades mens
        WHERE (mens.menconvcod = :conv and mens.menempcod = :empr and mens.menconcod = :con)
        ORDER BY mens.mendve DESC
        INTO  :wconv, :wempr, :wcon, :wdataven, :wdatapag
DO
  BEGIN

    if ( :cont = 4 ) then   /* interrompe o FETCH ao ter 4 "registros" de retorno */
      EXIT;

    if (:wdatapag is not null) then   /* a mensalidade esta paga... deve solicitar boleto */
     BEGIN
       GERA = 1;
       EXIT;
     END

    cont = cont +1;
    SUSPEND;  /* retorna um "registro" da "tabela virtual" criada pelo FOR SELECT */
  END

  EXIT;
END

bem, nesse exemplo æ acima, o SUSPEND cria um "looping" que vai percorrer a "tabela virtual" criada pelo FOR SELECT retornando as linhas dessa "tabela", sendo que a cada linha eu testo se a mensalidade esta paga:
    if (:wdatapag is not null) then   /* a mensalidade esta paga... deve solicitar boleto */
     BEGIN
       GERA = 1;
       EXIT;
     END

e interrompo esse "looping" quando tenho 4 linhas retornadas:
    if ( :cont = 4 ) then   /* interrompe o FETCH ao ter 4 "registros" de retorno */
      EXIT;


como essa eh uma stored procedure selecionavel, eu chamo ela atraves de uma IB_Query, passando como parametros o CONVENIO (esse nosso sistema tem 2 modalidades: "convenio" 1 e 2), a EMPRESA do conveniado (a empresa eh igual a 999999 quando trata-se de um convenio proprio) e o CODIGO do conveniado, da seguinte maneira:
IB_Query1.SQL.Add( 'select * from XHIGH(convenio, empresa, conveniado)' );

e depois, quando a SP retorna as informaçoes, eu me posiciono no ultimo registro, e verifico se o "campo" GERA esta igual a 1... se estiver, eh feita a solicitaçao dos boletos para o banco, se estiver igual a 2 o sistema vai para o proximo conveniado...

esse uso do SUSPEND somente eh possivel em uma SP selecionavel, pois em uma SP executavel ele age de outra maneira, indo para o END final, o qual retorna os valores e devolve o controle para a aplicaçao, sendo que nao eh aconselhavel o uso do SUSPEND em SPs executaveis...

como na msg que postei anteriormente, eu vou te dar um conselho (sabor gratuito, etc e talz...;o).
se voce esta começando agora a trabalhar com o Interbase (mude para o Firebird, please...;o), eu te aconselho a acompanhar, seja por assinatura ou em bancas (se ela chegar ate a tua cidade), a revista ClubeDelphi...

voce nao vai conseguir mais a legendaria ediçao numero 39 dessa revista, na qual eu peguei o principio da coisa no que diz respeito a criaçao de stored procedures, mas a cada ediçao que recebo eu sempre sou surpreendido com alguma coisa inedita e util para o nosso arduo trabalho de desenvolvedor...
;o)


[]s
força sempre.
ate +++

Luiz "RedDevil" Stefanski
=======><=========
====> Delphi 4 <=====
====> powered <=====
======> by <=======
===> IBObjects <=====
=======><=========
more in:
http://www.RedDevil.eti.br (home)
http://www.firebase.com.br/cgi-bin/firebase.cgi/artigo?ID=630 (instalaçao)
http://www.firebase.com.br/cgi-bin/firebase.cgi/dnld?ID=165 ("tips")



Mais detalhes sobre a lista de discussão lista