none
Cambiar estados automáticamente RRS feed

  • Pregunta

  • Buenos días, ayer hice una pregunta: https://social.msdn.microsoft.com/Forums/es-ES/9d605eed-a2de-47ef-ab28-f89ef0ac61c8/cambiar-estado-automaticamente-segun-fechas-de-vencimiento-y-por-vencer?forum=sqlserveres

    Después de leer las respuestas, estuve investigando y tuve que desinstalar mi version de sql ya que tenia la version express y no me permitia hacer "trabajos"(agente sql server). Ahora comprendo la manera de hacer un trabajo, lo que quiero hacer es un procedimiento almacenado que se ejecute cada cierto tiempo para cambiar el estado de una facturas: "Enviada", "Por Vencer", "Vencida", el estado "Pagada" lo cambia de forma manual el usuario. Don Willams Morales me facilito un procedimiento almacenado para ejecutarlo, pero este me crea una columna nueva sin nombre donde efectivamente muestra los estados de las facturas, pero yo necesito que el estado cambie dentro de la columna estado. Ahora mi consulta es la siguiente lo he intentado pero sin obtener resultados buenos, Puedo asignarle un nombre a esta columna nueva? o mejor aun, la Columna "Estado", puede reflejar esos cambios?. Espero su respuesta y de ante mano gracias.

    Les dejo la consulta:

    SELECT
        CASE  
    	   WHEN DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) >= 0  then 'Vencida'
    	   when DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) >= -5 THEN 'Por Vencer' 
    	   ELSE /*MENOR A CERO*/ 'Enviada'
        END,
    	P.Num_Cotizacion as [N° Cotización],
    	p.Num_OC_Cliente as [N° O.C.],
    	N_Factura as [N° Factura],
    	C.Nombre as [Nombre Cliente],
    	p.Descripcion_Proyecto as [Nombre Proyecto],
    	Fecha_Emision as [Fecha de Emisión],
    	Fecha_Vencimiento as [Fecha de Vencimiento],
    	E.Estado AS [Estado],
    	Neto,
    	Iva,
    	Total,
    	Observaciones,
    	Pdf_Factura_Electronica as [Ruta PDF]
    FROM 
        Tbl_Facturas_Electronicas FE
        LEFT JOIN Tbl_Cliente C ON (FE.Rut_Cliente = C.Rut)
        LEFT JOIN Tbl_Proyecto P on (fe.Centro_Costo_Proyecto = p.Centro_Costo)
        LEFT JOIN Tbl_Estado_Facturas E ON (FE.Estado = E.Id)	   
    WHERE 
        e.Estado = 'Enviada'
        AND DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) <= 5
    GO

     

    viernes, 17 de marzo de 2017 13:29

Respuestas

  • adriian.91,

    Evita las combinatorias LEFT JOIN que para el caso no es necesario y escribe el valor del ID para cada estado:

    UPDATE Tbl_Facturas_Electronicas
    SET
        Estado =     
    	   CASE  
    		  WHEN DATEDIFF(DAY, Fecha_Vencimiento, GETDATE()) >= 0  
    			 THEN 2 /*Escribir valor de Estado.Id para VENCIDA*/
    		  WHEN DATEDIFF(DAY, Fecha_Vencimiento, GETDATE()) >= -5 
    			 THEN 3 /*Escribir valor de Estado.Id para POR VENCER*/
    	   END
    WHERE 
        Estado = 1 /*Escribir valor de Estado.Id para ENVIADA*/
        AND DATEDIFF(DAY, Fecha_Vencimiento, GETDATE()) <= 5
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 viernes, 17 de marzo de 2017 14:11
    viernes, 17 de marzo de 2017 13:52
  • Yo dejaria que Willams mismo te conteste, pero en este caso es solo cambiar la senetencia SELECT por UPDATE.

    Algo asi como:

    UPDATE
        FE
    SET
        FE.Estado = 
        CASE  
    	   WHEN DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) >= 0  THEN (SELECT Id FROM Tbl_Estado_Facturas WHERE Estado = 'Vencida')
    	   when DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) >= -5 THEN (SELECT Id FROM Tbl_Estado_Facturas WHERE Estado = 'Por Vencer') 
    	   ELSE /*MENOR A CERO*/ (SELECT Id FROM Tbl_Estado_Facturas WHERE Estado = 'Enviada')
        END
    FROM 
        Tbl_Facturas_Electronicas FE
        LEFT JOIN Tbl_Cliente C ON (FE.Rut_Cliente = C.Rut)
        LEFT JOIN Tbl_Proyecto P on (fe.Centro_Costo_Proyecto = p.Centro_Costo)
        LEFT JOIN Tbl_Estado_Facturas E ON (FE.Estado = E.Id)	   
    WHERE 
        E.Estado = 'Enviada'
        AND DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) <= 5
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta adriian.91 viernes, 17 de marzo de 2017 14:11
    viernes, 17 de marzo de 2017 13:44

Todas las respuestas

  • Yo dejaria que Willams mismo te conteste, pero en este caso es solo cambiar la senetencia SELECT por UPDATE.

    Algo asi como:

    UPDATE
        FE
    SET
        FE.Estado = 
        CASE  
    	   WHEN DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) >= 0  THEN (SELECT Id FROM Tbl_Estado_Facturas WHERE Estado = 'Vencida')
    	   when DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) >= -5 THEN (SELECT Id FROM Tbl_Estado_Facturas WHERE Estado = 'Por Vencer') 
    	   ELSE /*MENOR A CERO*/ (SELECT Id FROM Tbl_Estado_Facturas WHERE Estado = 'Enviada')
        END
    FROM 
        Tbl_Facturas_Electronicas FE
        LEFT JOIN Tbl_Cliente C ON (FE.Rut_Cliente = C.Rut)
        LEFT JOIN Tbl_Proyecto P on (fe.Centro_Costo_Proyecto = p.Centro_Costo)
        LEFT JOIN Tbl_Estado_Facturas E ON (FE.Estado = E.Id)	   
    WHERE 
        E.Estado = 'Enviada'
        AND DATEDIFF(DAY, FE.Fecha_Vencimiento, GETDATE()) <= 5
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta adriian.91 viernes, 17 de marzo de 2017 14:11
    viernes, 17 de marzo de 2017 13:44
  • adriian.91,

    Evita las combinatorias LEFT JOIN que para el caso no es necesario y escribe el valor del ID para cada estado:

    UPDATE Tbl_Facturas_Electronicas
    SET
        Estado =     
    	   CASE  
    		  WHEN DATEDIFF(DAY, Fecha_Vencimiento, GETDATE()) >= 0  
    			 THEN 2 /*Escribir valor de Estado.Id para VENCIDA*/
    		  WHEN DATEDIFF(DAY, Fecha_Vencimiento, GETDATE()) >= -5 
    			 THEN 3 /*Escribir valor de Estado.Id para POR VENCER*/
    	   END
    WHERE 
        Estado = 1 /*Escribir valor de Estado.Id para ENVIADA*/
        AND DATEDIFF(DAY, Fecha_Vencimiento, GETDATE()) <= 5
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 viernes, 17 de marzo de 2017 14:11
    viernes, 17 de marzo de 2017 13:52
  • Muchas gracias a los dos. Es lo que necesitaba.
    viernes, 17 de marzo de 2017 14:12