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

funcion que devuelve rs, no me funciona...

Estas en el tema de funcion que devuelve rs, no me funciona... en el foro de ASP Clásico en Foros del Web. Hola, quiero hacer lo siguiente: <!--#include file="funciones.inc"--> productos do While Not rs.Eof .... .... donde, si nos vamos a funciones.inc nos encontramos con: sub productos() ...
  #1 (permalink)  
Antiguo 19/10/2005, 16:14
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 20 años
Puntos: 0
funcion que devuelve rs, no me funciona...

Hola, quiero hacer lo siguiente:


<!--#include file="funciones.inc"-->

productos

do While Not rs.Eof
....
....


donde, si nos vamos a funciones.inc nos encontramos con:

sub productos()
set conexion = Server.CreateObject( "ADODB.Connection" )
conexion.Open( "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath( "bd/bd.mdb" ))
expSql="SELECT * FROM producto;"
set rs =conexion.execute(expSql)
end sub

sin embargo cuando lo ejecuto me sale el error:

"Error de Microsoft VBScript en tiempo de ejecución error '800a000d'
No coinciden los tipos: 'productos' "

Le he dado tela de vueltas, y creo que no es un error de sintaxis, sino conceptual. ¿Alguien puede decirme que´estoy haciendo mal?
  #2 (permalink)  
Antiguo 19/10/2005, 17:02
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
No me detuve mucho a analizar tu codigo por falta de tiempo, pero te sugiero que en lugar de utilizar una Subrutina, utilices una funcion y que te devuelva no un rs, sino un array mediante el metodo GetRows()

Código:
Function getcliente()
 'toda la conexion y la apertura del recordset
  if not rs.eof then
    ds = rs.GetRows()
  else
    ds = null
  end if
  'cierra y destruye todos tus objetos
  getcliente = ds
End Function

ds_cliente = getcliente()
if isArray(ds_cliente) then
 'itera tu arreglo
else
  'no hay datos
end if

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 19/10/2005, 18:24
Avatar de tomchat  
Fecha de Ingreso: septiembre-2005
Mensajes: 231
Antigüedad: 18 años, 9 meses
Puntos: 0
NO tambien has lo siguien
Sql ="Select * From Productos"
Rs.open, BD,3,1

De esta manera trabajas abrienda el reocordset y no ejecutandolo mediante una consulta que general mente genera error de ese tipo, solo utiliza ese tipo de codigo cuando vas a ejecutar codigo de actualizacion y no de lectura.
  #4 (permalink)  
Antiguo 19/10/2005, 18:30
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
En el archivo funciones.inc agregá la línea que marco en negritas:


DIM conexion
sub productos()
set conexion = Server.CreateObject( "ADODB.Connection" )
conexion.Open( "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath( "bd/bd.mdb" ))
expSql="SELECT * FROM producto;"
set rs =conexion.execute(expSql)
end sub
__________________
...___...
  #5 (permalink)  
Antiguo 21/10/2005, 05:18
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 20 años
Puntos: 0
Sigue sin funcionar.

Resulta, que si en vez de modularizarlo con subrutinas lo pongo todo en la página principal funciona perfectamente, pero si divido el código en procedimientos como los mostrados antes me sale ese error. No sé por qué el objeto recorset no lo coge. También he probado a utilizar una función que devuelva la variable rs, pero me sigue diciendo lo mismo.... ¿Alguien puede ayudarme???

Gracias de antemano
  #6 (permalink)  
Antiguo 21/10/2005, 07:28
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
Yo creo que hay que ver la linea que provoca el error.
  #7 (permalink)  
Antiguo 22/10/2005, 05:09
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 20 años
Puntos: 0
Error:

Error de Microsoft VBScript en tiempo de ejecución error '800a000d'

No coinciden los tipos: 'productos'

/Default.asp, line 14



linea 14 en negrita:
.....
<!--#include file="funciones.inc"-->
Dim rs
rs = productos()

do While Not rs.Eof
......


funciones.inc:

DIM conexion
Function productos()
set conexion = Server.CreateObject( "ADODB.Connection" )
conexion.Open( "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath( "bd/bd.mdb" ))
expSql="SELECT * FROM producto;"
set rs = Server.CreateObject( "ADODB.Recordset" )
productos = rs.Open(expSql, conexion)
End Function


A ver si alguien me dice en qué falla... Gracias :)
  #8 (permalink)  
Antiguo 22/10/2005, 05:55
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 4 meses
Puntos: 6
Joer, pues que productos es una subrutina, y como tal no devuelve ningún valor. No puedes asignarle a la variable rs "una subrutina" (la cual por cierto ya se encarga de asignarle a rs el valor que buscas).

Simplemente tienes que borrar completamente esa línea que te provoca el error, y darte unos cabezazos contra la pared para que no vuelva a ocurrir.
  #9 (permalink)  
Antiguo 22/10/2005, 06:30
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 20 años
Puntos: 0
Tío, no sé si es que yo estoy gilipollas o te has confundido tú. Lee mi último post, creo que es una función, no? (en mi primer post era una subrutina, pero como alguien me dijo que hiciera una función...)
Muchas gracias por contestar de todas formas. Seguro que es una gilipollez, pero llevo días sin dormir!!

A ver si alguien me puede salvar la vida...


Gracias de antemano
  #10 (permalink)  
Antiguo 22/10/2005, 14:45
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Es correcto el concepto, pero regresa mejor un arreglo obtenido con getrows, es mas sencillo de controlar y no regresas objetos.
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #11 (permalink)  
Antiguo 22/10/2005, 17:07
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Otra cosa que podrías probar es con lo siguiente: definis una variable en la página, por ejemplo RS, entonces la función en realidad de lo que se encargaría sería de asignarle un objeto RecordSet a esa variable. Pero siempre va a ser mejor, como dice U Goldman, que trabajes con GetRows, no te va a generar ningún error y vas a trabajar de manera más eficiente con los recursos. Te paso un ejemplo para decirte como lo haría yo:

Dim RS

Sub GetRs()
'Código de la conexion
Set RS = Server.CreateObject("Adodb.RecordSet")
RS.Open "Select * From Tu_Tabla", Tu_Conexion
End Sub


Después deberías hacerte otro procedimiento que te libere esos objetos, por eso siempre es mejor trabajar con GetRows, que te desconectas de la base de datos una vez que ya sacaste todos los datos.
Espero que de algo haya servido.
Saludos!.
__________________
Add, never Remove
  #12 (permalink)  
Antiguo 24/10/2005, 12:45
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 4 meses
Puntos: 6
Cita:
Iniciado por Gosku
Tío, no sé si es que yo estoy gilipollas o te has confundido tú. Lee mi último post, creo que es una función, no? (en mi primer post era una subrutina, pero como alguien me dijo que hiciera una función...)
Muchas gracias por contestar de todas formas. Seguro que es una gilipollez, pero llevo días sin dormir!!

A ver si alguien me puede salvar la vida...


Gracias de antemano
Sí que es verdad, es que miré la subrutina en tu primer post, y no sabía que después, cuando fuiste a publicar el error, lo habías cambiado a una función.

Pues entonces, prueba a, usando una subrutina, definir rs como global (dim rs fuera de la función), y dentro de la función (la "sub") asignarle el valor. Tiene que funcionar seguro.

Saludos
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 19:49.