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

Duda con el objeto Recordset

Estas en el tema de Duda con el objeto Recordset en el foro de ASP Clásico en Foros del Web. Hola! Sigo con mis selects, poco a poco voy descubriendo el problema, he llegado a una conclusiones y tengo dudas, espero que me las podais ...
  #1 (permalink)  
Antiguo 02/05/2007, 02:13
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Duda con el objeto Recordset

Hola! Sigo con mis selects, poco a poco voy descubriendo el problema, he llegado a una conclusiones y tengo dudas, espero que me las podais responder:

1.- Necesito un Recordset para recoger el valor que me dá una select? Me explico mejor, necesito hacer esto:
intra2=new ActiveXObject("ADODB.RecordSet");
varmax="Select MAX(id_destacado) from destacados";
intra2.Open(varmax,cone,adOpenStatic,adCmdTable);


He creado una función para que me diga si es número o no, y después he visualizado la variable así:

Código:
if(isNaN(varmax)){
				Response.Write("No es numero")
			}else{
				Response.Write("Numero")
			}
			Response.Write(varmax)
Resulta que no es un número (En la BD ese campo es numerico) y me muestra esto por pantalla: adios No es numero Select MAX(id_destacado) from destacados

No se ejecuta la select, quisiera saber si necesitaría un Recordset obligatoriamente, en este caso, sólo necesito saber id_destacado, y lo del max se podría omitir, sacando el valor máximo en otra select, ir restandolo y después ejecutandolo, para que sacara la información where id_destacado=x

2.- Ejecuto mal la sentencia o algo?

También he probado esto:

Código:
intra2=cone.execute("Select id_destacado from destacados where id_destacado=2");
Response.Write(intra2("id_destacado"))
Resulta que esto si funciona, pero necesito una variable que me coja el último código que se ha introducido ya que si pongo:

Código:
rstIntranet=new ActiveXObject("ADODB.RecordSet");
sentencia="Select max(id_destacado) from destacados";
rstIntranet.Open(sentencia,cone,adOpenStatic,adCmdTable);

intra2=cone.execute("Select id_destacado from destacados where id_destacado=rstIntranet");
Response.Write(intra2("id_destacado"))
Tengo este fallo:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][Controlador ODBC Microsoft Access] Pocos parámetros. Se esperaba 1.
/portal_joven/listado_destacados.asp, línea 50


Línea 50: intra2=cone.execute("Select id_destacado from destacados where id_destacado=rstIntranet");

Tiene sentido ya que estoy comparandolo con un recordset, por eso quería preguntar si podría meter el resultado en una variable.

** NOTA: intra2 no está declarada... no sé si tendrá algo que ver.

Última edición por Shilfild; 02/05/2007 a las 04:12
  #2 (permalink)  
Antiguo 02/05/2007, 04:28
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

Hola Shilfild,

como te expliqué en el post del CASE (http://www.forosdelweb.com/f15/error-sintaxis-case-484627/) El problema es que necesitas un recordset para averiguar:

1 - Cual es el registro maximo que tiene la tabla destacados.
2 - Una vez averiguado, tomar el valor del campo id_destacado de ese registro en concreto

Asi:
Código:
intra2=new ActiveXObject("ADODB.RecordSet");
intra3=new ActiveXObject("ADODB.RecordSet");
varmax="Select max(id_destacado) from destacados";
' Esto te va a abrir un rs con registro
intra2.Open(varmax,cone,adOpenStatic,adCmdTable);
if (! intra2.EOF) {
      vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado="+ intra2.fields[0].value +")";
      intra3.Open(vartabla,cone,adOpenStatic,adCmdTable);
}
  %>
Como ves varmax es siempre una cadena porque contiene la sentencia SQL. Sin embargo, intra2 es un objeto recordset con los datos (si los hay) de esa sentencia SQL. O sea, que si hay un valor maximo en la tabla destacados se guardará en el recordset intra2.

Comprobamos que no esté vacio (!intra2.EOF) y volvemos a buscar un registro en la BD pero esta vez en la tabla tipos.


En el nuevo codigo que has puesto buscas los 4 ultimos destacados de la tabla destacado y luego buscar el campo tipo_nombre de la tabla tipos cuyo campo id_tipo de dicha tabla tipos sea igual al campo destacados_tipo de la tabla destacados cuyo campo id_destacados sea de los pertenecientes a esos 4 ultimos destacados.


Código:
<%@ language="JScript" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<!-- Hay que cambiar esto por el diseño de la propia página -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../Intranet/web/intranet.css" rel="stylesheet" type="text/css">
<link href="../Intranet/web/scroll.css" rel="stylesheet" type="text/css">
</head>

<body>
<!-- #INCLUDE file="ADOJAVAS.inc" -->
<%
    cone=Server.CreateObject("ADODB.Connection");
    cone.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="+Server.MapPath("portaljoven.mdb"));
    rstIntranet=new ActiveXObject("ADODB.RecordSet");
    intra2=new ActiveXObject("ADODB.RecordSet");
    intra3=new ActiveXObject("ADODB.RecordSet");
    sentencia="Select top 4 * from destacados order by id_destacado desc";
    rstIntranet.Open(sentencia,cone,adOpenStatic,adCmdTable);    
    %>

    <table border=0>
    <%

    while (!rstIntranet.eof){
        %><tr>
            <% 
            
            vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado='"+ rstIntranet.Fields["id_destacado"].value
 +"')";
            intra3.Open(vartabla,cone,adOpenStatic,adCmdTable); 
              
                switch(Case intra3.Fields["tipo_nombre"].Value) {
              case "comics":
                  Response.Write("hola");
                              break;
                default:
                  Response.Write("adios")                
            }
            
                    
        %>
        </tr>            
        <%
             rstIntranet.Movenext();
        
        
    }
    %>
</table>
<%rstIntranet.close();
cone.close();%>
</body>
</html>
Copia y pega y me cuentas. Por cierto quiero recordarte que JScript es case-sensitive O sea, distingue entre mayusculas y minusculas (no es lo mismo Ramon que ramon)


Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #3 (permalink)  
Antiguo 02/05/2007, 05:11
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Voy a ir por partes porque me estoy liando un poco

Código:
<%@ language="JScript" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<!-- Hay que cambiar esto por el diseño de la propia página -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../Intranet/web/intranet.css" rel="stylesheet" type="text/css">
<link href="../Intranet/web/scroll.css" rel="stylesheet" type="text/css">
</head>

<body>
<!-- #INCLUDE file="ADOJAVAS.inc" -->
<%
    cone=Server.CreateObject("ADODB.Connection");
    cone.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="+Server.MapPath("portaljoven.mdb"));
    rstIntranet=new ActiveXObject("ADODB.RecordSet");
    intra2=new ActiveXObject("ADODB.RecordSet");
    intra3=new ActiveXObject("ADODB.RecordSet");
    sentencia="Select top 4 * from destacados order by id_destacado desc";
    rstIntranet.Open(sentencia,cone,adOpenStatic,adCmdTable);    
    %>

    <table border=0>
    <%

    while (!rstIntranet.eof){
        %><tr>
            <% 
            
            vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado='"+ rstIntranet.Fields["id_destacado"].value +"')";
            intra3.Open(vartabla,cone,adOpenStatic,adCmdTable); 
              
                switch(Case intra3.Fields["tipo_nombre"].Value) {
              case "comics":
                  Response.Write("hola");
                              break;
                default:
                  Response.Write("adios")                
            }
            
                    
        %>
        </tr>            
        <%
             rstIntranet.Movenext();
        
        
    }
    %>
</table>
<%rstIntranet.close();
cone.close();%>
</body>
</html>
He pegado este código tal cual y lo que yo interpreto es esto, pero me gustaría que me dijeras si lo que pienso está bien, porque a veces me invento incluso teorias xDD

1.- Creamos los 3 recordsets que vamos a usar
2.- Sentencia recoge los 4 datos más altos de DESTACADOS ordenados descendentemente (osea los números mayores)
3.- Ejecutamos la sentencia, entonces tenemos los 4 datos en nuestro recordset.

4.- Mientras rstIntranet no acabe:
Introducimos en la variable vartabla el tipo_nombre de tipos, dónde id_tipo es el destacados_tipo de destacados, el cual será igual al valor en el que estamos en ese momento en el recordset.

5.- Ejecutamos esa sentencia vartabla
6.- Si el tipo_nombre es comics se muestra hola, sino adios
7.- Seguimos con el siguiente registro para saber de qué tablas son el resto de los destacados.

Weno, no sé si lo habré entendido bien >_> pero me dá un error

Error de compilación de Microsoft JScript (0x800A03EE)
Se esperaba ')'
/portal_joven/listado_destacados_zuri.asp, línea 37, columna 12


Linea 37: switch(Case intra3.Fields["tipo_nombre"].Value){



Que yo sepa esa sintaxis está bien,asique no sé... He probado también así pero..

Código:
            switch(Case (intra3.Fields["tipo_nombre"]).Value){
              Case "comics":
                  Response.Write("hola");
                             break;
             Default: 
                 Response.Write("adios")                
            }
Error: Error de compilación de Microsoft JScript (0x800A03F1)
Se esperaba '}'
/portal_joven/listado_destacados_zuri.asp, línea 38


Linea 38: Case "comics":



Por otra parte sobre lo que me has explicado antes

Código:
intra2=new ActiveXObject("ADODB.RecordSet");
intra3=new ActiveXObject("ADODB.RecordSet");
varmax="Select max(id_destacado) from destacados";
' Esto te va a abrir un rs con registro
intra2.Open(varmax,cone,adOpenStatic,adCmdTable);
if (! intra2.EOF) {
      vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado="+ intra2.fields[0].value +")";
      intra3.Open(vartabla,cone,adOpenStatic,adCmdTable);
}
  %>
Lo de if(! intra2.EOF) Significa que mientras no sea EOF haga lo de esta variable coincidiendo con la posición en la que está intra2, verdad?
Pero por qué un EOF si el valor máximo sólo sacaría uno?

Weno, muchas gracias por repetirme las cosas una y otra vez xD

**EDITO** No sé si la select de la tabla estará bien hecha, yo le veo muchísima lógica,pero no sé >_> aún asi, si estuviera mal, no habría problema no? Daría adios y punto.

Última edición por Shilfild; 02/05/2007 a las 05:54
  #4 (permalink)  
Antiguo 02/05/2007, 06:15
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

Perdona, la llamda a los metodos del recordset es:

switch(Case intra3.Fields("tipo_nombre").Value){

Es con ( ) no con [ ]


Un pequeño error de lenguajes

Vi en el código que usabas los 4 ultimos registros. No solo el ultimo (MAX) si no los 4 ultimos.

SELECT TOP 4 * FROM tabla ORDER BY id DESC

Me saca los 4 ultimos registros introducidos (DESC)

Con esto, me ahorro dos recordset :D



Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -

Última edición por tammander; 02/05/2007 a las 06:23
  #5 (permalink)  
Antiguo 02/05/2007, 08:34
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

No me extraña que te lies, con todas las cosas distintas que hay... pero a mí esto me odia, cada día lo tengo mas claro xD

Poniendo:

Código:
	switch(Case intra3.Fields("tipo_nombre").Value){ 
                  case "comics":
                  	Response.Write("hola");
                              break;
                  default:
                 	 Response.Write("adios")                
            }
También tengo error

Tipo de error:
Error de compilación de Microsoft JScript (0x800A03EE)
Se esperaba ')'
/portal_joven/listado_destacados.asp, línea 37, columna 12

Linea 37: switch(Case intra3.Fields("tipo_nombre").Value){


Después he probado con esto:

Código:
			  	switch(Case (intra3.Fields("tipo_nombre").Value)){
                  case "comics":
                  	Response.Write("hola");
                              break;
                  default:
                 	 Response.Write("adios")                
            }
Y sigue habiendo error

Error en tiempo de ejecución de Microsoft JScript (0x800A138F)
'rstIntranet.Fields.id_destacado.value' es nulo o no es un objeto
/portal_joven/listado_destacados.asp, línea 34


Linea 34: vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado='"+ rstIntranet.Fields["id_destacado"].value +"')";

Con un Response Write tal que así:

Response.Write(rstIntranet.Fields["id_destacado"].value)

El error me dice que: 'rstIntranet.Fields.id_destacado.value' es nulo o no es un objeto

Si pruebo con :
Código:
 
<!-- #INCLUDE file="ADOJAVAS.inc" -->
<%
    cone=Server.CreateObject("ADODB.Connection");
    cone.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="+Server.MapPath("portaljoven.mdb"));
    rstIntranet=new ActiveXObject("ADODB.RecordSet");
    intra2=new ActiveXObject("ADODB.RecordSet");
    intra3=new ActiveXObject("ADODB.RecordSet");
    sentencia="Select top 4 * from destacados order by id_destacado desc";
    rstIntranet.Open(sentencia,cone,adOpenStatic,adCmdTable);    
    %>

    <table border=0>
    <%

    while (!rstIntranet.eof){
        %><tr>
            <% 
           
            vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado='"+ rstIntranet.Fields("id_destacado").value +"')";
			Response.Write(rstIntranet.Fields("id_destacado"))
            intra3.Open(vartabla,cone,adOpenStatic,adCmdTable); 
              
			  	switch(Case (intra3.Fields("tipo_nombre").Value)){
                  case "comics":
                  	Response.Write("hola");
                              break;
                  default:
                 	 Response.Write("adios")                
            }
            
                    
        %>
        </tr>            
        <%
             rstIntranet.Movenext();
        
        
    }
    %>
</table>
<%rstIntranet.close();
cone.close();%>
</body>
</html>

Es decir, cambiando: vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado='"+ rstIntranet.Fields("id_destacado").value +"')";
en vez de rstIntranet.Fields["id_destacado"].value el error varía:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][Controlador ODBC Microsoft Access] No coinciden los tipos de datos en la expresión de criterios.
/portal_joven/listado_destacados.asp, línea 36




Qué hago mal? Puede ser que la select esté mal hecha?
Por cierto lo de hacer la select así en vez de ir restandole 1 al máximo hasta llegar a 5 es una idea muy buena xD

Última edición por Shilfild; 02/05/2007 a las 08:44
  #6 (permalink)  
Antiguo 02/05/2007, 08:46
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset



Ves paso a paso. Recorre el primer recordset a ver que te devuelve:

while (!rstIntranet.eof){
Response.Write(rstIntranet.Fields.id_destacados.va lue);
rstIntranet.Movenext();
}

Tambien quita el Case de la sentencia

switch(Case intra3.Fields("tipo_nombre").Value){

En vez de eso, pon

switch(intra3.Fields("tipo_nombre").Value){

Sin el case




Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #7 (permalink)  
Antiguo 02/05/2007, 08:52
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Es que cuando me dán errores así, me pongo a probar todo

Solución 1.-
Código:
cone=Server.CreateObject("ADODB.Connection");
    cone.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="+Server.MapPath("portaljoven.mdb"));
    rstIntranet=new ActiveXObject("ADODB.RecordSet");
    intra2=new ActiveXObject("ADODB.RecordSet");
     intra3=new ActiveXObject("ADODB.RecordSet");
    sentencia="Select top 4 * from destacados order by id_destacado desc";
    rstIntranet.Open(sentencia,cone,adOpenStatic,adCmdTable);    

		while (!rstIntranet.eof){
			Response.Write(rstIntranet.Fields.id_destacados.value);
		rstIntranet.Movenext();
}

        
    
    %>
</table>
<%rstIntranet.close();
cone.close();%>
Error en tiempo de ejecución de Microsoft JScript (0x800A138F)
'rstIntranet.Fields.id_destacados.value' es nulo o no es un objeto
/portal_joven/listado_destacados.asp, línea 53


Linea 53: Response.Write(rstIntranet.Fields.id_destacados.va lue);


Solución 2.-
Error: Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][Controlador ODBC Microsoft Access] No coinciden los tipos de datos en la expresión de criterios.
/portal_joven/listado_destacados.asp, línea 36


Línea 36: intra3.Open(vartabla,cone,adOpenStatic,adCmdTable) ;


Tiene lógica, si rstIntranet.Fields.id_destacados no contiene ningún valor, la select que lo compara estará mal hecha.





**** Sigo peleandome con esto ****

He ido probando otras maneras a ver si así conseguia algo:

Por ejemplo si pongo:
Código:
while (!rstIntranet.eof){
        %><tr>
            <% 
			
 Response.Write(rstIntranet("destacados_tipo"));
 vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado='"+ rstIntranet("destacados_tipo") +"')";
 intra3.Open(vartabla,cone,adOpenStatic,adCmdTable);
El error no me salta en el response Write sino...

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][Controlador ODBC Microsoft Access] No coinciden los tipos de datos en la expresión de criterios.
/portal_joven/listado_destacados.asp, línea 36


Linea 36: intra3.Open(vartabla,cone,adOpenStatic,adCmdTable) ;


Si rstIntranet("destacados_tipo") no es nulo, no tendría por qué dar error no?

Y otra manera...

Código:
while (!rstIntranet.eof){
        %><tr>
            <% 
			
     Response.Write(rstIntranet("destacados_tipo"));
     vartabla="Select tipo_nombre from tipos where id_tipo=(select destacados_tipo from destacados where id_destacado=1)";
     intra3.Open(vartabla,cone,adOpenStatic,adCmdTable);
ADODB.Recordset (0x800A0E79)
La operación no está permitida si el objeto está abierto.
/portal_joven/listado_destacados.asp, línea 36


Linea 36: intra3.Open(vartabla,cone,adOpenStatic,adCmdTable) ;


Con esto supongo que se referirá a la conexión, he probado a Cerrarla y Abrirla antes de atacar a la BD pero, entonces me decía que estaba cerrada.... yo ya no sé qué pensar xD

Última edición por Shilfild; 03/05/2007 a las 02:35
  #8 (permalink)  
Antiguo 03/05/2007, 02:43
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

Hola Shilfild de nuevo,

Si me permites voy a reconstruir todo tu codigo para poder entender que te está pasando. Voy a ir comentandolo y, asi, si me equivoco en algo puedes hacer luego referencia a ello.

Código:
<%@ language="JScript" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<!-- Hay que cambiar esto por el diseño de la propia página -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../Intranet/web/intranet.css" rel="stylesheet" type="text/css">
<link href="../Intranet/web/scroll.css" rel="stylesheet" type="text/css">
</head>

<body>
<!-- #INCLUDE file="ADOJAVAS.inc" -->
<%
// *************************
// Realizamos las conexiones a la BD
// *************************

var cone=Server.CreateObject("ADODB.Connection");
cone.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="+Server.MapPath("portaljoven.mdb"));

// **********************************
//  Creamos instancias de los objetos Recordset
//  que vamos a utilizar en la página.
// **********************************

var rstIntranet=server.CreateObject("ADODB.RecordSet");
var rstBusqueda = Server.CreateObject("ADODB.RecordSet");

// **********************************
//  Cadena con la sentencia SQL: Queremos los
//  4 ultimos registros de la tabla destacados
// **********************************

var  sentencia="Select top 4 id_destacado from destacados order by id_destacado desc";

// **********************************
//  Cargamos el primer recordset para la
//  sentencia SQL
// **********************************

rstIntranet.Open(sentencia,cone,adOpenStatic,adCmdTable);    

%>

    <table border=0>
    <%
    // ******************************
    // * Bucle de resultados (TOP 4 DESC)    *
    // ******************************
    while (!rstIntranet.eof){
    
    %>
    <tr>
    <% 
         // ***********************************
         // * Realizamos otra busqueda en base a los      *
         // * resultados del primer recordset. Queremos   *
         // * los nombres de tipos de los registros          *
         // * seleccionados en el primer recordset          *
         // * NOTA: siempre y cuando el campo no esté  *
         // * vacio                                                    *
         // ***********************************
          if (rstIntranet.Fields(0).value!="") {
                sentencia = "SELECT t.tipo_nombre
FROM tipos t INNER JOIN destacados d ON t.id_tipo = d.destacados_tipo WHERE d.id_destacado="+rstIntranet.Fields(0).value 
                 // ************************
                 // Cargamos el segundo recordset
                 // ************************
                 rstBusqueda.Open(sentencia,cone,adOpenStatic,adCmdTable); 
              
                 // ************************
                 // Comprobamos el resultado de 
                 // la segunda busqueda
                 // ************************
                 if(!rstBusqueda.EOF) { 
                        // ***************************
                        // Si el valor del campo es 'comics'
                        // visualizamos una cosa. En caso
                        // contrario, vemos lo que nos
                        // trae.
                        // ***************************
                        switch(rstBusqueda.Fields(0).value) {
                        case "comics":
                            Response.Write("Destacado ID: " + rstIntranet.Fields(0).value + " es comics");
                            break;
                         default:
                            Response.Write("Destacado ID: " + rstIntranet.Fields(0).value + " es " + rstBusqueda.Fields(0).value);
                         }
                  } // f(!rstBusqueda.EOF)
                  // ******************
                  // cerramos la busqueda
                  // pero no desconectamos
                  // para poder seguir
                  // buscando
                  // ******************
                  rstBusqueda.close();
          } // if (rstIntranet.Fields(0).value!="")
                    
        %>
        </tr>            
        <%
             // ***************************
             // Nos movemos al siguiente registro
             // *************************** 
             rstIntranet.Movenext();
    } // while (!rstIntranet.eof){
    %>
</table>
<%
// ****************
// Cerramos objetos
// ****************

rstIntranet.close();
rstBusqueda = null;
rstIntranet = null;
cone.close();
cone = null;
%>
</body>
</html>

A ver si esto te ayuda en algo



Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #9 (permalink)  
Antiguo 03/05/2007, 02:51
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Madre mía, en algo? EN TODO xD Si qu funciona así, hay varias cosas que no estoy muy segura de lo que hacen (sintaxis), asique lo mirare a fondo,porque supongo que podré imaginar lo que hace cada cosa viendo el resultado, lo que me ha dejado flipada ha sido la select.. madre mía y pensar que ahora tengo que hacer más xD intentaré descifrar cómo lo has hecho, pero posiblemente haya un post de preguntas refiriendose a tu código xD

Muchas gracias!
  #10 (permalink)  
Antiguo 03/05/2007, 03:34
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Vayamos por pasos xD

Código:
rstIntranet.Fields(0).value!=""
Se pone Fields(0) porque en la select sólo hemos cogido un valor, verdad? si hubieramos cogido dos valores, sería Fields(0) y Fields(1)?

Código:
sentencia = "SELECT t.tipo_nombre FROM tipos t INNER JOIN destacados d ON t.id_tipo = d.destacados_tipo WHERE d.id_destacado="+rstIntranet.Fields(0).value
Nunca había visto una select así... de BD sólo he dado Oracle sería algo así cómo: Coger el tipo_nombre de tipos donde la id_tipo de tipos sea igual que destacados_tipo, en el cual id_destacado sea igual al valor recogido.

Pero no entiendo lo que hacen exactamente ese inner join y ese on... podrías explicarmelo?

Código:
rstIntranet.close();
rstBusqueda = null;
rstIntranet = null;
cone.close();
cone = null;
Aquí entiendo lo del close, pero el null, es como igualar a nada? para que estén vacias no?
  #11 (permalink)  
Antiguo 03/05/2007, 03:54
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

Cita:
Iniciado por Shilfild Ver Mensaje

Se pone Fields(0) porque en la select sólo hemos cogido un valor, verdad? si hubieramos cogido dos valores, sería Fields(0) y Fields(1)?
Efectivamente Si en el select hubieramos puesto SELECT TOP 4 campo1, campo2; campo1 corresponderia a Fields(0), campo2 a Fields(1) y asi sucesivamente.

Cita:
Iniciado por Shilfild Ver Mensaje

sentencia = "SELECT t.tipo_nombre FROM tipos t INNER JOIN destacados d ON t.id_tipo = d.destacados_tipo WHERE d.id_destacado="+rstIntranet.Fields(0).value

Nunca había visto una select así... de BD sólo he dado Oracle sería algo así cómo: Coger el tipo_nombre de tipos donde la id_tipo de tipos sea igual que destacados_tipo, en el cual id_destacado sea igual al valor recogido.

Pero no entiendo lo que hacen exactamente ese inner join y ese on... podrías explicarmelo?
Correcto. El uso de INNER JOIN (y su antagonista OUTER JOIN) es bastante común. Sirven para buscar datos en dos o mas tablas que presenten rasgos comunes (emparejar filas). Es lo mismo que las busquedas cartesianas (creo que se llaman asi):

SELECT t.tipos_nombre
FROM tipos t, destacados d
WHERE t.id_tipo = d.destacados_tipo AND d.id_destacados = 1

Pero su busqueda es mas eficiente en aquellas tablas indexadas. Busca en San Google. Hay una amplia variedad de sitios en castellano explicandolas (INNER JOIN, LEFT OUTER JOIN y RIGHT OUTER JOIN).


Cita:
Iniciado por Shilfild Ver Mensaje

Código:
rstIntranet.close();
rstBusqueda = null;
rstIntranet = null;
cone.close();
cone = null;
Aquí entiendo lo del close, pero el null, es como igualar a nada? para que estén vacias no?
Es una buena costumbre solamente Lo unico que hago es liberar la memoria de objetos que no voy a volver a usar. Una mania de cuando los ordenadores tenian 512k :P Aun hoy dia es válido ya que el uso de la memoria es limitado.



Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #12 (permalink)  
Antiguo 03/05/2007, 04:03
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Ah! Muchas gracias por las explicaciones, ahora me toca hacer selects para cada resultado posible, menuda locura! xD
  #13 (permalink)  
Antiguo 03/05/2007, 04:23
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Una dudita más poniendo esto:

Código:
switch(rstBusqueda.Fields(0).value) {
                        case "comic":
var rstcomics= Server.CreateObject("ADODB.RecordSet");
var comic="Select comic_titulo,comic_imagen from comics where id_comic='"+ rstIntranet.Fields(0).value +"'";
							rstcomics.Open(comic,cone,adOpenStatic,adCmdTable);
Response.Write("Destacado ID: " + rstIntranet.Fields(0).value + " es comics");
Response.Write("<a href='desarrollo_comics.asp?Id="+rstcomics.Fields(0).value+"' class='desarrollo' target='_parent'>"+rstcomics.Fields(0).value+"</a>")
break;
Salía bien, en cambio, si declaraba el Recordset arriba, dónde el resto, me decia que el objeto ya estaba abierto, tiene alguna lógica? Sólo lo uso ahí no entiendo el problema de declararlo más arriba
  #14 (permalink)  
Antiguo 03/05/2007, 05:24
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

Hay tres pasos siempre que se usa un objeto:

- La construccion de la instancia:
var rstcomics= Server.CreateObject("ADODB.RecordSet");

- La asignacion de valores a la instancia y su manipulacion:
rstcomics.Open(comic,cone,adOpenStatic,adCmdTable) ;
rstcomics.close();
- La destruccion de la instancia:
rstcomics = null;

Como puedes ver el metodo close() no destruye la instancia. Simplemente cierra la conexion con la instancia del objeto Connection (tampoco cierra la BD, solo cierra esa solicitud a la BD) Para cerrar la conexion con la BD tenemos que usar el metodo close() de la instancia del objeto Connection (cone.close()) ¿Qué significa esto? que no hay que volver a construir la instancia del recordset, simplemente volver a abrirla (fijate como lo hago con rstBusqueda) Si vuelves otra vez (RECUERDA EL LOOP DEL WHILE) e intentas redeclarar rstComics te dirá que el objeto ya existe pero si encima no lo cierras te dirá que está abierto.

Por eso:
- no declares nada dentro de un bucle. Hazlo antes.
- Cierra los objetos ADO que esten dentro de un bucle pues si no seguirán abiertos y dará error.
- TEN CUIDADO CON LOS TIPOS DE DATOS

Esto:
var rstcomics= Server.CreateObject("ADODB.RecordSet");

Con el resto. Es, ademas, bueno tener juntitos todas las variables que vas a usar ya que de un vistazo puedes saber si existen o no.

Código:
switch(rstBusqueda.Fields(0).value) {
                        case "comic":

                             var comic="Select comic_titulo,comic_imagen from comics where id_comic="+ rstIntranet.Fields(0).value;
                             rstcomics.Open(comic,cone,adOpenStatic,adCmdTable);
                             Response.Write("Destacado ID: " + rstIntranet.Fields(0).value + " es comics");
                             Response.Write("<a href='desarrollo_comics.asp?Id="+rstcomics.Fields(0).value+"' class='desarrollo' target='_parent'>"+rstcomics.Fields(0).value+"</a>")
                             rstcomics.close();
                             break;
Y destruyelo al final:

rstcomics = null;








Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #15 (permalink)  
Antiguo 03/05/2007, 05:34
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Vale, hecho y captado, en su momento no entendía la logica x_x
  #16 (permalink)  
Antiguo 03/05/2007, 06:21
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Uhm.. me dá otro error cuando incluyo otro case

Declaro el Recordset arriba:

Código:
var rstcomics= Server.CreateObject("ADODB.RecordSet");
var rstconcierto= Server.CreateObject("ADODB.RecordSet");
Lo uso abajo:
Código:
 switch(rstBusqueda.Fields(0).value) {
case "comic":
var comic="Select comic_titulo,comic_imagen from comics where id_comic='"+ rstIntranet.Fields(0).value +"'";
							rstcomics.Open(comic,cone,adOpenStatic,adCmdTable);
//Response.Write("Destacado ID: " + rstIntranet.Fields(0).value + " es comics");
Response.write("<img src='"+rstcomics.Fields(1).value+"'>")
Response.Write("<a href='desarrollo_comics.asp?Id="+rstcomics.Fields(0).value+"' class='desarrollo' target='_parent'>"+rstcomics.Fields(0).value+"</a>")
rstcomics.close();
break;
						
case "conciertos":
var conciertos="Select concierto_titulo,concierto_imagen from conciertos where id_concierto='"+ rstIntranet.Fields(0).value +"'";
							rstconcierto.Open(conciertos,cone,adOpenStatic,adCmdTable);                          
Response.write("<img src='"+rstconcierto.Fields(1).value+"'>")
Response.Write("<a href='desarrollo_comics.asp?Id="+rstconcierto.Fields(0).value+"' class='desarrollo' target='_parent'>"+rstconcierto.Fields(0).value+"</a>")
rstconcierto.close();
break;
Y me dá este error:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][Controlador ODBC Microsoft Access] No coinciden los tipos de datos en la expresión de criterios.
/portal_joven/listado_destacados_zuri.asp, línea 87


Linea 87: rstconcierto.Open(conciertos,cone,adOpenStatic,adC mdTable);

Lo único que se me puede ocurrir es .. que de error con el cone, pero no tengo que cerrarlo y abrirlo cada vez no?
  #17 (permalink)  
Antiguo 03/05/2007, 06:54
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

No, es un error de tipos. Veamos

elect comic_titulo,comic_imagen from comics where id_comic="+ rstIntranet.Fields(0).value
en vez de
elect comic_titulo,comic_imagen from comics where id_comic='"+ rstIntranet.Fields(0).value +"'"


Select concierto_titulo,concierto_imagen from conciertos where id_concierto="+ rstIntranet.Fields(0).value;

en vez de

Select concierto_titulo,concierto_imagen from conciertos where id_concierto='"+ rstIntranet.Fields(0).value +"'";


¿Recuerdas lo que te dije de los tipos?



Por cierto, ¿para que usas varias instancias diferentes si solo requieres una?

rstconcierto, rstcomics, etc Con una sola te vale ya que a cada iteracion del bucle abre y cierra el recordset con una nueva agrupacion de datos. Basta con crear una instancia (por ej. rstSecundaria ) y asi liberas espacio de memoria que reservas con cada instancia.

Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -

Última edición por tammander; 03/05/2007 a las 07:01
  #18 (permalink)  
Antiguo 03/05/2007, 08:27
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

Resulta que si en comics pongo:

Código:
Select comic_titulo,comic_imagen from comics where id_comic="+ rstIntranet.Fields(0).value
en vez de lo que tenía no sale Ô_O en cambio con
Código:
var comic="Select comic_titulo,comic_imagen from comics where id_comic='"+ rstIntranet.Fields(0).value +"'";
si que sale, que cosa más rara...

Por otra parte, no sé si te he entendido muy bien, pero el problema es que cada tabla de la BD tiene campos completamente distintos.

Lo de los Recordsets, pues tienes toda la razon del mundo, fallo mío, pero gracias por decirmelo xD
  #19 (permalink)  
Antiguo 03/05/2007, 09:07
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Duda con el objeto Recordset

Intenta averiguar de que tipos son los campos por los que buscas:

id_comic --> ¿Integer, Varchar, Texto, Numerico, etc?
id_concierto --> Lo mismo


Asi con todos los campos en los cuales necesites buscar. Si son numericos, dobles o decimales, no uses comillas. Si son de texto, si debes usarlas. Si son de fecha, las celdillas (#22/12/2007#).




Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #20 (permalink)  
Antiguo 03/05/2007, 09:11
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Duda con el objeto Recordset

No me dí cuenta de que id_comic estaba puesto cómo texto, ya lo cambié.

Última edición por Shilfild; 04/05/2007 a las 04:21
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:25.