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

  • 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'

    lunes, 25 de marzo de 2013 14:44

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

    lunes, 25 de marzo de 2013 14:58
  • 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'

    lunes, 25 de marzo de 2013 15:11
  • 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

    lunes, 25 de marzo de 2013 15:18
  • 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.
    lunes, 25 de marzo de 2013 15:25
  • 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

    lunes, 25 de marzo de 2013 15:34
  • 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 IF

    así 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.

    lunes, 25 de marzo de 2013 15:48
  • 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

    lunes, 25 de marzo de 2013 21:33
  • hola

    Estructuras de control en Transact SQL

    me falto el BEGIN END en al definicion del IF

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 25 de marzo de 2013 23:39
  • 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

    lunes, 25 de marzo de 2013 23:41
  • 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
    END 

    el 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.

    martes, 26 de marzo de 2013 15:29
  • 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

    martes, 26 de marzo de 2013 15:32