Tengo problemas con mi base de datos y las fechas y ordenación de los contratos

Disculpa hace unos días me ayudastes en este caso, y parecía que todo iba muy bien. Pero llegue a un punto de contradicción.
- El caso es el siguiente: Cuando yo en mi bd agrego un nuevo Contrato Proyecto, y le pongo la fecha de termino (por ejemplo: 07/07/2010, siendo esa fecha menor a la Actual). Entonces el personal asignado a este contrato podría ser llamado para otro contrato proyecto posterior (por ejemplo con una fecha de termino de 07/08/2010). Pero no da.
- Esto fue lo que me ayudastes:
create proc sp_actualiza_contrata
(
@fecha varchar(8)
)
As
update personal
set personal_estado='Disponible'
where personal_id in (
select personal_id from asignacion  where cproyecto_id in
(select cproyecto_id from contratoproyecto where cproyecto_fechatermino <=@fecha  group by cproyecto_id))
go
--Select * from personal
--update personal set personal_estado='Ocupado'
- Pero quisiera que me evalúe desde el ultimo contrato hasta el primer contrato (con respecto a su id). Por ejemplo: Que comience evaluando Contrato_7, Contrato_6, ..., Contrato_1 y así poder ir actualizando los estados del personal tomando como referencia el ultimo contrato que siempre sera la fecha de termino mayor.
- Espero me hayas entendido, espero tu ayuda. Gracias...
Todo parece ser que aquí estaría el cambio:
(select cproyecto_id from contratoproyecto where cproyecto_fechatermino <=@fecha  group by cproyecto_id))
¿Cómo hacer que me comience evaluando desde el ultimo contrato al primero?

1 Respuesta

Respuesta
1
Me queda una duda.. El store. ¿Esta funcionando como debe?.. por lo que comentas al inicio. Me queda la impresión que no. y bueno con respecto a tu duda el update que tiene el store debería de afectar a todos los contratos sin necesidad de ir evaluando uno por uno.
Aunque si de todas maneras deseas cambiar a esa manera, se tendría que elaborar un cursor en el store. el select del cursor seria :
--Tendrías que poner Alter ya que el store ya existe, y solo necesitamos modificar su --contenido
Alter proc sp_actualiza_contrata
(
@fecha varchar(8)
)
As
Declare @proyect varchar(10)
Declare proyect  cursor for
select cproyecto_id from contratoproyecto where cproyecto_fechatermino <=@fecha  group by cproyecto_id cpropecto_fechatermino desc
OPEN proyect
        FETCH proyect INTO @proyect
        WHILE @@FETCH_STATUS =0
        BEGIN
        update personal
set personal_estado='Disponible'
where personal_id in (
select personal_id from asignacion  where cproyecto_id in(@proyect)
        FETCH proyect INTO @proyect
        END
        CLOSE proyect
        DEALLOCATE proyect
Go
---------------------------------------------
Esto bastaría, aunque se generan mayores pasos a comparación de lo anterior. A menos que lo anterior no este funcionando como debe!. Ya nos comunicaremos.
mmm.. k novedades.. ¿funko o nada?
Disculpa por no Contestarte ...
Bueno respecto a tu código que me has brindado para solucionar mi problema ... hay dos errores:
primer error ...
select cproyecto_id from contratoproyecto where cproyecto_fechatermino <=@fecha  group by cproyecto_id cproyecto_fechatermino desc
este de aca arregle ...
select top 2 cproyecto_id from contratoproyecto where cproyecto_fechatermino <=@fecha  group by cproyecto_id
order by cproyecto_id desc
me podrias decir que si estaria bien asi como lo puse k solo me analize los dos ultimos contratos
Tu crees que estaría bien como lo puse ... espero tu pronata rpta
Bueno en el error que tuve puse esto
select cproyecto_id from contratoproyecto where cproyecto_fechatermino <=@fecha  group by cproyecto_id
order by cproyecto_id desc
Y me funciona bien el procedimiento almacenado...
Ahora tengo un inconveniento
En mi tabla contratoproyecto tengo 3 proyectos guardados : cp01 asignado en este proyecto el personal (per01, per04, per07, per05) y su fecha de termino es menor a la actual ;  cp02 asignado en este proyecto el personal (per02, per03, per06, per09) y su fecha de termino es menor a la actual ;  cp03 asignado en este proyecto el personal (per02, per04, per09) y su fecha de termino es mayor  a la actual ;
Ahora lo que quiero hacer es que me actualize solo los estados del personal que esta asignado en un proyecto que ya concluye pero si ese personal esta asignado en un proyecto que tdvia no concluye no me lo actualize su estado ... me podrías ayudar ... gracias de antemano
Mmmm. Si la fecha de termino de esos contratos es mayor ala fecha actual. Obviamente el store no los tomara en cuenta.. como que es algo contradictorio lo que solicitas, ya que no cumple con tus requerimientos iniciales.
Ahora si deseas hacerlo de todos modos crea otro store pero que esta vez reciba como parámetro el nro de contrato que deseas evaluar.
Create proc sp_actualiza_contrata_nro
(
@proyect varchar(6)--no se cuantos dígitos son. Tendrías que corregir esto
)
As
update personal
set personal_estado='Disponible'
where personal_id in (
select personal_id from asignacion  where cproyecto_id in(@proyect)
Go
--Y nada más!, este store ya no evaluara la fecha sino directamente el nro.
Con respecto al error que tenias en el otro script. Pues esta bien tus cambios. Olvide poner el order by.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas