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