Foros del Web » Programando para Internet » ASP Clásico »

Estará bien planteado este codigo

Estas en el tema de Estará bien planteado este codigo en el foro de ASP Clásico en Foros del Web. miren ya me tiene arto este codigo a veces nos pasa a todos o no es mi semana, lo que quiero hacer es lo siguiente.. ...
  #1 (permalink)  
Antiguo 26/04/2005, 08:17
Avatar de dobled  
Fecha de Ingreso: enero-2002
Ubicación: Rancagua - Chile
Mensajes: 1.328
Antigüedad: 22 años, 4 meses
Puntos: 2
Estará bien planteado este codigo

miren ya me tiene arto este codigo a veces nos pasa a todos o no es mi semana, lo que quiero hacer es lo siguiente..

quiero traer datos de una tabla y mostrarlos en un select pero si se encuentra ese valor en otra tabla se lo salte y no lo muestre.

Estoy trabajando con este codigo, no se si estará bien planteado espero comentarios

Gracias
Código:
		strsql ="SELECT * FROM sub_areas ORDER by sub_area_nombre"
		Set RS = Server.CreateObject("ADODB.Recordset")
		RS.Open strSQL, oConn,3,1

		Response.Write("<select name=""sub_area_id"" class=""input"" id=""sub_area_id"">")
		Do While Not Rs.EOF
		Rsubaid=Rs("sub_area_id")
		Rsubanom=Rs("sub_area_nombre")

			strsql ="SELECT * FROM matrices WHERE nom_matriz="&Rsubanom
			Set Rsa = Server.CreateObject("ADODB.Recordset")
			Rsa.Open strSQL, oConn,3,1
		
			If Rsa.EOF Then
		Response.write("<option value="&Rsubaid&">"&Rsubanom&"</option>")
			End If

				
		Rs.MoveNext
		Loop
		Response.Write("</select>")
		Rsa.Close
		Rs.Close
__________________
Usa títulos específicos y con sentido
En las listas de correo o en los grupos de noticias, la cabecera del mensaje es tu oportunidad de oro para atraer la atención de expertos cualificados en aproximadamente 50 caracteres o menos. No los desperdicies en balbuceos como "Por favor ayúdame" (de "POR FAVOR AYÚDAME!!!" ya ni hablamos). No intentes impresionarnos con lo profundo de tu angustia; mejor usa ese preciado espacio para una descripción lo más concisa posible del problema.
  #2 (permalink)  
Antiguo 26/04/2005, 08:24
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Veo que ahora usas Response.Write indiscriminadamente , ¿ya hiciste la prueba de velocidad?

por lo de tu código, veo que existan o no registros en la segunda tabla, creas el select, por lo que SIEMPRE lo generas. ¿Esto es correcto?, quiza la pregunta If Rsa.EOF Then debería ser antes de cualquier otra cosa.
  #3 (permalink)  
Antiguo 26/04/2005, 08:32
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
me parece que no te estas salteando nada, estas recorriendo una tabla y con el valor de cada registro buscas en una segunda tabla y muestras los resultados pero no te saltas nada, podrías hacer una consulta cruzada si lo que quieres es restringir los resultados, aglo así:

strsql ="SELECT * FROM sub_areas where sub_area_nombre not in(SELECT nom_matriz FROM matrices) ORDER by sub_area_nombre"
  #4 (permalink)  
Antiguo 26/04/2005, 08:35
Avatar de dobled  
Fecha de Ingreso: enero-2002
Ubicación: Rancagua - Chile
Mensajes: 1.328
Antigüedad: 22 años, 4 meses
Puntos: 2
Cita:
Iniciado por Myakire
Veo que ahora usas Response.Write indiscriminadamente , ¿ya hiciste la prueba de velocidad?

por lo de tu código, veo que existan o no registros en la segunda tabla, creas el select, por lo que SIEMPRE lo generas. ¿Esto es correcto?, quiza la pregunta If Rsa.EOF Then debería ser antes de cualquier otra cosa.
oye si aunque no lo creas en este select estaba probando escribir todo con response pero es mal lento que la cres.... prefiero mixto, bueno pasando a mi codigo dices que el if lo debo plantear antes de la segunda consulta?
__________________
Usa títulos específicos y con sentido
En las listas de correo o en los grupos de noticias, la cabecera del mensaje es tu oportunidad de oro para atraer la atención de expertos cualificados en aproximadamente 50 caracteres o menos. No los desperdicies en balbuceos como "Por favor ayúdame" (de "POR FAVOR AYÚDAME!!!" ya ni hablamos). No intentes impresionarnos con lo profundo de tu angustia; mejor usa ese preciado espacio para una descripción lo más concisa posible del problema.
  #5 (permalink)  
Antiguo 26/04/2005, 08:40
Avatar de dobled  
Fecha de Ingreso: enero-2002
Ubicación: Rancagua - Chile
Mensajes: 1.328
Antigüedad: 22 años, 4 meses
Puntos: 2
Cita:
Iniciado por pablinweb
me parece que no te estas salteando nada, estas recorriendo una tabla y con el valor de cada registro buscas en una segunda tabla y muestras los resultados pero no te saltas nada, podrías hacer una consulta cruzada si lo que quieres es restringir los resultados, aglo así:

strsql ="SELECT * FROM sub_areas where sub_area_nombre not in(SELECT nom_matriz FROM matrices) ORDER by sub_area_nombre"
perfecto pablin gracias me ahorre buenas lineas de codigo
__________________
Usa títulos específicos y con sentido
En las listas de correo o en los grupos de noticias, la cabecera del mensaje es tu oportunidad de oro para atraer la atención de expertos cualificados en aproximadamente 50 caracteres o menos. No los desperdicies en balbuceos como "Por favor ayúdame" (de "POR FAVOR AYÚDAME!!!" ya ni hablamos). No intentes impresionarnos con lo profundo de tu angustia; mejor usa ese preciado espacio para una descripción lo más concisa posible del problema.
  #6 (permalink)  
Antiguo 26/04/2005, 08:41
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Así es, como tambien dice pablinweb, con tu actual código el select siempre aparece. Podrías primero hacer la búsqueda en la tabla matrices y si no esta entonces ahora si pintas el select y haces la búsqueda en la otra tabla.
O tambien puedes utilizar la subconsulta como te recomenadaron.

Saludos
  #7 (permalink)  
Antiguo 26/04/2005, 08:47
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
tambien es muy bueno lo que dice Myakire, verificar que tengas resultados, podrías poner un aviso, algo así:

Código:
Response.Write("<select name=""sub_area_id"" class=""input"" id=""sub_area_id"">")
If Rs.eof then
      Response.write("<option value="">"Sin Opciones"</option>")
else
      Do While Not Rs.EOF
         Rsubaid=Rs("sub_area_id")
         Rsubanom=Rs("sub_area_nombre")

         Response.write("<option value="&Rsubaid&">"&Rsubanom&"</option>")
					
         Rs.MoveNext
      Loop
end if
  #8 (permalink)  
Antiguo 26/04/2005, 09:10
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 10 meses
Puntos: 15
De acuerdo Creo que la opcion es con sql

A mi parecer la mejor manera de no sobrecargar la base de datos y de hacer el codigo mas rapido en ejecucion arranca desde el sql, ya que esa consulta la puedes hacer directo desde un sql.

Me parece que puede ser:

SELECT * FROM sub_areas INNER JOIN matrices on sub_areas.sub_area_nombre <> matrices.nom_matriz
order by sub_areas.sub_area_nombre


Este codigo lo que hace es cargar en un recorset todos los valores de sub_areas donde sub_area_nombre no sea igual a nom_matriz que esta en matrices, asi solo te traera todos los registros que no coincidan entre tablas, si coinciden o en tu caso estan en matrices entonces no los muestra.

Has la prueba y veras.

Última edición por dwaks; 26/04/2005 a las 11:41
  #9 (permalink)  
Antiguo 26/04/2005, 09:48
Avatar de dobled  
Fecha de Ingreso: enero-2002
Ubicación: Rancagua - Chile
Mensajes: 1.328
Antigüedad: 22 años, 4 meses
Puntos: 2
no me aparecia el mensaje cuando no encontraba nada, faltaba unas comillas dobles, gracias

Response.write("<option value="""">"Sin Opciones"</option>")
__________________
Usa títulos específicos y con sentido
En las listas de correo o en los grupos de noticias, la cabecera del mensaje es tu oportunidad de oro para atraer la atención de expertos cualificados en aproximadamente 50 caracteres o menos. No los desperdicies en balbuceos como "Por favor ayúdame" (de "POR FAVOR AYÚDAME!!!" ya ni hablamos). No intentes impresionarnos con lo profundo de tu angustia; mejor usa ese preciado espacio para una descripción lo más concisa posible del problema.
  #10 (permalink)  
Antiguo 26/04/2005, 11:09
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
Cita:
Iniciado por dwaks
A mi parecer la mejor manera de no sobrecargar la base de datos y de hacer el codigo mas rapido en ejecucion arranca desde el sql, ya que esa consulta la puedes hacer directo desde un sql.

Me parece que puede ser:

SELECT * FROM sub_areas INNER JOIN matrices on sub_areas.sub_area_nombre = matrices.nom_matriz
order by sub_areas.sub_area_nombre


Este codigo lo que hace es cargar en un recorset todos los valores de sub_areas donde sub_area_nombre sea igual a nom_matriz que esta en matrices, asi solo te traera todos los registros que coincidan entre tablas, sino coinciden o en tu caso no estan en matrices entonces no los muestra.

Has la prueba y veras.
claro, pero dobled quiere hacer exactamente lo contrario, si está en matrices que no lo muestre
  #11 (permalink)  
Antiguo 26/04/2005, 11:42
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 10 meses
Puntos: 15
Que lea denuevo mi post que ya lo edite y esta como el quiere.
  #12 (permalink)  
Antiguo 26/04/2005, 11:49
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola

dwaks, la solucion que pusiste es la misma que puso antes pablinweb, sin embargo lo que tienes razon es que la solucion que ofreces en N a la N veces mas eficiente que la de pablinweb, pero eso se mejora aun mas si las tablas tienen index correctos.

Los select multiples resultan muy lentos, por lo tanto menos eficientes, el join es mucho mas rapido y mas eficiente, esto debido a como funciona el compilador internamente, y como trabaja sobre las tablas.

Un select, equivale a un SCAN completo de la segunda tabla por cada registro que esta comparando, un Join equivale a una relacion tabla a tabla, registro a registros(s), lo cual hace mas facil el trabajo al compilador.

Suerte!!
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 10:55.