Usuario
Con un conteo en una base de datos, que me modifique solo el valor de una columna.

Pregunta
-
Hola a todos, saludos.
voy a tratar de ser lo mas claro en mi consulta, para que me puedan dar su valiosa idea.
yo tengo una base de datos en donde tengo muchas tablas, tengo una 'empleado' que es donde se encuentra el registro que quiero modificar, la columna se llama estado, el cual puede tener solo dos valores, que son pendiente y finalizado.
Por default al momento de guarda el empleado este lo hará con el valor de pendiente, por que?, ok les explico.
mi Sistema trata de gestionar los perfiles de empleado de la empresa, ya sabemos que para optar a un puesto necesitamos tener una educación formal y una no forma(estos son los cursos que define la empresa, con respecto al puesto).
Yo tengo una tabla en donde creo todos los cursos.
Tengo una Tabla que se llama 'cursosPerfil', esta es donde yo tomo los cursos de la tabla 'Cursos' y los almacenos, lo hago con respecto al puesto ejm:
si el Puesto es Jefe de Contabilidad, necesita los siguientes cursos:
1. Taller para Gestores de Calidad ISO 9001
2. Atención y Servicio al Cliente
3. Seminario NIIF´s
4. Liderazgo
5. RAS y RSPO
Ahora yo tengo otra tabla que se llama 'empleadosPerfil', este es donde yo ingreso el código del empleado que creo y que tiene por default el valor pendiente(se que se preguntaran por que pendiente), bueno esta tabla guardara los cursos que ha tomado el empleado, con respecto a su perfil, si seguimos con el ejemplo de Jefe de contabilidad, yo en esta tabla tengo un registro en donde especifico el estado del curso, que puede ser "cursado" y "no cursado".
Si ustedes notan, son 5 cursos que tiene el Puesto y por ende podemos decir el Perfil necesita 5 cursos no formales para que este completo.
Yo quiero que cuando en la tabla 'empleadosPerfil' todos los cursos estén con el estado cursado, automáticamente me edite solo el registro de la tabla empleados, que cambie de 'Pendiente' a 'Finalizado'
- Cambiado Enrique M. Montejo jueves, 25 de abril de 2013 18:02 Acceso a datos
Todas las respuestas
-
podrias hacer un procedure o desde codigo pero recuperarias de la tabla cursosPerfil los cursos del perfil del usuario
SELECT COUNT(*) FROM cursosPerfil WHERE perfil = @perfil
cuando obtienes ese valor lo comparas con los cursos que tomo el empleado
SELECT COUNT(*) FROM empleadosPerfil WHERE empleado= @empleado
si la comparacion da igual haces
UPDATE Empleado SET estaodo = 'Finalizado' WHERE empleado= @empleado
o sea recupoeras dos cuantas de registors y las comparas para saber si cambias d eestado o no
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Exacto, sabia que habia que usar el Count, pero me parece excelente, muy practico, gracias Leandro, lo pondre en practica.
Pero mi pregunta, todo eso lo puedo hacer desde un procedimiento verdad y tiene que ser en el formulario en donde le agrego los cursos al Empleado, en la tabla 'empleadosPerfil'
-
si te animas desde un procedure se podria hacer
alli podrias declarar variables para contener los valores de los count y puego en un IF comparas para lanzar el update o no
esto lo podrias poner en el mismo procedure que uses para asociar un curos al perfil del empleado
Leandro Tuttini
Blog
Buenos Aires
Argentina -
he hecho procedure, pero normales, donde declaro las variables, pero nunca lo he hecho tomando datos de dos tablas y tampoco con if, ahí si me quede un poco nublado, soy novaton en esto, gracias a estos foros he avanzado y también gracias a unos ejemplos tuyos, dame una idea por favor.
-
usarias
DECLARE @cantperfil AS INT
SELECT @cantperfil = COUNT(*) FROM cursosPerfil WHERE perfil = @perfil
lo mismo con el otro select y luego haces
IF @cantperfil = @cantempleado THEN
--aqui el update
END IF
Leandro Tuttini
Blog
Buenos Aires
Argentina -
ALTER procedure [dbo].[editarEstado]
@codPerfil varchar(10),
@numEmpleado varchar(10),
@cantPerfil as int,
@cantCurso as int
--as
SELECT @cantPerfil = COUNT(*) FROM cursosPerfil WHERE codperfil = @codperfil
SELECT @cantCurso = COUNT(*) FROM empleadosPerfil WHERE numEmpleado= @numempleado
IF @cantPerfil = @cantCurso then
UPDATE Empleado
SET estado = 'Finalizado'
WHERE numempleado= @numEmpleado
END IFasí quedaría entonces Leandro?
ahora, como hago la programación en .net.
Se que son cosas elementales, pero es que aun no domino esta parte.
-
por el trabajo no habia entrado al foro, pero Leandro, con el procedimiento almacenado me da errores:
Mens 156, Nivel 15, Estado 1, Procedimiento editarEstado, Línea 11
Sintaxis incorrecta cerca de la palabra clave 'then'.
Mens 156, Nivel 15, Estado 1, Procedimiento editarEstado, Línea 15
Sintaxis incorrecta cerca de la palabra clave 'IF'.Ayuda porfa
create procedure [dbo].[editarEstado]
@codPerfil varchar(10),
@numEmpleado varchar(10),
@cantPerfil as int,
@cantCurso as int
as
SELECT @cantPerfil = COUNT(*) FROM cursosPerfil WHERE codperfil = @codperfil
SELECT @cantCurso = COUNT(*) FROM empleadosPerfil WHERE numEmpleado= @numempleado
IF @cantPerfil = @cantCurso then
UPDATE Empleado
SET estado = 'Finalizado'
WHERE numempleado= @numEmpleado
END IF -
Estructuras de control en Transact SQL
me falto el BEGIN END en al definicion del IF
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
la invocacion la realizas con un bloque como ser
Dim dt As DataTabla = New DataTable() Using conn As New SqlConnection("connectionstring") Dim cmd As New SqlCommand("editarEstado", conn) cmd.CommandType = SqlCommandType.StoredProcedure cmd.Parameters.AddWithValue("@codPerfil", valor) .
. cmd.ExecutenonQuery() End Using
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Hola Leandro, gracias por ayudarme, no habia respondido por que estamo en semana santa y aqui en la empresa andamos corriendo.
Asi deje el procedimiento almacenado:
ALTER procedure [dbo].[editarEstado]
@codPerfil varchar(10),
@numEmpleado varchar(10),
@cantPerfil as int,
@cantCurso as int
as
SELECT @cantPerfil = COUNT(*) FROM cursosPerfil WHERE codPerfil = @codPerfil
SELECT @cantCurso = COUNT(*) FROM empleadosPerfil WHERE numEmpleado= @numempleado
IF @cantPerfil = @cantCurso
begin
UPDATE Empleados
SET Estado = 'Finalizado'
WHERE numEmpleado= @numEmpleado
ENDel bloque en .net lo deje asi:
Try
Dim dt As DataTable = New DataTable()
Using conn As New SqlConnection("Data Source=TECNOLOGIA\SQLEXPRESS;Initial Catalog=RRHH;Integrated Security=True")
Dim cmd As New SqlCommand("editarEstado", conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@codPerfil", txtCodigoPuesto.Text)
cmd.ExecuteNonQuery()
End Using
Catch ex As Exception
MsgBox(ex.Message)
End Try. -
ahora una cosa mas Leandro, solo recordar, que a veces se editan y eliminan los registro, por ejemplo si ya estaba terminado todo el historia, pero se elimina uno registro, deberia usar un else, para que coloque Pendiente de nuevo.
asi:
ALTER procedure [dbo].[editarEstado]
@codPerfil varchar(10),
@numEmpleado varchar(10),
@cantPerfil as int,
@cantCurso as int
as
SELECT @cantPerfil = COUNT(*) FROM cursosPerfil WHERE codPerfil = @codPerfil
SELECT @cantCurso = COUNT(*) FROM empleadosPerfil WHERE numEmpleado= @numempleado
IF @cantPerfil = @cantCurso
begin
UPDATE Empleados
SET Estado = 'Finalizado'
WHERE numEmpleado= @numEmpleado
END
ELSE
BEGIN
UPDATE Empleados
SET Estado = 'Pendiente'
WHERE numEmpleado= @numEmpleado
END