SQL Server - Problema al crear un procedimiento almacenado

   
Vista:

Problema al crear un procedimiento almacenado

Publicado por Joaquin Gracia (1 intervención) el 04/11/2012 11:25:58
Buenos días.

Estoy creando un procedimiento almacenado que actualiza dos tablas mediante dos cursores.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
USE [TRIGO]
GO
/****** Objeto:  StoredProcedure [dbo].[VGE_RecalculaEstadisticas]    Fecha de la secuencia de comandos: 11/02/2012 09:31:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[VGE_CorrigeIVAFacturas]
@TiendaInicial as nvarchar(255), @ClienteInicial as nvarchar(255),  @SerieInicial as nvarchar(255),
@FechaInicial as nvarchar(255), @FechaFinal as nvarchar(255)
AS
 
--- Variables para recibir los valores del select
DECLARE @c1Año as int
DECLARE @c1Serie as nvarchar(3)
DECLARE @c1Numero as int
DECLARE @c1CodigoDeCliente as int
DECLARE @c1FechaDocumento as datetime
DECLARE @c1Tienda as int
DECLARE @c1BaseImponible1 as float
DECLARE @c1PorIva1 as float
DECLARE @c1CuotaIva1 as float
DECLARE @c1BaseImponible2 as float
DECLARE @c1PorIva2 as float
DECLARE @c1CuotaIva2 as float
DECLARE @c1BaseImponible3 as float
DECLARE @c1PorIva3 as float
DECLARE @c1CuotaIva3 as float
DECLARE @c1Total as float
DECLARE @c1BaseImponible1a as float
DECLARE @c1CuotaIva1a as float
DECLARE @c1BaseImponible2a as float
DECLARE @c1CuotaIva2a as float
DECLARE @c1BaseImponible3a as float
DECLARE @c1CuotaIva3a as float
DECLARE @c1TotalA as float
DECLARE @c1FactorCambio as float
 
DECLARE @c2Año as int
DECLARE @c2Serie as nvarchar(3)
DECLARE @c2Numero as int
DECLARE @c2NumLinea as int
DECLARE @c2TipoDeIva as nvarchar(1)
DECLARE @c2PorIva as real
 
DECLARE @FechaInicial2 as nvarchar(255)
DECLARE @FechaFinal2 as nvarchar(255)
DECLARE @CadenaError as nvarchar(255)
DECLARE @vImporteConIva as float
DECLARE @vNuevaBase as float
DECLARE @vNuevoIVA as float
 
SET @FechaInicial  = @FechaInicial + ' 00:00:00'
SET @FechaFinal    = @FechaFinal   + ' 23:59:59'
 
SET @FechaInicial2 = @FechaInicial
SET @FechaFinal2   = @FechaFinal
 
DECLARE C0 CURSOR FOR SELECT Año, Serie, Numero, CodigoDecliente, FechaDocumento, Tienda, BaseImponible1, PorIva1, CuotaIva1, BaseImponible2, PorIva2, CuotaIva2, BaseImponible3, PorIva3, CuotaIva3, Total, BaseImponible1a, CuotaIva1a, BaseImponible2a, CuotaIva2a, BaseImponible3a, CuotaIva3a, TotalA, FactorCambio  FROM FacturasClientes WHERE Año = 2012 AND Serie = @SerieInicial AND CodigoDeCliente = @ClienteInicial AND Tienda = @TiendaInicial AND [FechaDocumento] BETWEEN CONVERT(datetime, @FechaInicial2) AND CONVERT(datetime, @FechaFinal2)
OPEN C0 --- se abre el cursor
--- Se cargan los valores del cursor en las variables
FETCH NEXT FROM C0 INTO @c1Año, @c1Serie, @c1Numero, @c1CodigoDeCliente, @c1FechaDocumento, @c1Tienda, @c1BaseImponible1, @c1PorIva1, @c1CuotaIva1, @c1BaseImponible2, @c1PorIva2, @c1CuotaIva2, @c1BaseImponible3, @c1PorIva3, @c1CuotaIva3, @c1Total, @c1BaseImponible1a, @c1CuotaIva1a, @c1BaseImponible2a, @c1CuotaIva2a, @c1BaseImponible3a, @c1CuotaIva3a, @c1TotalA, @c1FactorCambio
 
WHILE(@@FETCH_STATUS=0)
BEGIN
 
	DECLARE C2 CURSOR FOR SELECT [Año], [Serie], [Numero], [NumLinea], [TipoDeIva], [PorIva] FROM DetalleFacturaCliente WHERE [Año] = @c1Año AND [Serie] = @c1Serie AND [Numero] = @c1Numero
	OPEN C2 --- se abre el cursor
	FETCH NEXT FROM C2 INTO @c2Año, @c2Serie, @c2Numero, @c2NumLinea, @c2TipoDeIva, @c2PorIva
 
	WHILE(@@FETCH_STATUS=0)
	BEGIN
 
		IF @c2TipoDeIva = 'N'
			BEGIN
				SET @c2TipoDeIva = 'R'
				IF @c2PorIva = 18
				BEGIN
					SET @c2PorIva = 8
				END
				IF @c2PorIva = 21
				BEGIN
					SET @c2PorIva = 10
				END
				UPDATE [DetalleFacturaCliente] SET [TipoDeIva] = @c2TipoDeIva, [PorIva] = @c2PorIva WHERE CURRENT OF C2
			 END
 
		FETCH NEXT FROM C2 INTO @c2Año, @c2Serie, @c2Numero, @c2NumLinea, @c2TipoDeIva, @c2PorIva
	END
	CLOSE C2
	DEALLOCATE C2
 
    IF (@c1PorIva3 = 18 OR @c1PorIva3 = 21) AND @c1CuotaIva3 <> 0
		BEGIN
			SET @vImporteConIva    = @c1BaseImponible3 + @c1CuotaIva3
			SET @vNuevaBase        = ROUND((@vImporteConIva / ((100 + @c1PorIva1) / 100)), 2)
			SET @vNuevoIVA         = @vImporteConIva - @vNuevaBase
			SET @c1BaseImponible1  = @c1BaseImponible1 + @vNuevaBase
			SET @c1CuotaIva1	   = @c1CuotaIva1 + (@c1Total - (@c1BaseImponible1 + @c1CuotaIva1 + @c1BaseImponible2 + @c1CuotaIva2))
			SET @c1BaseImponible3  = 0
			SET @c1PorIva3         = 0
			SET @c1CuotaIva3       = 0
			SET @c1BaseImponible1a = ROUND( (@c1BaseImponible1 * @c1FactorCambio), 0)
			SET @c1CuotaIva1a      = ROUND( (@c1CuotaIva1 * @c1FactorCambio), 0)
			SET @c1BaseImponible3a = 0
			SET @c1CuotaIva3a      = 0
 
			UPDATE [dbo].[FacturasClientes] SET [BaseImponible1] = @c1BaseImponible1, [CuotaIva1] = @c1CuotaIva1, [BaseImponible3] = @c1BaseImponible3, [@c1PorIva3] = @c1PorIva3, [CuotaIva3] = @c1CuotaIva3, [BaseImponible1a] = @c1BaseImponible1a, [CuotaIva1a] = @c1CuotaIva1a, [BaseImponible3a] = @c1BaseImponible3a, [CuotaIva3a] = @c1CuotaIva3a WHERE CURRENT OF C1
		END
 
	FETCH NEXT FROM C0 INTO @c1Año, @c1Serie, @c1Numero, @c1CodigoDeCliente, @c1FechaDocumento, @c1Tienda, @c1BaseImponible1, @c1PorIva1, @c1CuotaIva1, @c1BaseImponible2, @c1PorIva2, @c1CuotaIva2, @c1BaseImponible3, @c1PorIva3, @c1CuotaIva3, @c1Total, @c1BaseImponible1a, @c1CuotaIva1a, @c1BaseImponible2a, @c1CuotaIva2a, @c1BaseImponible3a, @c1CuotaIva3a, @c1TotalA, @c1FactorCambio
END
 
-- cerramos el cursor
CLOSE C0
DEALLOCATE C0


al intentar crearlo me da el siguiente error:

Mens 207, Nivel 16, Estado 1, Procedimiento VGE_CorrigeIVAFacturas, Línea 0
El nombre de columna '@c1PorIva3' no es válido.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

Problema al crear un procedimiento almacenado

Publicado por Isaias (3186 intervenciones) el 05/11/2012 18:44:25
Antes de intentar siquiera desenmarañar tu codigo, ¿que es lo que pretendes hacer?

Plantea tu problema y que solucion buscas.....

Te digo esto, porque el 99.99% de las cosas que se hacen con cursores, se pueden hacer con un simple codigo t-sql
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al crear un procedimiento almacenado

Publicado por Pedro (80 intervenciones) el 06/11/2012 16:27:52
Esa columna que te da error, esta como receptora de un update, y las columnas de los update tienen que se las columans de la tabla, no variables internas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar