Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Reporte para agenda diaria

Estas en el tema de Reporte para agenda diaria en el foro de SQL Server en Foros del Web. Buen dia, tengo un problema con una consulta que debo hacer y no encuentro la manera de hacerla aunque ya estuve casi todo el dia ...
  #1 (permalink)  
Antiguo 09/08/2012, 16:42
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Pregunta Reporte para agenda diaria

Buen dia, tengo un problema con una consulta que debo hacer y no encuentro la manera de hacerla aunque ya estuve casi todo el dia con la quebradera de cabeza XD.

Verán, debo hacer una consulta para sacar una agenda diaria que inicie a las 7am y vaya incrementando cada 30 minutos, el problema esta en que en la tabla solamente se guardan los datos de los que seria por asi decirlo "la cita" que se tiene a una hora especifica, pero en el reporte deben salir todas las horas sin importar si hay o no alguna cita (estoy trabajandolo con ReportViewer en Visual Basic 2010 en Window Forms)

Quedaria mas o menos algo asi

Usuario:
Hora | Descripcion
7:00 |
7:30 | Reunion en sala A
8:00 |
8:30 |
9:00 | Reunion Grupo XX
9:30 |

.
.
.

Y asi sucesivamente hasta llegar a las 7 pm, cabe aclarar que esta consulta se repetira por cada persona, es decir, se mostrará una agenda completa por cada usuario.

Tengo una tabla de citas con los datos:
-Usuario
-FechaInicio (de este campo tipo datetime se llamara la hora)
-FechaFin
-Tarea


Bueno, esa es la duda y si no me di a entender con algo pueden preguntar :D

De antemano muchas gracias por su ayuda.
  #2 (permalink)  
Antiguo 09/08/2012, 22:21
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Reporte para agenda diaria

En estes casos se utiliza generalmente una tabla fija de numeros o una vista dedicada para crear todos los dias y todas las horas,
y con esta consulta se hace Left Join con los diarios de los usuarios.

Hay que empesar con la tarea de crear la tabla de numeros o la vista que crea los dias y las horas las horas (sin o con la tabla de los numeros);
y seguir con el Left join.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 10/08/2012, 07:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Reporte para agenda diaria

no se si quieras lograr esto:

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. fecha VARCHAR(MAX)
  3. )
  4.  
  5.  
  6. DECLARE @x INT
  7. SET @x=7
  8. while @x<19
  9. BEGIN
  10.     INSERT INTO #temp SELECT CONVERT(VARCHAR(20),@x) + ':00'
  11.     INSERT INTO #temp SELECT CONVERT(VARCHAR(20),@x) + ':30'
  12.    
  13.     SET @x=@x+1
  14. END
  15.  
  16.  
  17. SELECT * FROM #temp

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 10/08/2012, 10:47
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Reporte para agenda diaria

Gracias a ambos por sus ideas, gracias a ambos logré hacer que se generara la agenda para uno solo, pero tengo problemas para cuando tengo mas de un registro para una hora especifica, por ejemplo si 2 usuarios tienen una tarea o cita para la misma hora entonces existe mas de un registro y genera un error:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

pongo aca el codigo para que lo vean a ver si me dan una idea de como hacer para esos casos, como les digo si mando el codigo de un usuario especifico todo bien, pero si se le manda 0 (osea todos) ahi da error, de antemano muchas gracias por su ayuda.

Código:
ALTER PROCEDURE [dbo].[spagendadiaria]
	-- Add the parameters for the stored procedure here
@hi as datetime = getDate,
@hf as datetime = getDate,
@formato varchar(2) = '00',
@cant int = 0,
@medico int = 0
AS
BEGIN
if not exists  (select * from sysobjects where name='#temp' and xtype='U')
begin
create table #temp(
hora varchar(8),
paciente varchar(100),
medico varchar(200)
)
end
declare @hora varchar(8)
declare @paciente varchar(100)
declare @nombreMedico varchar (200)
delete from #temp
while datepart(hour,@hi) <= datepart(hour,@hf)
begin

set @hora = (select convert(varchar(3),datepart(hour,@hi)) + ':' + RIGHT( @formato + cast(datepart(minute,@hi) AS varchar), 2))
set @paciente = (SELECT dbo.Pacientes.nombre + ' ' + dbo.Pacientes.apellido FROM  dbo.Pacientes INNER JOIN dbo.citas ON dbo.Pacientes.codigo = dbo.citas.tarea INNER JOIN dbo.tipoCita ON dbo.citas.tipoCita = dbo.tipoCita.codigo INNER JOIN dbo.usuarios ON dbo.citas.usuario = dbo.usuarios.codigo INNER JOIN dbo.tiposExamenes ON dbo.citas.examen = dbo.tiposExamenes.codigo AND dbo.usuarios.nivel = 3 AND dbo.citas.tipoCita IN (2, 3, 4, 5) where dbo.citas.fechaInicio = @hi and (dbo.citas.usuario = @medico or @medico=0))
set @nombreMedico = (SELECT 'Dr. ' + dbo.usuarios.apellido FROM dbo.Pacientes INNER JOIN dbo.citas ON dbo.Pacientes.codigo = dbo.citas.tarea INNER JOIN dbo.tipoCita ON dbo.citas.tipoCita = dbo.tipoCita.codigo INNER JOIN dbo.usuarios ON dbo.citas.usuario = dbo.usuarios.codigo INNER JOIN dbo.tiposExamenes ON dbo.citas.examen = dbo.tiposExamenes.codigo AND dbo.usuarios.nivel = 3 AND dbo.citas.tipoCita IN (2, 3, 4, 5) where dbo.citas.fechaInicio = @hi and (dbo.citas.usuario = @medico or @medico=0))
insert into #temp values(@hora, @paciente, @nombreMedico)
 
set @hi = dateadd(minute,30,@hi)
end
select * from #temp

END
  #5 (permalink)  
Antiguo 10/08/2012, 11:04
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Reporte para agenda diaria

lo que pasa es que tienes la asignacion de variables para un usuario entonces si selecionas mas de uno ahi truena lo que deberias de hacer es un while por usuario :) algo asi

select nombre_usuario, identity(int,1,1) as rn into #temp2
declare @x int
set @x=1
while @x<select count(*) from #temp2
begin
select nombre from #temp where rn=@x
set @x=@x+1
end


asi sacarias de usuario por usuario y si eso lo implementas en tu while pues podrias sacar los schedules de todos tus pacientes y doctores :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 10/08/2012, 11:34
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Reporte para agenda diaria

Cita:
Iniciado por Libras Ver Mensaje
lo que pasa es que tienes la asignacion de variables para un usuario entonces si selecionas mas de uno ahi truena lo que deberias de hacer es un while por usuario :) algo asi

select nombre_usuario, identity(int,1,1) as rn into #temp2
declare @x int
set @x=1
while @x<select count(*) from #temp2
begin
select nombre from #temp where rn=@x
set @x=@x+1
end


asi sacarias de usuario por usuario y si eso lo implementas en tu while pues podrias sacar los schedules de todos tus pacientes y doctores :)
Hola Libras, pues eso realmente seria buena opcion en el caso perfecto de que los codigos fuesen incrementando de 1 en 1, pero no es mi caso, en este caso como han entrado y han salido muchos medicos hay muchos saltos entre codigos, por ejemplo del 61 salta al 82, del 82 al 94 y asi sucesivamente, entonces si hiciera eso me trataria de leer por ejemplo desde el codigo 1 al 3 (en caso que hayan 3 usuarios con citas a esa misma hora) pero esos codigos nisiquiera existen XD o no sé no entendi bien el ejemplo, sino me corriges.

Habra alguna manera que en vez de usar un count se puedan mandar a llamar codigos dentro del while y recorrerlo por cada codigo existente?

Muchas gracias nuevamente y perdona que moleste con eso, pero soy algo malo para este tipo de consultas XD
  #7 (permalink)  
Antiguo 10/08/2012, 11:56
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Reporte para agenda diaria

para eso es el identity :) para que cada renglon tenga un numero unico(diferente al que manejas en tu tabla) esto para que puedas recorrerla sin fijarte en si tienes saltos

digamos quedaria la tabla

nombre rn
juan 1
juan2 2
juan1 3


aunque en tu tabla tengas

nombre id
juan 25
juan2 80
juan3 1


asi podrias recorrer por nombre asi la primera vez nada mas buscarias lo que tenga juan la segunda vez juan2 y asi sucesivamente

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 10/08/2012, 12:37
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Reporte para agenda diaria

Gracias Libras por la ayuda, el problema ha sido resuelto, ahora el problema sera en el reportViewer pero creo que no hay foro de eso aca asi que tendré que ver donde buscar XD
  #9 (permalink)  
Antiguo 10/08/2012, 12:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Reporte para agenda diaria

:apla uso:
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: agenda, horas, rangos, server, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:33.