Stored Procedure de Seleção, como fazer.
11/07/2006
0
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 [color=red:378969c3a9]SP[/color:378969c3a9]. Esta [color=red:378969c3a9]SP[/color:378969c3a9], 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
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 [b:378969c3a9]if[/b:378969c3a9] dentro da [color=red:378969c3a9]SP[/color:378969c3a9]?
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:
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
Macario
Curtir tópico
+ 0Posts
13/07/2006
Aroldo Zanela
Não sei se entendi:
IF CFOP = ´S´ BEGIN SET @iSoma = 1 END ELSE BEGIN SET @iSoma = -1 END
Gostei + 0
13/07/2006
Macario
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:
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:
Gostei + 0
13/07/2006
Aroldo Zanela
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:
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
Gostei + 0
13/07/2006
Aroldo Zanela
Desculpe, faltou a declaração do cursor no início:
-- 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
Gostei + 0
13/07/2006
Macario
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:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)