none
Sumar Egresos RRS feed

  • Pregunta

  • Hola a todos, les comento tengo dos tablas una "Tbl_Proyecto" con sus campos Id, Nombre, Fondos_asignados, Fondos_Ocupados y Fondos Restantes. La segunda "Tbl_Egresos" con sus campos: Id, Monto, Motivo, Estado. Es una pequeña aplicación que registra proyectos, a estos proyectos se les asigna un fondo de dinero. Estos fondos pueden ser utilizados por Trabajadores. Cuando hacen la solicitud de fondos, alguien debe aprobarla primero. Una vez aprobada se le entrega el fondo y este se resta del fondo inicial, o restante. Mi problema es que no puedo hacer la resta de los fondos restantes o fondo inicial en cualquiera de los casos, no se me ocurre. Tampoco se si lo estoy planteando bien con las tablas mencionadas. Puedo crear el proyecto, hacer la solicitud, y cambiar el estado de los fondos solicitados, pero vuelvo a insistir no he podido lograr hacer la resta entre los fondos asignados y los fondos pedidos. Como ultima aclaración los fondos que solicitan los trabajadores pueden sobrapasar los fondos asignados inicialmente. Alguien me puede ayudar a resolver este problema?   
    martes, 17 de enero de 2017 20:13

Respuestas

  • adriian.91,

    Si los valores los puedes calcular entonces no es necesario contenerlos en una columna, bastará con que la tabla [Proyectos] tenga la columna [FondosAsignados], los fondos ocupados y disponibles resultarán de la suma y diferencia de los egresos, algo como:

    /*Creación de tablas*/
    DECLARE @Proyecto table (IdProyecto int, Nombre varchar(100), FondoAsignado decimal(9,2));
    DECLARE @Egresos table (IdEgreso int, IdProyecto int, Monto decimal(9,2));
    
    /*Datos de prueba*/
    INSERT INTO @Proyecto VALUES
        (1, 'Proyecto 1', 5000),
        (2, 'Proyecto 2', 3500);
    INSERT INTO @Egresos VALUES
        (1, 1, 450),
        (2, 2, 150),
        (3, 1, 200),
        (4, 1, 450),
        (5, 2, 150),
        (6, 1, 200);
    
    /*Consulta para obtener información del proyecto y fondos*/
    SELECT
        p.IdProyecto, p.Nombre,
        p.FondoAsignado AS [FondoAsignado],
        SUM(e.Monto) AS [FondoOcupado],
        p.FondoAsignado - SUM(e.Monto) AS [FondoDisponible]
    FROM
        @Proyecto p
        LEFT JOIN @Egresos e ON (p.IdProyecto = e.IdProyecto)
    GROUP BY
        p.IdProyecto, p.Nombre, p.FondoAsignado;
    GO

    - Resultado:


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator miércoles, 18 de enero de 2017 15:46
    • Marcado como respuesta adriian.91 miércoles, 18 de enero de 2017 16:34
    martes, 17 de enero de 2017 21:40

Todas las respuestas

  • adriian.91,

    Si los valores los puedes calcular entonces no es necesario contenerlos en una columna, bastará con que la tabla [Proyectos] tenga la columna [FondosAsignados], los fondos ocupados y disponibles resultarán de la suma y diferencia de los egresos, algo como:

    /*Creación de tablas*/
    DECLARE @Proyecto table (IdProyecto int, Nombre varchar(100), FondoAsignado decimal(9,2));
    DECLARE @Egresos table (IdEgreso int, IdProyecto int, Monto decimal(9,2));
    
    /*Datos de prueba*/
    INSERT INTO @Proyecto VALUES
        (1, 'Proyecto 1', 5000),
        (2, 'Proyecto 2', 3500);
    INSERT INTO @Egresos VALUES
        (1, 1, 450),
        (2, 2, 150),
        (3, 1, 200),
        (4, 1, 450),
        (5, 2, 150),
        (6, 1, 200);
    
    /*Consulta para obtener información del proyecto y fondos*/
    SELECT
        p.IdProyecto, p.Nombre,
        p.FondoAsignado AS [FondoAsignado],
        SUM(e.Monto) AS [FondoOcupado],
        p.FondoAsignado - SUM(e.Monto) AS [FondoDisponible]
    FROM
        @Proyecto p
        LEFT JOIN @Egresos e ON (p.IdProyecto = e.IdProyecto)
    GROUP BY
        p.IdProyecto, p.Nombre, p.FondoAsignado;
    GO

    - Resultado:


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator miércoles, 18 de enero de 2017 15:46
    • Marcado como respuesta adriian.91 miércoles, 18 de enero de 2017 16:34
    martes, 17 de enero de 2017 21:40
  • Gracias willams :D
    miércoles, 18 de enero de 2017 16:35