SqlDataReader reader4 = myCommand.ExecuteReader();
SqlDataReader reader5 = myCommand2.ExecuteReader();
while (reader4.Read() && (reader5.Read()))
{
reader4["nombre"]
reader5["nombre"]
.....
}
| ||||
De que se puede hacer lo que pretendes.. si se puede hacer aunque no esta bien visto.. sería así: Cita: Checa bien para que lo vas a ocuparSqlDataReader reader4 = myCommand.ExecuteReader(); SqlDataReader reader5 = myCommand2.ExecuteReader(); while ( reader4.Read() ) { reader5.Read() reader4["nombre"] reader5["nombre"] ..... } Salu2
__________________ Nadie roba nada ya que en la vida todo se paga . . . Exentrit - Soluciones SharePoint & Net |
| ||||
pero porque no utilizas solo una consulta, hombre????? Menudo pedazo de bucle vas a hacer!!!! yo haría (reduzco tu sql, eh??) "SELECT ServNombre,ServId if(servid in(select UsServIdServ from UsuariosServicios where UsServerUsId=" + Request.QueryString["Id"] +"),1,0) as TIENEELSERVICIO from Servicios ORDER BY ServNombre",myConnection2); reader = .... if reader["TIENEELSERVICIO "] // Ya lo tiene else //no lo tiene Si quieres complicarlo más lo ajustamos, pero no seas salvaje y hagas esa barbaridad de 2 bucles concatenados, que no te hace falta. Ah bueno, se me acaba de ocurrir, que esta consulta variará (o no funcionara) dependiendo del gestor de base de datos que utilices |
| ||||
Perdón me faltaba una coma entre ServerId y el if "SELECT ServNombre,ServId, if(servid in(select UsServIdServ from UsuariosServicios where UsServerUsId=" + Request.QueryString["Id"] +"),1,0) as TIENEELSERVICIO from Servicios ORDER BY ServNombre",myConnection2); Te decía que puede dar errores, porque aunque SQL debería ser estandar, no lo es para todos los gestores, es decir, la sintaxis dependerá de tu Gestor de BD, así como a que soporte el IF, Yo uso MYSQL y con esa sentencia, me traería todos los servicios y me indicaría en el TIENEELSERVICIO si el usuario pasado por el Request.QuerySting, tiene ese servicio. Esa consulta el gestor la resuelve en 0.01 sec (vamos rapidisimo). Si usas Access, no se si te la pillará, sería leerte la documentación, si usas otros gestor y te dice sintaxis incorrecta, tendrás que leerte la documentación y buscar los if. |
| ||||
Gracias Al final consegui la consulta a base de pelearme con la sql. El problema que tengo ahora es que la consulta me devuelve esto: ServNombr TipoNombre UsId Lan/Wan Alcobendas Lan/Wan 3 Lan/Wan Valdemoro Lan/Wan 39 Lan/Wan Valdemoro Lan/Wan 3 Lan/Wan Pozuelo Lan/Wan 3 Seguridad Valdemoro Seguridad 39 Seguridad Pozuelo Seguridad 3 Wifi Pozuelo Wifi 3 Y me gustaria que los Lan/Wan Valdemoro como son iguales, que solo me saliera uno. Yo tenia entendido que con la sentencia distinct valia pero la probe y no rula. Gracias por la ayuda compadre |
| ||||
El distinct solo puedes agregar un campo, para lo que tu quieres debes hacer un group by. Si pones como ha quedado tu SQL te digo exactamente como ponerlo. PD: SQL es muy potente y normalmente no se utiliza todo su potencial. Te recomiendo (bueno a todos) que si hago se puede hacer via SQL, hacerlo y no andarse luego con tratamiento de codigo. Tu aplicación será más limpia, aunque sólo es una opinión. |
| ||||
Te doy la razon Estoy de acuerdo contigo la verdad de echo creo que falta un canal aqui en el foro de sql xq es valido para muchos lenguajes de programacion y como dices hace mas limpio el codigo. Yo las sql las suelo hacer con el asistente de access de ahi ke me salgan mal largas pero no me dan problemas de ralentizacion la verdad. Mira mi sql es esta: SELECT DISTINCT Servicios.ServNombre, TipoServicio.TipoNombre, Usuarios.UsId FROM (Clientes INNER JOIN Usuarios ON Clientes.UsIdCli = Usuarios.UsIdCli) INNER JOIN (TipoServicio INNER JOIN (Servicios INNER JOIN UsuariosServicios ON Servicios.ServId = UsuariosServicios.UsServIdServ) ON TipoServicio.TipoId = Servicios.ServIdTipo) ON Usuarios.UsId = UsuariosServicios.UsServIdUs WHERE (((Clientes.UsIdCli)=2)); |
| ||||
Yo lo que hago es abreviar el nombre de las tablas para que no salga tan largo, es decir p.ej. Select S.ServNombre From Servicios S Con esto se reduce un montón el string, te recomiendo que si Access te lo permite, lo utilices. Con respecto a tu problema, primero el distinct tienes que decir que distinct(ServNombre) Veo también que al final solo estás cogiendo los que SI están concatenados, no?? los otros ya no los necesitas??? Segundo, si quieres mostrar solo p.ej. Lan/Wan Valdemoro, ten en cuenta, que vas a perder uno de los 2 valores de UsId, normalmente sólo pillará el último, es decir, te quedaría así: ServNombr TipoNombre UsId Lan/Wan Alcobendas Lan/Wan 3 Lan/Wan Valdemoro Lan/Wan 3 Lan/Wan Pozuelo Lan/Wan 3 Seguridad Valdemoro Seguridad 39 Seguridad Pozuelo Seguridad 3 Wifi Pozuelo Wifi 3 te quedaría si entiendo bien, lo que quieres hacer podrías hacer esto: SELECT DISTINCT(concat(Servicios.ServNombre, TipoServicio.TipoNombre)), Servicios.ServNombre, TipoServicio.TipoNombre, Usuarios.UsId FROM (Clientes INNER JOIN Usuarios ON Clientes.UsIdCli = Usuarios.UsIdCli) INNER JOIN (TipoServicio INNER JOIN (Servicios INNER JOIN UsuariosServicios ON Servicios.ServId = UsuariosServicios.UsServIdServ) ON TipoServicio.TipoId = Servicios.ServIdTipo) ON Usuarios.UsId = UsuariosServicios.UsServIdUs WHERE (((Clientes.UsIdCli)=2)); con esto sólamente te saldrán una vez, pero como te digo perderás valores |
| ||||
Lo que trato de hacer Lo que estoy intentantando hacer es que me muestre todos los servicios del cliente ese. Y una vez mostrados todos que salgan seleccionados los del usuario que tengo marcado en un combo. El problema que me da es que cuando listo con la sql esa todos los servicios pues el lan/wan valdemoro como lo tienen 2 usuarios pues me sale repetido. He puesto el distinct (concact()) pero me dice que no reconoce la palabra concact. Yo uso sql server. |
| ||||
Ahhhhhhhhh, ok ok ok ok As probado lo que te he dicho???-> DISTINCT(concat(Servicios.ServNombre, TipoServicio.TipoNombre)), con eso juntará los strings y sólo te mostrará lo que quieres. Claro que tendrías un problema, si por ejemplo, tienes un ServNombre que fuese 'Lan/WanVal' y un TipoNombre que fuese 'moro' ya que no te lo mostraría, voy a pensar un solución más factible, pero si quieres de momento (y para hacer pruebas) puedes usar ese distinct(concat) |
| ||||
Porque no haces lo que te dije la otra vez de poner un if y así no concatenas con usuario y no te saldrían repetidos??Es decir: SELECT S.ServNombre, T.TipoNombre, if(S.ServId in (Select ServIdServ From UsuariosServicios US inner join usuarios U on U.UsId=US.UsServIdUs inner join clientes C on C.UsIdCli=U.UsIdCli where UsServIdServ=" & combodeusuario.selectedvalue &") and C.UsIdCli=2, 1, 0) as COMPRUEBA FROM TipoServicio T INNER JOIN Servicios S on S.ServId=T.ServIdServ |
| ||||
esta es mi sql myCommand = new SqlCommand ("SELECT S.ServNombre, T.TipoNombre, if(S.ServId in (Select ServIdServ From UsuariosServicios US inner join usuarios U on U.UsId=US.UsServIdUs inner join clientes C on C.UsIdCli=U.UsIdCli where UsServIdServ=" + ComboLogin.SelectedItem.Value +") and C.UsIdCli="+Request.QueryString["Id"]+") as COMPRUEBA FROM TipoServicio T INNER JOIN Servicios S on S.ServId=T.ServIdServ",myConnection); me dice sintaxis incorrecta cerca de la palabra if y sintaxis incorrecta cerca de la palabra as. |
| ||||
Eso es porque la sintaxis de SqlServer es distinta (la que te pongo es de MYsql) aunque como te dije deberían ser las mismas, data una vuelta por la documentacion de tu SQLServer para ver como se traduciría eso, la cuestión es que si el servicio indexa con el usuario devuelve un 1 en caso contrario un 0, y lo devuelve en la variable COMPRUEBA, pero ya te digo que tendrás que mirar la documentación y ver como se traduciría. |
| ||||
Iid,no he leido Iif, pero como te dije SQLServer (por lo que he ledio) sería con case SELECT S.ServNombre, T.TipoNombre, case when S.ServId in (Select ServIdServ From UsuariosServicios US inner join usuarios U on U.UsId=US.UsServIdUs inner join clientes C on C.UsIdCli=U.UsIdCli where UsServIdServ=" & combodeusuario.selectedvalue &") and C.UsIdCli=2 then 1 else 0 FROM TipoServicio T INNER JOIN Servicios S on S.ServId=T.ServIdServ |