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

Cambiando de registro con getRows y JavaScript

Estas en el tema de Cambiando de registro con getRows y JavaScript en el foro de ASP Clásico en Foros del Web. Ok ya le estube investigando para ver cual seria la mejor forma de cambiar de un registro a otro con botones: Inicio, Atras, Siguiente y ...
  #1 (permalink)  
Antiguo 13/06/2005, 14:36
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Cambiando de registro con getRows y JavaScript

Ok ya le estube investigando para ver cual seria la mejor forma de cambiar de un registro a otro con botones: Inicio, Atras, Siguiente y Ultimo
Y ahora si requiero de una ayudita.

Estoy haciendo un pequeño sistema que pueda navegar entre los registros de una tabla, en un principio pense que hiba a ser con MoveNext y eso pero leyendo los post del foro supe que habia otra pocion llamada getRows y bien me di a la tarea de ver como utilizar esta opcion, ahorita ya logre utilizarlo y ya mas o menos le voy entendiendo a este, pero veo que puede guardar lo de toda una tabla, entonces empece a ver opciones con JavaScript y me atore.
Mi pregunta es como puedo controlar con JavaScript y getRows no el echo de repaginar de 10 en 10 no, si no lo de un registro al otro sin tener que acudir en cada salto de registro al servidor una y otra vez?, lo que tengo hasta ahorita se los pongo, y de antemano muchas gracias por sus comentarios

Conecto la BD, valido, paso al getRows y asigno los campos que se van a ver.

Código:
	SQLValidaRsIdUsuario = "SELECT * FROM Usuarios ORDER BY IdUsuario"
	rs.Open SQLValidaRsIdUsuario, adoCon
	If NOT rs.EOF Then
		aTable1Values = rs.getRows()
	end if
	For iRowLoop = 0 to UBound(aTable1Values, 2)
	  For iColLoop = 0 to UBound(aTable1Values, 1)
	    'Response.Write(aTable1Values(iColLoop, iRowLoop) & "<br>")
		'Response.Write aTable1Values(0,0)
	  Next 'iColLoop
	 ' Response.Write("<p>")
	Next 'iRowLoop
Id = 0
Tipo = 2
Nombre = 3
Pongo el Java y le incrusto ASP, para que en cajas de TXT mas adelante se puedan ver la informacion de la BD.
Código:
<script language="JavaScript">
<!--hide
function myforms() 
 {
        var a=5;
        var b=3;
        //var c=a*b;
		<% Response.Write("var c='" & aTable1Values(Id, 0) & "';") %>
		this.document.forms[0].elements[0].value=c;
        //var d=7;
		<% Response.Write("var d='" & aTable1Values(Tipo, 0) & "';") %>
		this.document.forms[0].elements[1].value=d;		
        //var e='Ok todo se ve2';
		<% Response.Write("var e='" & aTable1Values(Nombre, 0) & "';") %>
		this.document.forms[0].elements[2].value=e;			
}		
//-->
</script>
Coloco el Html corespondiente
Código:
<body onLoad="myforms()">
<form name="form1" method="post" action="">
  <p>Id
    <input type="text" name="textfield" >
  </p>
  <p>Tipo      
    <input type="text" name="textfield2">
</p>
  <p>Nombre 
    <input type="text" name="textfield3">
</p>
  <p>
  <img src="img/Inicio.gif" onClick="">
 <img src="img/Atras.gif" onClick="">
 <img src="img/Adelante.gif" onClick="">
 <img src="img/Fin.gif" onClick=""> 
  </p>
</form>
Funciona, ahora solo falta la cuestion de los botones como le hago para que sin ir al servidor desde el cliente se esten viendo los registros de la tabla, de acuerdo los botones a los que se les de un clic, ya hasta ahorita todo lo fui investigando, parti desde cero ni siquiera sabia lo de getRows, pero ahora si necesitio una manita, gracias.

Nota: pienso que esta es la mejor opcion pero si hay una mejor opcion adelante, se haceptan todo tipo de opciones, a lo mejor me dicen que finalmente hay que ir al servidor por los datos, no se a la mejor con Remote Scripting (apenas estoy viendo de este, pero los ejemplos que baje no funcionaron).
CUAL SERIA LA MEJOR FORMA, cantidad de campos por pantalla de 15 a 20 maximo, lo mas importante: velocidad de respuesta, para el cliente.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #2 (permalink)  
Antiguo 13/06/2005, 14:53
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Pues mira ....... si no quieres paginar y lo que deseas es emular una navegación convencional de un registro adelante o atras ...........pues una forma extremadamente fácil y rápida (si no son muchos registros), puede ser que formes una tabla HTML llena con tus registros, donde cada fila tenga un ID diferente, y ocultes/muestres las filas que necesites.
Si te prende la idea, pues te hecho la mano en eso. Solo que si es importante que tenga pocos registros. Lo he hecho para ir filtrando el resultado de una consulta segun vayan pulsando teclas y con solo 3000 registros, se alenta mucho. Si tienes unos pocos cientos, tal vez si te sirva.

Piénsalo.
  #3 (permalink)  
Antiguo 13/06/2005, 15:15
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola... Myakire !!!

Gracias por contestar, como va a ser un sistema abierto la cantidad de usuarios esta calculado de unos, 150,000 por lo menos, entonces creeo que esta opcion del html no seria la mas viable.

Pero no se como veas la opcion de Remote Scripting junto con algo parecido a lo que ya tengo, no se pero creeo que la opcion esta entre

Código:
<% Response.Write("var c='" & aTable1Values(Id, 0) & "';") %>
		this.document.forms[0].elements[0].value=c;
En donde se cambie:
aTable1Values(Id, 0)

Boton Siguiente: aTable1Values(Id, 1)
Boton Fin: aTable1Values(Id, 150000)
Boton Inicio: aTable1Values(Id, 0)

Algo asi, nada mas que no ubico como hacer esto en si.

Nota: esta es una opcion mas para llegar a los registros, aparte de esto ya tengo una caja te texto en donde busco por nombre o por mail, y buscar Id directamente, comento esto para que no se valla pensar que deseo buscar y llegar al registro 80,000 con puros clis de uno en uno, no y en pantalla lo que se visualiza son los datos generales del usuario, por ello es que no voy a poner de 10 en 10, gracias.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo

Última edición por speedy; 13/06/2005 a las 15:32
  #4 (permalink)  
Antiguo 13/06/2005, 16:46
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Ok, speedy, veamos el camino de JS entonces, pero disculpa que no sea hoy, por que ya es tarde, jejeje. Mañana lo vemos.

Saludos
  #5 (permalink)  
Antiguo 13/06/2005, 19:01
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
ok, hasta mañana entonces.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #6 (permalink)  
Antiguo 14/06/2005, 15:28
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola

Creo que hoy no entro Myakire hasta mañana.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #7 (permalink)  
Antiguo 14/06/2005, 18:45
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 20 años, 2 meses
Puntos: 6
Interesante todo esto, jeje.
  #8 (permalink)  
Antiguo 14/06/2005, 22:02
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 20 años, 1 mes
Puntos: 9
Se podría bajar el array getRows al cliente, pasandoselo como argumento de una función?
  #9 (permalink)  
Antiguo 15/06/2005, 00:16
Avatar de Hager  
Fecha de Ingreso: mayo-2005
Ubicación: Bogota, Colombia
Mensajes: 106
Antigüedad: 19 años, 11 meses
Puntos: 2
la verdad no lo considero conveniente, la mejor forma es paginar y si es selectivo enviar los datos en cada paginacion
pagi.asp?uno=algo&dos=algo.....
y hacer selectiva la paginacion
select * from mytabla dato= request("uno") and dato2=request("dos")....
bueno esa es la idea!!
__________________
:cool: Nadie enseña a nadie...
todos aprendemos de todos....!!!
  #10 (permalink)  
Antiguo 15/06/2005, 10:13
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Hager, me parece que si se hace de esa forma

Cita:
pagi.asp?uno=algo&dos=algo
es recargando la pagina, no?, osea otra consulta a la BD... la idea es que se haga una sola consulta y lo demas sea puro JavaScript, pero no se empiezo a creer que al dar un clic es obligadamente regresar a cargar la pagina osea volver al servidor por cada clic, si no es asi como es que se hace esto.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #11 (permalink)  
Antiguo 15/06/2005, 10:43
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Para implementar una navegación en el cliente, lo que yo haría es una matriz en javascript con algo como esto.

Código:
DatosCliente = new Array();
<%
	set adoRs = Server.CreateObject("adodb.recordset")
	vSQL = "Select * from Vw_DatosClientes"
	adoRs.Open vSQL, Cnn
	Cnt = 0
    While Not adoRs.EOF
		  %>
      DatosCliente[<%=Cnt%>] = new Array();
	  DatosCliente[<%=Cnt%>][3]= "<%=Trim(adoRs("Nombre"))%>";
	  DatosCliente[<%=Cnt%>][4]= "<%=Trim(adoRs("RFC"))%>";
	  DatosCliente[<%=Cnt%>][5]= "<%=Trim(adoRs("Dom"))%>";
etcetera
<%      Cnt = Cnt + 1
		adoRs.MoveNext
	Wend
%>
Generaria mi formulario con los botones se siguiente y anterior y conforme pulsaran en cada botón, invrementaria o decrementaria el valor en una variable que me conservara el registro actual y se lo pasaría a una función que llenara los camponentes de formulario con el contenido de la fila de la matriz.

Código:
function ActualizaCampos(Sub){
	document.form1.Nombre.value = DatosCliente[Sub][0]
	document.form1.Domicilio.value = DatosCliente[Sub][1]
	document.form1.RFC.value = DatosCliente[Sub][2]
}
y listo......supongo que con eso sería suficiente.
  #12 (permalink)  
Antiguo 15/06/2005, 13:36
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola Myakire,

Ya hice lo que me dijiste asi quedo:

Código:
<script language="JavaScript">
<!--hide
DatosCliente = new Array();

<% Set adoCon = Server.CreateObject("ADODB.Connection") %>
<% Set rs = Server.CreateObject("ADODB.Recordset")	 %>
<% adoCon.Open "DSN=BDSistema;" %>

<% vSQL = "Select * from Usuarios ORDER BY IdUsuario" %>
<% rs.Open vSQL, adoCon %>
<% Cnt = 0 %>
<%     While Not rs.EOF %>
		  
      DatosCliente[<%=Cnt%>] = new Array();
	  DatosCliente[<%=Cnt%>][0]= "<%=Trim(rs("IdUsuario"))%>";
	  DatosCliente[<%=Cnt%>][1]= "<%=Trim(rs("Tipo"))%>";
	  DatosCliente[<%=Cnt%>][2]= "<%=Trim(rs("Nombre"))%>";
<%      Cnt = Cnt + 1 %>
<% 		rs.MoveNext %>
<% 	Wend %>
//-->
</script>
Código:
<script language="JavaScript">
<!--hide
function ActualizaCampos(Sub){
	document.form1.IdUsuario.value = DatosCliente[Sub][0]
	document.form1.Tipo.value = DatosCliente[Sub][1]
	document.form1.Nombre.value = DatosCliente[Sub][2]
}
	
//-->
</script>
Código:
<body onLoad="ActualizaCampos(Sub)">
<form name="form1" method="post" action="">
  <p>
    Id:
    <input type="text" name="IdUsuario">
  </p>
  <p>    Tipo: 
    <input type="text" name="Tipo">
  </p>
  <p>    Nombre: 
    <input type="text" name="Nombre">
      </p>
</form>
No se pinta el primer registro en las caja de texto (Aun no llego al clic del Boton), pero esto es lo que sale:



Esta es la linea que se menciona en el error:



La cosa es en si no se mucho de JavaScript como podras imaginarte y no se como definir el Sub

Si quito los meta de JavaScript si se pinta en pantalla esto:

Código:
DatosCliente = new Array(); DatosCliente[0] = new Array(); DatosCliente[0][0]= "1"; DatosCliente[0][1]= "Administrador"; DatosCliente[0][2]= "Luis Edgar"; DatosCliente[1] = new Array(); DatosCliente[1][0]= "2"; DatosCliente[1][1]= "Administrador"; DatosCliente[1][2]= "armando"; DatosCliente[2] = new Array(); DatosCliente[2][0]= "3"; DatosCliente[2][1]= "Administrador"; DatosCliente[2][2]= "gerardo"; DatosCliente[3] = new Array(); DatosCliente[3][0]= "4"; DatosCliente[3][1]= "Administrador"; DatosCliente[3][2]= "carlos"; DatosCliente[4] = new Array(); DatosCliente[4][0]= "5"; DatosCliente[4][1]= "Administrador"; DatosCliente[4][2]= "marco"; DatosCliente[5] = new Array(); DatosCliente[5][0]= "6"; DatosCliente[5][1]= "Administrador"; DatosCliente[5][2]= "israel"; DatosCliente[6] = new Array(); DatosCliente[6][0]= "7"; DatosCliente[6][1]= "Administrador"; DatosCliente[6][2]= "fernando"; DatosCliente[7] = new Array(); DatosCliente[7][0]= "8"; DatosCliente[7][1]= "Administrador"; DatosCliente[7][2]= "alejandro"; DatosCliente[8] = new Array(); DatosCliente[8][0]= "9"; DatosCliente[8][1]= "Administrador"; DatosCliente[8][2]= "Francisco"; DatosCliente[9] = new Array(); DatosCliente[9][0]= "10"; DatosCliente[9][1]= "Usuario"; DatosCliente[9][2]= "jose"; DatosCliente[10] = new Array(); DatosCliente[10][0]= "11"; DatosCliente[10][1]= "Vendedor"; DatosCliente[10][2]= "luise"; DatosCliente[11] = new Array(); DatosCliente[11][0]= "12"; DatosCliente[11][1]= "Cliente"; DatosCliente[11][2]= "julio";
La cosa en ese Sub...
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #13 (permalink)  
Antiguo 15/06/2005, 13:52
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
function ActualizaCampos(Sub) define una función que recibe un parámetro, en este caso llamado Sub.

Veo que lo invocas asi: <body onLoad="ActualizaCampos(Sub)">, lo cual no es lo que yo haría.

Yo en los botones de avanzar y retrocedes definiría una función que actualizará el registro en el que se supone que estas y llamaría a ActualizaCampos pasándole ese valor:

<input type=button value="avanzar" onclick="regActual=regActual+1;ActualizaCampos(reg Actual)">

(yo no definí la función por que me flojera, jejeje)

Cabe mencionar que regActual es una variable global que definiste por ejemplo en:

<HEAD>
<SCRIPT>
regActual = 0
DatosCliente = new Array();
......



y para que el formulario se llene con los valores de la primer celda, pues llamo a la función en la última linea del script (no hay tox por que la veriable se inicializó en cero.

....
</form>
<script>ActualizaCampos(regActual)</script>
</html>


Saludos
  #14 (permalink)  
Antiguo 15/06/2005, 15:11
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Sonrisa

Perfecto si me funciono asi, muchas gracias jeje
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #15 (permalink)  
Antiguo 16/06/2005, 07:23
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Solo por curiosidad ........ mencionas que además de este método de navegación tienes búsquedas y paginado ....... pero ¿piensas trabajar con vectores en memoria de más de 150,000 registros solo por avanzar o retroceder unos pocos registros? ...¿cómo se comporta tu página con este vector? ¿se alenta, tarda en cargarse demasiado?
  #16 (permalink)  
Antiguo 16/06/2005, 10:26
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
un vector de ese tamano en el cliente me imagino que causara serios problemas...

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #17 (permalink)  
Antiguo 16/06/2005, 10:47
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 24 años, 2 meses
Puntos: 535
Yo tuve "serios problemas" al filtrar un <select multiple> (llenado con un vector de 2170 elementos) desde un text box. Cada letra que precionaba tardaba entre 7 y 10 segundos en hacer la tarea, así que no me quiero imaginar lo que serían 150.000 :)
__________________
...___...
  #18 (permalink)  
Antiguo 16/06/2005, 12:12
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Así es...por eso lo del comentario de solo trabajar con pocos registros de los primeros post y por eso de mi pregunta de estos últimos.
  #19 (permalink)  
Antiguo 16/06/2005, 17:16
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Ok, bueno si me di cuenta de esta cuestion de la tardanza haciendo las cosas desde JavaScript, pero continue atacando el problema por que los elementos que me diste pues me sirvieron para hacer algo que nunca habia hecho, por ello continue con esto. Como va a quedar finalmente es que cada peticion los voy a mandar al server para recoger los datos del usuario en cuestion ya que con JavaScript estaria pasando lo que comentas tu, u_goldman y Al Zuwaga

Ahora me encuentro investigando la cuestion de MoveFirst, MovePrevious, MoveNext, MoveLast, de hecho tengo un par de preguntas con respecto a estos pero eso sera en otro post para dejar ordenada la informacion que se va posteando en todo el foro.

Sin salirme del tema de getRows me gustaria saber que es mejor a nivel getRows o a nivel rs.MoveFirst, ¿como seria mejor o es igual?, si voy a ir al server cada vez que se de un clic en la Botonera, ya que si lo hago a nivel JavaScript pues seria in eficaz. Muchas gracias por sus comentarios
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #20 (permalink)  
Antiguo 16/06/2005, 17:37
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Definitivamente el mejor performance te lo dara GetRows si esa es tu pregunta...

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #21 (permalink)  
Antiguo 16/06/2005, 17:53
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola u_goldman...!!!

Ok perfecto entondes por hay me voy a ir, gracias.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #22 (permalink)  
Antiguo 16/06/2005, 18:20
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años
Puntos: 2
Hola

Ya en este nivel, creo que la estructura seria de dos formas..

A) Consulta normal sin Recordset

1. La consulta la haces como:

'objRs = Variable normal
'objConn = Objeto tipo conexion a base de datos.
objRs = objConn("select * from tabla where x")

while not objRs.Eof

//crear el resultado
objRs.MoveNext

loop

Esto, no esta tal mal, porque no es propiamente un Recorset con todo lo que implica ser Recordset.

2. Creas un recordset para hacer la consulta.

'objRs = Objeto de tipo recordset
objConn = Objeto tipo conexion a base de datos.

objRs.open ("select * from tabla where x")

if not objRs.eof then

arrRes = objRs.GetRows()

intLen = Ubound(arrRes,2) - 1
for 0 to intLen

//Crear el resultado.

next

end if

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #23 (permalink)  
Antiguo 16/06/2005, 18:28
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Solamente un comentario:

intLen = Ubound(arrRes,2) - 1

esto no es totalmente preciso, la funcion uBound te regresa el numero del maximo indice como tal, si restas uno, iterara en el maximo del arreglo - 1.


Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #24 (permalink)  
Antiguo 16/06/2005, 18:36
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años
Puntos: 2
Cierto...

Tienes razón, se me fue lo del 1
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
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 21:20.