Principales respuestas
Cambiar estados automáticamente

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
Respuestas
-
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
-
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
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
-
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
-