Array
(
)

Stored Procedure de Seleção, como fazer.

Macario
   - 11 jul 2006

Olá colegas, bom dia.

Eu, iniciando em Stored Procedure em MSSQL 2000, consegui atraves de um exemplo basico fazer essa procedure, abaixo.

Minha intenção(e necessidade) é tirar todo um codigo utilizando tabelas, e se possivel fazer o maximo de ´tratamento´ dentro de ums SP. Esta SP, será para um relatorio, onde tenho que fazer diversas verificações, como por exemplo:

1- Se o tipo da Nota deve somar ou deduzir o seu valor

Citação:

if (TabelaNotaFiscal.FieldByName(´CFOP´).asString = ´S´) then
iSoma:=1
else
if (TabelaNotaFiscal.FieldByName(´CFOP´).asString = ´N´) then
iSoma:=-1;



Quando iSoma = -1 o valor da nota deve se tornar negativo (para ser deduzido).

Ai que entra minha duvida como conseguir esse retorno?
Como fazer esse if dentro da SP?

Se alguem tiver algum exemplo a indicar eu agradeço.
Estou procurando em diversos sites mas até o momento nao encontrei nada.
Será que preciso usar cursor? se for como devo proceder?

Grato. :roll:

#Código

set quoted_identifier on
GO
set ansi_nulls on 
GO

ALTER  PROCEDURE CLIPROPMEDIO
( 
@EMPRESA as varchar(3),
@CLIINI as varchar(5), @CLIFIN as varchar(5),
@CLASSINI as varchar(2),@CLASSFIN as varchar(2),
@PERINI as datetime,@PERFIN as datetime,
@PROINI as varchar(16),@PROFIN as varchar(16),
@REPINI as varchar(3),@REPFIN as varchar(3),
@DISTINI as varchar(2),@DISTFIN as varchar(2),
@SEGINI as varchar(2),@SEGFIN as varchar(2),
@CONDINI as varchar(3),@CONDFIN as varchar(3),
/*PARAMETROS REFERENTES AS OPÇÕES EXISTENTES*/
@INDICE as varchar(2)


)


As 
Begin 

 select A.EMP, A.CLI, A.NFI, A.DAT, A.NOP, A.NPE, A.CDPG, A.CDESA,A.DESCICMS, A.IRENDA, A.SERVICOS, B.DESPAG,
C.EFEITOVEN, D.V2 as DESCLI, D.V4 as MUNICIPIO, D.V5 as CODEST, D.TCL as CODSEG, D.TCL2 as CODCLA, D.ZONA ,
D.VEN_DIRETA, E.CSG as CODSEG,E.NSG as DESSEG, F.CSG as CODCLA,F.NSG as DESCLA,G.DESZONA,H.NOMEEST as ESTADO, 
I.NNF, I.NCL, I.NEM, I.QTE, I.VLR, I.QTECE, I.VLRCE, I.PRO, I.IPI, I.PED, I.DNF, I.NRE, I.ENCPRO, I.ENCIPI,I.ENCFIN, 
J.V2 as DESREP, K.A2 as DESPRO,K.FATCONV, L.DESCRICAO as UNIDADE,M.VIN 
from ARQNFIS A 
left join ARQCPAG B on (A.CDPG=B.CODPAG) 
left join ARQNOPS C on (A.NOP=C.NOX) 
left join ARQCLIE D on (A.CLI=D.V1) 
left join ARQTCLI E on (D.TCL=E.CSG) 
left join ARQCCLI F on (D.TCL2=F.CSG) 
left join ARQZONA G on (D.ZONA=G.CODZONA) 
left join ARQESTA H on (D.V5=H.CODEST) 
left join ARQPRNF I on (A.NFI=I.NNF) 
left join ARQREPR J on (I.NRE=J.V1) 
left join ARQMER  K on (I.PRO=K.A1) 
left join ARQUNID L on (K.A3=L.COD) 
left join ARQINDI M on (M.CIN=@INDICE and A.DAT=M.DIN) 
where 
A.EMP = @EMPRESA and D.V0 = @EMPRESA and I.NEM = @EMPRESA and 
A.DAT between @PERINI and @PERFIN and 
A.CLI >= @CLIINI and A.CLI <= @CLIFIN and 
isNull(A.CDPG,´´) >= @CONDINI and isNull(A.CDPG,´´) <= @CONDFIN and 
(C.EFEITOVEN = ´S´ or C.EFEITOVEN = ´D´) and 
isnull(A.CDESA,´N´) = ´N´ and 
D.TCL >= @SEGINI and D.TCL <= @SEGFIN and 
D.TCL2 >= @CLASSINI and D.TCL2 <= @CLASSFIN and 
D.ZONA>= @DISTINI and D.ZONA <= @DISTFIN and 
I.PRO >= @PROINI and I.PRO <= @PROFIN and 
I.NRE >= @REPINI and I.NRE <= @REPFIN
End 
GO 


SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO


Aroldo Zanela
   - 13 jul 2006

Colega,

Não sei se entendi:

#Código

IF CFOP = ´S´
BEGIN
  SET @iSoma = 1
END ELSE
BEGIN
  SET @iSoma = -1
END


Macario
   - 13 jul 2006

Ola Aroldo, bom dia.

Acredito que esse meu ´caso´ não é dos mais faceis de se explicar.

Hoje eu faço da seguinte maneira. Utilizo apenas o select (ver acima), e trato o registros retornados via while, onde entram diversas verificações.

Uma delas é verificar o CFOP(Código Fiscal de Operações sobre Produtos) da Nota fiscal, o qual me indica se a nota é de venda ou devolução.

Ai entra a verificação:

#Código

if CFOP = ´S´ then
  iSoma:= 1
else
  iSoma:=-1;


Apos essa verificação ao incluir esse registro (uso um ClientDataSet como tabela temporaria), tanto o valor como a quantidade da nota serão negativos:

TabelaTemp.fieldbyName(´Valor´).asfloat := (Query.fieldbyName(´Valor´).asfloat*iSoma);

Agora a Duvida, como usar o select (ja postado), e tratar essas informaçoes e ja retornar com os novos resultados.

Grato. :roll:

Aroldo Zanela
   - 13 jul 2006

Colega,

Você pode usar um cursor para verificar linha a linha o valor de cada CFOP (Códigos Fiscais de Operação ou Prestação). Você declara o cursor para o select, faz a busca de cada linha (fetch) dentro de um laço while da mesma forma que faria num programa.

Exemplo:

#Código

OPEN CUR_COBRANCAS

FETCH NEXT FROM CUR_COBRANCAS
INTO @FAT_NUMERO, @SERIE, @COB_VALOR, @VENCIMENTO, @PORTADOR, @DUPL_NRO, @DUPL_VALOR
-- Laço para ler todos os registros

WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE ACERTO_EFETIVADO SET NF_PAGO = @COB_VALOR
WHERESES_DATA = @DT_SESSAO AND
ACE_MOTORISTA = @MOTORISTA AND
ACE_MOVTO = @DT_MOVTO AND
FAT_NUMERO = @FAT_NUMERO AND
FAT_SERIE = @SERIE AND
ACE_DEPENDENCIA = @ESTABL

SET @STATUS = 1-- ACERTADA
SET @ESPECIE = ´DP´

        SELECT @CONTADOR = COUNT(*)
FROM PARCELAS
WHERE (FAT_NUMERO = @FAT_NUMERO)

SELECT @EXISTE_PARCELA = COUNT(*)
        FROM PARCELAS
        WHERE (PAR_ESPECIE = @ESPECIE AND PAR_VENC = @VENCIMENTO AND FAT_NUMERO = @FAT_NUMERO AND SES_DATA = @DT_SESSAO AND ACE_MOTORISTA = @MOTORISTA AND ACE_MOVTO = @DT_MOVTO AND ACE_DEPENDENCIA = @ESTABL)
-- Não existe, então inserir uma nova

IF @EXISTE_PARCELA = 0
BEGIN
  INSERT INTO PARCELAS
          VALUES (@ESPECIE, @VENCIMENTO, @CONTADOR+1, @FAT_NUMERO, @DT_SESSAO, @MOTORISTA, @DT_MOVTO, @ESTABL)
END
SELECT @CONTADOR = PAR_NUMERO
        FROM PARCELAS
        WHERE (PAR_ESPECIE = @ESPECIE AND PAR_VENC = @VENCIMENTO AND FAT_NUMERO = @FAT_NUMERO AND SES_DATA = @DT_SESSAO AND ACE_MOTORISTA = @MOTORISTA AND ACE_MOVTO = @DT_MOVTO AND ACE_DEPENDENCIA = @ESTABL)
IF @CONTADOR < 10
BEGIN
          SET @PARCELA = ´0´ + CONVERT(CHAR(1),@CONTADOR)
END
ELSE
BEGIN
    SET @PARCELA = CONVERT(CHAR(2),@CONTADOR)
END
-- Gravar dados na tabela de faturas (agrupamento de pagamentos)
INSERT INTO EMS_FATURA
VALUES (´3-FATURA´, -- FIXO: 3-FATURA
@ESTABL, -- ESTABELECIMENTO
@SERIE, -- SERIE DA NOTA FISCAL
@FAT_NUMERO, -- NÚMERO DA FATURA
@PARCELA, -- CÓDIGO DA PARCELA
@ESPECIE, -- CÓDIGO DA ESPÉCIE
@VENCIMENTO, -- DATA DE VENCIMENTO DA PARCELA
@COB_VALOR,-- VALOR DA PARCELA (AGRUPAMENTO DOS CHEQUES)
@PORTADOR,-- CÓDIGO DO PORTADOR
@MOTORISTA,-- CÓDIGO DO MOTORISTA
@DT_SESSAO,-- DATA DO ACERTO
@STATUS,-- 1-ACERTADA, 2-RETORNADA (SEMPRE 1 NESTE CADO)
@DT_SESSAO,-- DATA DA SESSÃO (USO INTERNO)
@MOTORISTA,-- CÓDIGO DO MOTORISTA (USO INTERNO)
@DT_MOVTO,-- DATA DO MOVIMENTO (USO INTERNO)
@ACE_CHAVE,             -- NUMERO DO BORDERO - GERADO AUTOMATICAMENTE
                @DUPL_NRO,              -- NUMERO DA DUPLICATA
                @DUPL_VALOR)            -- VALOR DA DUPLICATA
FETCH NEXT FROM CUR_COBRANCAS
INTO @FAT_NUMERO, @SERIE, @COB_VALOR, @VENCIMENTO, @PORTADOR, @DUPL_NRO, @DUPL_VALOR
END
CLOSE CUR_COBRANCAS
DEALLOCATE CUR_COBRANCAS


Aroldo Zanela
   - 13 jul 2006

Colega,

Desculpe, faltou a declaração do cursor no início:

#Código

-- Criar cursor para baixar registros de cobrancas
DECLARE CUR_COBRANCAS CURSOR FOR
SELECT COB_FATURA, COB_SERIE, ISNULL(COB_VALOR,0), COB_VENCIMENTO,
CAST(COB_PORTADOR AS NUMERIC(5)), ISNULL(COB_SEQUENCIA,0), ISNULL(COB_TOTAL,0)
FROM COBRANCAS
WHERE SES_DATA = @DT_SESSAO AND
ACE_MOTORISTA = @MOTORISTA AND
ACE_MOVTO = @DT_MOVTO AND
ACE_DEPENDENCIA = @ESTABL
-- Abrir cursor de cobrancas
-- Ler primeira linha do cursor


Macario
   - 13 jul 2006

Primeiramente quero lhe agradecer a ajuda, Aroldo.

Bom vou estudar esse exemplo e tentar adapta-lo.

Agora eis minha duvida.

No seu exemplo vc está efetuando Update, a minha necessidade é apenas para um relatorio. Como devo proceder?

Seria interessante usar tabela temporaria?

Grato. :roll: