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

Hacer una consulta

Estas en el tema de Hacer una consulta en el foro de SQL Server en Foros del Web. Hola, estoy haciendo una web q hace consultas a una base de datos y en uno de los campos necesito lo siguiente: Extraigo de la ...
  #1 (permalink)  
Antiguo 10/08/2010, 03:18
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Hacer una consulta

Hola, estoy haciendo una web q hace consultas a una base de datos y en uno de los campos necesito lo siguiente:

Extraigo de la base de datos para cada rol los usuarios q pertenecen a él (eso sé hacerlo).
Lo que quiero sq me muestre uno por semana (van por orden alfabético), cambiando al siguiente el lunes a las 8 de la mañana, si el siguiente no está de vaccaciones (es decir q no genera excepción).

Alguan idea sobre como hacerlo??

Muchas gracias
  #2 (permalink)  
Antiguo 10/08/2010, 09:19
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

Qué campos tiene tu tabla y tambien muestranos el codigo que ya tienes.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 11/08/2010, 00:37
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Bueno sq igual lo que no se hacer debo hacerlo en javascript, pq las consultas sql ya las tengo.
Obtengo una tabla con los nombres de varias personas que no estan de vacaciones.
hasta ahí bien, pero ahora tengo q hacer q el programa escoja el 1º de esas personas y cada lunes a las 8 cambie y me muestre el siguiente durante toda la semana hasta el siguiente lunes a las 8 y así que vayan rotando sucesivamente....

Quizas deberia haber puesto la pregunta dentro de javascript...
  #4 (permalink)  
Antiguo 11/08/2010, 09:00
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

No creo que con javascript puedas hacer un cursor.
Sigo esperando tu codigo si quieres que te ayude.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 12/08/2010, 08:39
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Te explico, yo tengo lo siguiente ya echo es lo siguiente;

//Obtengo el nombre y apellidos de los usuarios que pertenecen a ese rol y que a fecha de hoy no están ni de vacaciones ni de baja:

var sql = "SELECT stdUsuarios.nombre, stdUsuarios.apellidos FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
+ " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
+ " WHERE stdRoles_rol = '" + id_guardia + "' AND (excepcion = 0 OR horas != 0)"
+ " AND DATEPART(dd, fecha)=" + date.getDate()
+ " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
+ " AND DATEPART(yy, fecha)=" + date.getFullYear() + " order by apellidos";

rs.Open(sql, conn, adOpenForwardOnly, adLockOptimistic, adCmdText);

Response.Write("<font style='color:black; font-size:12;'><b> - Operaciones: </b></font>")

for (; !rs.EOF; rs.MoveNext()) {

Response.Write("<font style='color:black; font-size: 11;'>" + rs.Fields(1).Value + ", " + rs.Fields(0).Value +"</font><br>");
}

rs.Close;
conn.Close;
%>

Este código me muestra en mi pagina el nombre de las personas q cumplen las condiciones de no estar hoy de vacaciones y pertenecer al grupo.

Guardias: Jose Luis Gomez
Manuel Velasco

Lo que yo quiero sq esta semana me muestre la 1º de ellas (q es la que tendrá q estar de guardia esta semana),
y que el lunes q viene a partir de las 8 me muestre la siguiente, y el lunes siguiente la siguiente y asi sucesivamente....

Es hacer una rotacion de guardias por semanas, pero no se como realizar esa rotación.

Saludos¡¡
  #6 (permalink)  
Antiguo 12/08/2010, 10:53
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

Si el orden es alfabetico, entonces podrias agregar un campo de tipo bit que te indicara quien fue el ultimo en hacer la guardia.
Cuando necesites el siguiente, buscaras el mayor a ese campo bit alfabeticamente.
Tengo 2 consultas:
1. el campo fecha que indica?
2. como ejecutaras tu codigo los lunes a las 8?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 12/08/2010, 12:15
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Hacer una consulta

Observacion importante, debes mandar a ejecutar solo PROCEDIMIENTO ALMACENADOS y no enviar T-SQL desde tu cliente, por aquello de las BUENAS PRACTICAS en el desarrollo.

Digo, ya que vas empezando, hazlo bien.
  #8 (permalink)  
Antiguo 13/08/2010, 01:07
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Sonrisa Respuesta: Hacer una consulta

Hola,

si probaré a añadir un campo bit!!

El campo fecha indica las fechas que el usuario tiene marcadas con excepción (es decir de vacaciones o de baja).

Respecto a lo de ejecutar el codigo los lunes a las 8??? Pues no tengo ni idea.
Estuve buscando por internet y de momento lo que encontré fue que creara un procedimiento almacenado (como dice iislas) y un job.
Y que desde el job llamara al procedimiento. Estoy buscando y leyendo cosas para ver como se hace eso...

Alguna idea mejor o algun consejo???

Gracias por responder¡¡¡
  #9 (permalink)  
Antiguo 13/08/2010, 08:34
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Hacer una consulta

Es correcto K_ROL9, para "programar" eventos (ejecuciones), tienes los trabajos (JOB's), es muy facil programarlos
  #10 (permalink)  
Antiguo 17/08/2010, 07:50
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Hola, tengo otra dudilla sobre la consulta q pretendo hacer.

Ya cree la tabla con el usuario de guardia, gracias a ella obtengo el nombre y apellidos del ultimo usuario que estuvo de guardia.

Ahora pa conseguir sacar el siguiente en hacer la guardia querria saber como puedo poner dentro del SELECT un case o algo así para que si el apellido es > que la variable apellido_guardia devuelva el primero (estan por orden alfabetico) pero si el apellido es igual a apellido_guardia me devuelva el que tenga mayor nombre y si no hay yá mas apellidos mayores q el de guardia pues entonces que vualva el primero de la lista (el apellido q alfabeticamente es mas pequeño)

mi select es el de antes:

var sql = "SELECT stdUsuarios.nombre, stdUsuarios.apellidos FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
+ " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
+ " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
+ " AND DATEPART(dd, fecha)=" + date.getDate()
+ " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
+ " AND DATEPART(yy, fecha)=" + date.getFullYear()
+ " order by apellidos";

pero tengo las dos variables nuevas a comparar:

var nom_guardia = rs.Fields(0).Value;
var ape_guardia = rs.Fields(1).Value;

Donde y como puedo añadirle a ese SELECT las nuevas comparaciones??

Muchas gracias
  #11 (permalink)  
Antiguo 17/08/2010, 08:35
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Bueno mirando probé a hacer el siguiente case pero no funciona, nose si no se puede o esta mal la sintaxis o que:

var sql = "SELECT CASE stdUsuarios.nombre, stdUsuarios.apellidos WHEN apellidos < '" + ape_guardia + "' THEN TOP apellidos"
+ " WHEN apellidos = '" + ape_guardia + "' THEN nombre > '" + nom_guardia + "' ELSE apellidos > '" + ape_guardia + "' END"
+ " FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
+ " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
+ " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
+ " AND DATEPART(dd, fecha)=" + date.getDate()
+ " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
+ " AND DATEPART(yy, fecha)=" + date.getFullYear()
+ " order by apellidos, nombre";

lo que pretendo con el case es:
- si los apellidos son menores que el de guardia que vuelva al 1º alfabeticamente
- si el apellidos es igual al de guardia, que obtenga el de mayor nombre
- sino, (es decir q hay alguno mayor) que saque ese

que está mal??
Saludos
  #12 (permalink)  
Antiguo 17/08/2010, 09:09
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

Una ayudita:
Código Javascript:
Ver original
  1. var sql = "SELECT TOP 1 stdUsuarios.nombre,stdUsuarios.apellidos"
  2. + " FROM stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id"
  3. + " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
  4. + " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
  5. + " AND DATEPART(dd, fecha)=" + date.getDate()
  6. + " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
  7. + " AND DATEPART(yy, fecha)=" + date.getFullYear()
  8. + " AND apellidos+nombre > '" + ape_guardia+nom_guardia + "'"
  9. + " order by apellidos, nombre";
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #13 (permalink)  
Antiguo 18/08/2010, 01:19
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Gracias por la respuesta, así funciona bien mientras exista una persona en la lista por encima del de guardia, pero cuando el de guardia es el último no me devuelve nada ( y yo prentedo q vuelva a empezar por el primero de la lista), por ese motivo era por el que intentaba hacer un case o algo asi.

También probé esto:

var sql = "SELECT TOP 1 stdUsuarios.nombre, stdUsuarios.apellidos"
+ " FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
+ " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
+ " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
+ " AND DATEPART(dd, fecha)=" + date.getDate()
+ " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
+ " AND DATEPART(yy, fecha)=" + date.getFullYear()
+ " AND (apellidos+nombre > '" + ape_guardia+nom_guardia + "' OR(apellidos+nombre > '" + ape_guardia+nom_guardia + "') = NULL)"
+ " order by apellidos, nombre";

No se pretendia que me sacara valor cuando hay un valor mayor que el de guardia o para el caso de q no exista salga el primero, pero lo que he puesto no funciona, (tbm he probado alguna otra sintaxis q me dio error).
Sabeis como podria ser???

Muchas gracias por vuestra ayuda.
  #14 (permalink)  
Antiguo 18/08/2010, 08:14
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

Asi debe funcionar:
Código Javascript:
Ver original
  1. var sql = "SELECT TOP 1 stdUsuarios.nombre, stdUsuarios.apellidos"
  2. + " FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
  3. + " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
  4. + " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
  5. + " AND DATEPART(dd, fecha)=" + date.getDate()
  6. + " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
  7. + " AND DATEPART(yy, fecha)=" + date.getFullYear()
  8. + " AND (apellidos+nombre > '" + ape_guardia+nom_guardia + "' OR apellidos+nombre > '" + ape_guardia+nom_guardia + "' = NULL)"
  9. + " UNION"
  10. + " <SELECT para el primer guardian>"
  11. + " order by apellidos, nombre";
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #15 (permalink)  
Antiguo 19/08/2010, 02:13
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Que va sigue sin funcionarme, además si pongo lo de:

"OR apellidos+nombre > '" + ape_guardia+nom_guardia + "' = NULL)"+ " UNION"+ " <SELECT para el primer guardian>"+ " order by apellidos, nombre";

me da error la sentencia sql.

Y quitando eso y poniendo lo siguiente:

var sql = "SELECT stdUsuarios.nombre, stdUsuarios.apellidos, stdUsuarios.id"
+ " FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
+ " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
+ " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
+ " AND DATEPART(dd, fecha)=" + date.getDate()
+ " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
+ " AND DATEPART(yy, fecha)=" + date.getFullYear()
+ " AND apellidos+nombre > '" + ape_guardia + nom_guardia + "'"
+ " UNION"
+ " SELECT TOP 1 stdUsuarios.nombre, stdUsuarios.apellidos, stdUsuarios.id"
+ " FROM (stdUsuarios_stdRoles INNER JOIN stdUsuarios ON stdUsuarios_usuario = stdUsuarios.id)"
+ " INNER JOIN stdAnotacionesCalendario ON stdUsuarios.id = stdUsuarios_id"
+ " WHERE stdRoles_rol = '" + id_rol + "' AND (excepcion = 0 OR horas != 0)"
+ " AND DATEPART(dd, fecha)=" + date.getDate()
+ " AND DATEPART(mm, fecha)=" + (date.getMonth() + 1)
+ " AND DATEPART(yy, fecha)=" + date.getFullYear()
+ " ORDER BY apellidos, nombre";


Me saca el valor bien hasta q llego al ultimo q me devuelve esa misma persona. Además dependiendo de donde ponga el TOP 1 me saca unos valores y otros pero ninguno bien del todo.

Para el ejemplo de arriba me hace lo siguiente:
Tengo 3 personas para rotar:
Aguera
Camblor
Matas

Hasta q el último guardia es Matas lo hace bien pues muestra al siguiente alfabeticamente pero cuando llego a matas me dice q el siguiente es matas otra vez.

Alguna otra idea?

Muchas gracias de todas formas por responder¡¡¡
  #16 (permalink)  
Antiguo 19/08/2010, 07:59
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Otra pregunta mas,

Tengo un procedimiento almacenado, pero como tengo SQL Server 2008 Express he leido que no tiene el Sql Agent para crear jobs.

De que otra forma puedo ejecutar ese procedimiento un determinado dia y hora y ver los datos que genera desde cliente???

Gracias por la ayuda¡¡
  #17 (permalink)  
Antiguo 19/08/2010, 08:26
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

Creo que tendrias que tener 2 consultas: una que te devuelva el guardian alfabeticamente mayor, y otra con solo el primero. Cuando la primera consulta sea cero tomas el registro de la segunda consulta.
Para lo segundo que consultas prueba con estos links:
1. Running Jobs from Command Prompt
2. Tutorial: utilidad sqlcmd
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #18 (permalink)  
Antiguo 20/08/2010, 01:33
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Sonrisa Respuesta: Hacer una consulta

Bueno por fin me funciona¡¡¡

Voy a ponerme a leer el link a ver si llego a buen puerto jeje.

Muchas gracias¡¡
  #19 (permalink)  
Antiguo 20/08/2010, 04:45
 
Fecha de Ingreso: agosto-2010
Mensajes: 29
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Hacer una consulta

Estuve mirando lo que tu dices, una vez q tengo el script que ejecuta el sp tengo que llamarlo desde una tarea de windows, no es así??

Pero he leido q las tareas de windows solo se ejecutan cuando el ordenador esta encendido, deberia programar mi tarea desde un ordenador q este siempre encendido para q funcione?

Otra cosa, tbm he visto que hay programas para descargar como SQL Job Manager que harían la funcion del Sql Agent para las versiones Expess.

Lo has probado o algo??

Que opción crees q es mejor??

Muchas gracias por la ayuda¡¡¡¡
  #20 (permalink)  
Antiguo 20/08/2010, 08:09
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Hacer una consulta

Cita:
Iniciado por k_rol9 Ver Mensaje
Estuve mirando lo que tu dices, una vez q tengo el script que ejecuta el sp tengo que llamarlo desde una tarea de windows, no es así?? Asi es.

Pero he leido q las tareas de windows solo se ejecutan cuando el ordenador esta encendido, deberia programar mi tarea desde un ordenador q este siempre encendido para q funcione? Me parece que tiene que ser el mismo ordenador, que se supone es un servidor.

Otra cosa, tbm he visto que hay programas para descargar como SQL Job Manager que harían la funcion del Sql Agent para las versiones Express.

Lo has probado o algo?? No lo conozco. Pruebalo y nos comentas.

Que opción crees q es mejor?? Lo logico es que se ejecute en el mismo servidor.

Muchas gracias por la ayuda¡¡¡¡
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.

Etiquetas: Ninguno
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:32.