Array
(
)

DUVIDAS COM CURSOR EM PROCEDURE SQL SERVER

N_informatica
   - 16 mar 2008

Caros amigos, estou com o seguinte problema em uma procedure.

Tenho que ler sequencialmente um grupo de registros de uma tabela e a cada registro lido faço um if e se esse if for atendido então tenho que ler também sequencialmente outro grupo de registros em uma tabela filha que está relacionada e então gerar uma outra tabela.

Na verdade o que preciso saber é como faço ou até mesmo se posso ter mais de um cursor em uma mesma procedure.

vou colocar o código da procedure aqui para poderem me ajudar melhor.

CREATE PROCEDURE GERAEXTRATOMP
@P_DTINICIO DATETIME, @P_DTFINAL DATETIME, @P_PRODUTO VARCHAR(30)
/**************************************************************************************************************/
/* PROCEDURE CRIADA EM 13 DE MARÇO DE 2008, FINALIDADE CRIAR GRUPO DE DADOS QUE POSSIBILITE A EMISSÃO EXTRATO */
/* DE MOVIMENTAÇÃO DIÁRIA DAS MATÉRIAS PRIMAS */
/**************************************************************************************************************/
AS
DECLARE @VPRODUTO VARCHAR(30)
DECLARE@VMATERIAVARCHAR(30)
DECLARE @VDATAMOV DATETIME
DECLARE @VSAIDASFLOAT
DECLARE@VQUANTIDADEFLOAT
DECLARE @VCOLIGADADCODCOLIGADA
DECLARE @VIDMOVINT
DECLARE@VIDPRDINT

SET DATEFORMAT DMY

IF @P_PRODUTO IS NULL
BEGIN
/**************************************************************************************************************/
/* GERA TABELA COM SALDO INICIAL DAS MATÉRIAS PRIMAS USANDO COMO PARÂMETRO A DATA INICIAL DO FILTRO */
/**************************************************************************************************************/
DROP TABLE SALDO_INICIAL
SELECT
TPRD.CODIGOPRD CODIGO,
TPRD.DESCRICAO PRODUTO,
SUM(
CASE
WHEN(TITMTMV.EFEITOSALDOA2 = ´A´) THEN TITMMOV.QUANTIDADE
WHEN(TITMTMV.EFEITOSALDOA2 = ´D´) THEN TITMMOV.QUANTIDADE*-1
ELSE 0 END
) AS SALDO
INTO SALDO_INICIAL
FROM
TMOV, TITMMOV, TPRD, TITMTMV, TTMV
WHERE
TMOV.CODCOLIGADA = TITMMOV.CODCOLIGADA
AND TMOV.IDMOV = TITMMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TPRD.CODCOLIGADA
AND TITMMOV.IDPRD = TPRD.IDPRD
AND TMOV.CODCOLIGADA = TITMTMV.CODCOLIGADA
AND TMOV.CODTMV = TITMTMV.CODTMV
AND TMOV.CODCOLIGADA = TTMV.CODCOLIGADA
AND TMOV.CODTMV = TTMV.CODTMV
AND TMOV.DATAEMISSAO < @P_DTINICIO
AND TMOV.STATUS <> ´C´
AND TITMTMV.EFEITOSALDOA2 IN (´A´,´D´)AND TPRD.CODIGOPRD >=´02´ AND TPRD.CODIGOPRD < ´03´
GROUP BY TPRD.CODIGOPRD, TPRD.DESCRICAO
/**************************************************************************************************************/
/* GERA TABELA COM MOV DE ENTRADAS/SAIDAS DAS MATÉRIAS PRIMAS USANDO COMO PARÂMETROS O PERIODO INFORMADO */
/**************************************************************************************************************/
DROP TABLE MOVIMENTOMP
SELECT TPRD.CODIGOPRD CODIGO, TMOV.DATAEMISSAO,
SUM(CASE WHEN(TMOV.CODTMV IN (´1.2.01´, ´1.2.03´)) THEN TITMMOV.QUANTIDADE ELSE 0 END) AS ENTRADAS,
SUM(CASE WHEN(TMOV.CODTMV IN (´2.1.04´)) THEN TITMMOV.QUANTIDADE ELSE 0 END) AS SAIDAS
INTO MOVIMENTOMP
FROMTMOV, TITMMOV, TPRD
WHERETITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.IDPRD = TPRD.IDPRD
AND TMOV.CODTMV IN (´1.2.01´, ´1.2.03´, ´2.1.04´)
AND TITMMOV.DATAEMISSAO >= @P_DTINICIO
AND TITMMOV.DATAEMISSAO <= @P_DTFINAL
AND TMOV.STATUS <> ´C´
AND LEFT(TPRD.CODIGOPRD, 2) = ´02´
GROUP BY TPRD.CODIGOPRD, TMOV.DATAEMISSAO
/**************************************************************************************************************/
/* BUSCA MATÉRIAS PRIMAS DAS ESTRUTURAS DE PRODUTOS ACABADOS */
/**************************************************************************************************************/
FOR SELECT DISTINCT TITMMOV.CODCOLIGADA, TITMMOV.IDMOV, TPRD.CODIGOPRD, TITMMOV.DATAEMISSAO, TITMMOV.IDPRD
FROMTMOV, TITMMOV, TPRD
WHERETITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.IDPRD = TPRD.IDPRD
AND TMOV.CODTMV = ´2.1.04´
AND TITMMOV.DATAEMISSAO >= @P_DTINICIO
AND TITMMOV.DATAEMISSAO <= @P_DTFINAL
AND TMOV.STATUS <> ´C´
AND LEFT(TPRD.CODIGOPRD, 2) = ´01´
ORDER BYTITMMOV.CODCOLIGADA, TITMMOV.IDPRD, TITMMOV.IDMOV
DECLARE VPONTEIRO CURSOR
OPEN VPONTEIRO
FETCH NEXT FROM VPONTEIRO INTO @VCOLIGADA, @VIDMOV, @VPRODUTO, @VDATAMOV, @VIDPRD
WHILE @@FETCH_STATUS <> -1
BEGIN
IF (EXISTS(SELECT CODESTRUTURA FROM KCOMPONENTE WHERE CODESTRUTURA = @VPRODUTO))
BEGIN
FOR SELECT DISTINCT TPRD.CODIGOPRD, ROUND((KCOMPONENTE.QTDUSADA / 10000), 2)
FROMKCOMPONENTE, TPRD
WHEREKCOMPONENTE.CODCOLIGADA = @VCOLIGADA
ANDKCOMPONENTE.CODESTRUTURA = @VPRODUTO
AND KCOMPONENTE.IDPRODUTO = TPRD.IDPRD
ORDER BYTPRD.CODIGOPRD
DECLARE VPONTEIRO1 CURSOR
OPEN VPONTEIRO1
FETCH NEXT FROM VPONTEIRO1 INTO @VMATERIA, @VQUANTIDADE
WHILE @@FETCH_STATUS <> -1
BEGIN
IF (NOT EXISTS(SELECT * FROM MOVIMENTOMP
WHERE CODIGO = @VMATERIA
AND DATAEMISSAO = @VDATAMOV))
BEGIN
INSERT INTO MOVIMENTOMP (CODIGO, DATAEMISSAO, ENTRADAS, SAIDAS)
VALUES (@VMATERIA, @VDATAMOV, 0, @VQUANTIDADE)
END
ELSE
BEGIN
UPDATE MOVIMENTOMP SET SAIDAS = SAIDAS + @VQUANTIDADE
WHERECODIGO = @VMATERIA AND DATAEMISSAO = @VDATAMOV
END
FETCH NEXT FROM VPONTEIRO1 INTO @VMATERIA, @VQUANTIDADE
END
CLOSE VPONTEIRO1
DEALLOCATE VPONTEIRO1
END
FETCH NEXT FROM VPONTEIRO INTO @VCOLIGADA, @VIDMOV, @VPRODUTO, @VDATAMOV, @VIDPRD
END
CLOSE VPONTEIRO
DEALLOCATE VPONTEIRO
END
ELSE
BEGIN
/************************************FILTRANDO UMA MATÉRIA PRIMA***********************************************/
/**************************************************************************************************************/
/* GERA TABELA COM SALDO INICIAL DAS MATÉRIAS PRIMAS USANDO COMO PARÂMETRO A DATA INICIAL DO FILTRO */
/**************************************************************************************************************/
DROP TABLE SALDO_INICIAL
SELECT
TPRD.CODIGOPRD CODIGO,
TPRD.DESCRICAO PRODUTO,
SUM(
CASE
WHEN(TITMTMV.EFEITOSALDOA2 = ´A´) THEN TITMMOV.QUANTIDADE
WHEN(TITMTMV.EFEITOSALDOA2 = ´D´) THEN TITMMOV.QUANTIDADE*-1
ELSE 0 END
) AS SALDO
INTO SALDO_INICIAL
FROM
TMOV, TITMMOV, TPRD, TITMTMV, TTMV
WHERE
TMOV.CODCOLIGADA = TITMMOV.CODCOLIGADA
AND TMOV.IDMOV = TITMMOV.IDMOV
AND TITMMOV.CODCOLIGADA = TPRD.CODCOLIGADA
AND TITMMOV.IDPRD = TPRD.IDPRD
AND TPRD.CODIGOPRD = @P_PRODUTO
AND TMOV.CODCOLIGADA = TITMTMV.CODCOLIGADA
AND TMOV.CODTMV = TITMTMV.CODTMV
AND TMOV.CODCOLIGADA = TTMV.CODCOLIGADA
AND TMOV.CODTMV = TTMV.CODTMV
AND TMOV.DATAEMISSAO < @P_DTINICIO
AND TMOV.STATUS <> ´C´
AND TITMTMV.EFEITOSALDOA2 IN (´A´,´D´)AND TPRD.CODIGOPRD >=´02´ AND TPRD.CODIGOPRD < ´03´
GROUP BY TPRD.CODIGOPRD, TPRD.DESCRICAO
/**************************************************************************************************************/
/* GERA TABELA COM MOV DE ENTRADAS/SAIDAS DAS MATÉRIAS PRIMAS USANDO COMO PARÂMETROS O PERIODO INFORMADO */
/**************************************************************************************************************/
DROP TABLE MOVIMENTOMP
SELECT TPRD.CODIGOPRD CODIGO, TMOV.DATAEMISSAO,
SUM(CASE WHEN(TMOV.CODTMV IN (´1.2.01´, ´1.2.03´)) THEN TITMMOV.QUANTIDADE ELSE 0 END) AS ENTRADAS,
SUM(CASE WHEN(TMOV.CODTMV IN (´2.1.04´)) THEN TITMMOV.QUANTIDADE ELSE 0 END) AS SAIDAS
INTO MOVIMENTOMP
FROMTMOV, TITMMOV, TPRD
WHERETITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.IDPRD = TPRD.IDPRD
AND TPRD.CODIGOPRD = @P_PRODUTO
AND TMOV.CODTMV IN (´1.2.01´, ´1.2.03´, ´2.1.04´)
AND TITMMOV.DATAEMISSAO >= @P_DTINICIO
AND TITMMOV.DATAEMISSAO <= @P_DTFINAL
AND TMOV.STATUS <> ´C´
AND LEFT(TPRD.CODIGOPRD, 2) = ´02´
GROUP BY TPRD.CODIGOPRD, TMOV.DATAEMISSAO
/**************************************************************************************************************/
/* BUSCA MATÉRIAS PRIMAS DAS ESTRUTURAS DE PRODUTOS ACABADOS */
/**************************************************************************************************************/
FOR SELECT DISTINCT TITMMOV.CODCOLIGADA, TITMMOV.IDMOV, TPRD.CODIGOPRD, TITMMOV.DATAEMISSAO, TITMMOV.IDPRD
FROMTMOV, TITMMOV, TPRD
WHERETITMMOV.IDMOV = TMOV.IDMOV
AND TITMMOV.IDPRD = TPRD.IDPRD
AND TMOV.CODTMV = ´2.1.04´
AND TITMMOV.DATAEMISSAO >= @P_DTINICIO
AND TITMMOV.DATAEMISSAO <= @P_DTFINAL
AND TMOV.STATUS <> ´C´
AND LEFT(TPRD.CODIGOPRD, 2) = ´01´
ORDER BYTITMMOV.CODCOLIGADA, TITMMOV.IDPRD, TITMMOV.IDMOV
DECLARE VPONTEIRO CURSOR
OPEN VPONTEIRO
FETCH NEXT FROM VPONTEIRO INTO @VCOLIGADA, @VIDMOV, @VPRODUTO, @VDATAMOV, @VIDPRD
WHILE @@FETCH_STATUS <> -1
BEGIN
IF (EXISTS(SELECT CODESTRUTURA FROM KCOMPONENTE WHERE CODESTRUTURA = @VPRODUTO))
BEGIN
FOR SELECT DISTINCT TPRD.CODIGOPRD, ROUND((KCOMPONENTE.QTDUSADA / 10000), 2)
FROMKCOMPONENTE, TPRD
WHEREKCOMPONENTE.CODCOLIGADA = @VCOLIGADA
ANDKCOMPONENTE.CODESTRUTURA = @VPRODUTO
AND KCOMPONENTE.IDPRODUTO = TPRD.IDPRD
AND TPRD.CODIGOPRD = @P_PRODUTO
ORDER BYTPRD.CODIGOPRD
DECLARE VPONTEIRO1 CURSOR
OPEN VPONTEIRO1
FETCH NEXT FROM VPONTEIRO1 INTO @VMATERIA, @VQUANTIDADE
WHILE @@FETCH_STATUS <> -1
BEGIN
IF (NOT EXISTS(SELECT * FROM MOVIMENTOMP
WHERE CODIGO = @VMATERIA
AND DATAEMISSAO = @VDATAMOV))
BEGIN
INSERT INTO MOVIMENTOMP (CODIGO, DATAEMISSAO, ENTRADAS, SAIDAS)
VALUES (@VMATERIA, @VDATAMOV, 0, @VQUANTIDADE)
END
ELSE
BEGIN
UPDATE MOVIMENTOMP SET SAIDAS = SAIDAS + @VQUANTIDADE
WHERECODIGO = @VMATERIA AND DATAEMISSAO = @VDATAMOV
END
FETCH NEXT FROM VPONTEIRO1 INTO @VMATERIA, @VQUANTIDADE
END
CLOSE VPONTEIRO1
DEALLOCATE VPONTEIRO1
END
FETCH NEXT FROM VPONTEIRO INTO @VCOLIGADA, @VIDMOV, @VPRODUTO, @VDATAMOV, @VIDPRD
END
CLOSE VPONTEIRO
DEALLOCATE VPONTEIRO
END

ERROS ENCONTRADOS