SQL Server - Funcion con varios cursores

   
Vista:

Funcion con varios cursores

Publicado por david (2 intervenciones) el 16/08/2017 11:46:38
Buenas.

Estoy intentando hacer una función que me devuelva en html, una tabla con los módulos de un curso y a su vez con sus unidades, y a su vez con las notas del alumno en cada unidad.

El tema es que la hago asi:

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
117
ALTER function  [ForCdm].[Dame_TableHTML_Sen25_Notas](@Grupoid as int, @inscripcionid as int, @AccionidCat as int)
RETURNS varchar(max) AS
begin
--declare @nota numeric(18, 2) = 0
declare @notaMedia numeric(18, 2) = 0
declare @contador int = 1
declare @numUnidades int
declare @contadorUnidades int = 1
declare @tabla varchar(max) = ''
declare @tabla2 varchar(max) = ''
declare @tabla3 varchar(max) = ''
declare @tabla4 varchar(max) = ''
declare @tablaAux varchar(max) = ''
set @tabla = @tabla + '
<table border="1"  border=1 cellspacing=0 cellpadding=2 bordercolor="666633" style="border-style:solid">
	<tr>
		<td colspan="" rowspan="2" style="background-color:#C2D69D">
		<span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><p align=center><b></b></p></span></td>
		<td rowspan="2" style="background-color:#C2D69D">
		<span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><p align=center><b>DNI/NIE</b></p></span></td>
		<td rowspan="2" style="background-color:#C2D69D"><span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><p align=center><b>APELLIDOS Y NOMBRE</b></p></span></td>'

declare modulos cursor for
	select cam.moduloid, cm.codigo as Nombre
	from FormacionCdm..CatalogoAccionesModulos cam
	inner join FormacionCdm..CatalogoModulos cm on cm.ModuloId = cam.ModuloId
	where cam.AccionId = @AccionidCat
	order by cam.Orden

open modulos
	declare @moduloId int 
	declare @modulo varchar(MAX)
	fetch next from modulos into @Moduloid, @modulo



WHILE @@FETCH_STATUS = 0  

BEGIN  
set @contadorUnidades = (select COUNT(unidadid)+1 from FormacionCdm.dbo.CatalogoAccionesModulosUnidades camu, FormacionCdm.dbo.CatalogoAccionesModulos cam
	where camu.AccionModuloId = cam.AccionModuloId  and cam.ModuloId = @moduloId)

set @tabla = @tabla + '<td colspan ="'+cast(@contadorUnidades as varchar)+'" style="background-color:#C2D69D"><span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><b>'+@modulo+'</b></span></td>'
 
 
declare unidades cursor for
	select * from (select cu.unidadid, cu.codigo as Nombre
	from FormacionCdm..CatalogoUnidades cu
	inner join FormacionCdm..CatalogoAccionesModulosUnidades camu on cu.UnidadId = camu.UnidadId
	inner join FormacionCdm..CatalogoAccionesModulos cam on cam.AccionModuloId = camu.AccionModuloId
	where  cam.AccionId = @AccionidCat and cam.ModuloId = @moduloId
	union all
	select 11000 as unidadid, 'CALIFICACIÓN FINAL' as Nombre) a
	order by a.UnidadId
open unidades
	declare @UnidadId int
	declare @unidad varchar(MAX)
	fetch next from unidades into @UnidadId, @unidad
 
WHILE @@FETCH_STATUS = 0
BEGIN
 
set @tabla2 = @tabla2 + '<td style="background-color:#C2D69D"><span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><b>'+@unidad+'</b></span></td>'
 
 
declare Inscripciones cursor for
		select i.inscripcionid, I.nif as Nif, ISNULL(i.apellido1,'') + ' ' + ISNULL(i.apellido2,'') + ' ' + ISNULL(i.nombre,'') as Nombre, iu.Convocatoria1Practico as nota
		from FormacionCdm..Inscripciones i
		LEFT OUTER JOIN FormacionCdm.dbo.InscripcionesUnidades iu on i.InscripcionId = iu.inscripcionid
		where i.InscripcionId = @inscripcionid and iu.UnidadId = @UnidadId
		order by i.Apellido1,i.Apellido2,i.Nombre
 
open Inscripciones
	declare @nif varchar(MAX)
	declare @nombre varchar(max)
	declare @nota varchar(max)
	fetch next from Inscripciones into @Inscripcionid, @nif, @nombre, @nota
 
	fetch next from unidades into @UnidadId, @unidad
 
 
 
close Inscripciones
	deallocate Inscripciones
	end
fetch next from modulos into @Moduloid, @modulo
 
 
 
close unidades
	deallocate unidades
 
 
END
 
	close modulos
	deallocate modulos
 
 
	set @tabla = @tabla + '<td rowspan="2" style="background-color:#C2D69D"><span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><b>'+'PROPUESTA CERTIFICADO'+'</b></span></td>
					  <td rowspan="2" style="background-color:#C2D69D"><span style="font-size:8.0pt;font-family:''Arial'',''sans-serif''"><b>'+'PROPUESTA DE ACREDITACIÓN PARCIAL'+'</b></span></td></tr>'

	set @tabla3 = @tabla3 + '<tr></tr><tr><td>'+'numero'+'</td><td>'+@nif+'</td><td>'+@nombre+'</td>'

	set @contador += 1
	set @tabla = @tabla + @tabla2 + @tabla3 + @tabla4

	set @tabla = @tabla + isnull(@tablaAux, '')
	set @tabla = @tabla + '</table>
	</td>
</tr>
</table>'

 
set @tabla = @tabla + ''
return @tabla
end




El problema es que no me devuelve la nota en cada unidad, me devuelve esto que adjunto en la imagen:



Alguna ayuda? Muchas gracias.
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

Funcion con varios cursores

Publicado por Isaias (3619 intervenciones) el 16/08/2017 18:52:53
Con el debido respeto, las preguntas en estos foros deben ser PUNTUALES, sin si quiera tener algun ejemplo de tus tablas, ¿como te imaginas que podamos darte una orientacion?
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

Funcion con varios cursores

Publicado por david (2 intervenciones) el 17/08/2017 08:00:51
Gracias Isaias. Solo me refería a ver si estaba bien la estructura (ends, begins, etc...)
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
Imágen de perfil de Isaias

Funcion con varios cursores

Publicado por Isaias (3619 intervenciones) el 17/08/2017 18:59:30
¿En que motor de base de datos piensas crear tu funcion?

Habemos muchos compañeros que compartimos en diferentes foros, nuestro rechazo total al manejo de cursores, son anticuados y muy lentos.

En cuanto a tu estructura de BEGIN - END, etc. si no estuviera bien, el mismo manejador de base de datos te lo mencionaria
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