Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/03/2007, 08:23
Avatar de Bravenap
Bravenap
 
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 6 meses
Puntos: 4
Re: Consultas para insertar nuevo usuario en foro phpBB

Bueno allá va. Se trata de un procedimiento almacenado que registra a nuevos alumnos en una base de datos y al mismo tiempo, ya que la base de datos es la misma, crea usuarios para el foro y les asigna a un grupo para que puedan participar en el subforo del curso al que están inscritos. Marco en rojo sólo las consultas que corresponden a las tablas del foro phpBB.

Código:
ALTER PROCEDURE PA_FC_Inscripcion
(
	@nuevoAlumno bit = 1,
	@idAlumno int = NULL,
	@apellidos nvarchar(255) = '',
	@nombre nvarchar(255) = '',
	@direccion nvarchar(255) = '',
	@localidad nvarchar(255) = '',
	@cp numeric = NULL,
	@telefono char(50) = NULL,
	@correo nvarchar(255) = NULL,
	@profesion nvarchar(255) = NULL,
	@curso int = NULL,
	@pago char(1) = NULL,
	@importe char(50) = NULL,
	@empresa nvarchar(255) = NULL,
	@dirEmpresa nvarchar(255) = NULL,
	@CIFEmpresa char(50) = NULL,
	@locEmpresa nvarchar(255) = NULL,
	@CPEmpresa numeric = NULL,
	@factura bit = 0,
	@usuarioForo varchar(25) = '',
	@pass varchar(32) = ''
)
AS
BEGIN
	DECLARE @Error int, @idForo int, @idGrupo int
	BEGIN TRAN

	IF @nuevoAlumno = 1
	BEGIN
		-- Se crea el usuario para el foro
		SELECT @idForo = (SELECT MAX(user_id) FROM foroCursos_users) + 1
		INSERT INTO foroCursos_users
			(user_id, username, user_regdate, user_password, user_email, user_viewemail, user_attachsig, user_allowsmile, user_allowhtml, user_allowbbcode, user_allow_viewonline, user_notify, user_notify_pm, user_popup_pm, user_timezone, user_dateformat, user_lang, user_style, user_level, user_allow_pm, user_active, user_actkey)
			VALUES 
			(@idForo, @usuarioForo, DATEDIFF(ss, '01-01-1970', GetDate()) , @pass, @correo, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 'D M d, Y g:i a', 'spanish', 1, 0, 1, 0,'')
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError

		-- Se crea el grupo para uso personal
		INSERT INTO foroCursos_groups (group_name, group_description, group_single_user, group_moderator) VALUES ('', 'Personal User', 1, 0)
		SELECT @idGrupo = (SELECT @@identity)
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
	
		-- Se crea la relación usuario-grupo para el grupo de uso personal
		INSERT INTO foroCursos_user_group (user_id, group_id, user_pending) VALUES (@idForo, @idGrupo, 0)
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		
		-- Se inserta el nuevo alumno
		INSERT INTO fc_alumnos
			(Apellidos,Nombre,Domicilio,Localidad,CP,Telefono,Correo,Profesion,IDForo)
			VALUES
			(@apellidos,@nombre,@direccion,@localidad,@cp,@telefono,@correo,@profesion,@idForo)
		SELECT @idAlumno = (SELECT @@identity)
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
	END
	ELSE
	BEGIN
		-- Como ya está registrado, se busca su ID en el foro
		SELECT @idForo = (SELECT IDForo FROM fc_alumnos WHERE ID = @idAlumno)
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
	END

	INSERT INTO fc_relAlumnoCurso
		(Alumno,Curso,Estado,FechaInscripcion,FormaPago,Importe,Empresa,DirEmpresa,CIFEmpresa,LocEmpresa,CPEmpresa,Factura)
		VALUES
		(@idAlumno,@curso,1,GETDATE(),@pago,@importe,@empresa,@dirEmpresa,@CIFEmpresa,@locEmpresa,@CPEmpresa,@factura)
	SET @Error = @@Error
	IF (@Error<>0) GOTO TratarError

	-- Añadir al usuario al grupo del foro que corresponda al curso
	SELECT @idGrupo = (SELECT group_id FROM foroCursos_groups WHERE group_name = 'Grupo'+CONVERT(char(4),@curso))
	INSERT INTO foroCursos_user_group (user_id, group_id, user_pending) VALUES (@idForo, @idGrupo, 0)
	SET @Error = @@Error
	IF (@Error<>0) GOTO TratarError

	SELECT @idAlumno

	COMMIT TRAN

TratarError: 
	IF @Error<>0
	BEGIN
		ROLLBACK TRAN
		SELECT @Error
	END
END
Y el procedimiento para borrar al alumno y todas sus relaciones:
Código:
ALTER PROCEDURE PA_FC_BorrarAlumno
(
	@idAlumno int
)
AS
BEGIN
	DECLARE @Error int, @idForo int, @usuarioForo varchar(25)
	BEGIN TRAN

		SELECT @idForo = (SELECT IDForo FROM fc_alumnos WHERE ID = @idAlumno)

		-- Se borra el alumno
		DELETE fc_alumnos WHERE ID = @idAlumno
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		DELETE fc_relAlumnoCurso WHERE Alumno = @idAlumno
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError

		-- Se borra el usuario del foro y sus relaciones
		SELECT @usuarioForo = (SELECT username FROM foroCursos_users WHERE user_id = @idForo)
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		DELETE foroCursos_users WHERE user_id = @idForo
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		DELETE foroCursos_groups WHERE group_id IN (SELECT group_id FROM foroCursos_user_group WHERE user_id = @idForo)
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		DELETE foroCursos_user_group WHERE user_id = @idForo
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		UPDATE foroCursos_posts SET poster_id = -1, post_username = @usuarioForo
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		UPDATE foroCursos_vote_voters SET vote_user_id = -1 WHERE vote_user_id = @idForo
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		UPDATE foroCursos_topics SET topic_poster = -1 WHERE topic_poster = @idForo
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError
		DELETE foroIm_topics_watch WHERE user_id = @idForo
		SET @Error = @@Error
		IF (@Error<>0) GOTO TratarError

	COMMIT TRAN

TratarError: 
	IF @Error<>0
	BEGIN
		ROLLBACK TRAN
		SELECT @Error
	END

END
Espero que esté bien. No lo he comprobado a fondo.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!