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

Consulta y Subconsulta a BD

Estas en el tema de Consulta y Subconsulta a BD en el foro de ASP Clásico en Foros del Web. Hola, mi problema es el siguiente. Necesito montar una consulta a Bd (Access) en la que no se repitan los registros Campos de Bd IdMensaje ...
  #1 (permalink)  
Antiguo 03/12/2007, 07:29
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Consulta y Subconsulta a BD

Hola, mi problema es el siguiente.

Necesito montar una consulta a Bd (Access) en la que no se repitan los registros

Campos de Bd

IdMensaje - Autonumérico
Cabecera - Numérico //// Toma el autonumérico
Padre - Numérico /// Valor 0 si es primer msg de una discusión. Toma valor Cabecera si no es el primer msg de la discusión
Cuerpo - Memo /// El mensaje en sí

Ej.-
IdMensaje /// Cabecera /// Padre /// Cuerpo
154 154 0 Esto es un msg
155 154 154 Esto es un msg
156 156 0 Esto es un msg
etc...

Espero que hasta aquí se entienda

Bien, ahora viene la consulta.
Busco en el campo Cuerpo cadena de caracteres que coincidan con la cadena recogida del form.
Si en esta ocasión se busca la cadena "es", aparecerían 3 registros, cuando solamente deberían aparecer 2 ya que 154 y 155 pertenecen a la misma discusión.

He montado todas la consultas y subconsulta que se me han ocurrido (In, Exists, Distinct, DistinctRow, etc...) pero no he logrado mi propósito.

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #2 (permalink)  
Antiguo 03/12/2007, 09:40
Avatar de JuanRAPerez
Colaborador
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.393
Antigüedad: 20 años, 7 meses
Puntos: 27
Re: Consulta y Subconsulta a BD

y tu select se lee
basados ene l ejemplo "es"

select * from tutabla where cuerpo like '%es%'

si son inicio de discusión el padre es 0 cierto entonces utiliza eso para tu sql

select * from tutabla where cuerpo like '%es%' and padre = 0

es asi o me perdi?
__________________
JuanRa Pérez
San Salvador, El Salvador
  #3 (permalink)  
Antiguo 04/12/2007, 06:53
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Re: Consulta y Subconsulta a BD

Gracias JuanRaPerez por contestar, pero no es así. Creo que no me expliqué bien

Veamos, tu solución no me es válida, ya que si añado un registro más y al registro 156 le quito la subcadena "es" tal que así

Ej.-
IdMensaje /// Cabecera /// Padre /// Cuerpo
154 154 0 Esto es un msg
155 154 154 Esto es un msg
156 156 0 Esto un msg
157 156 156 Esto es un msg
etc...,

Me devuelve el registro 154, cuando tendría que ser el 154 y 156. Ya que los registro 155 y 157 son hijos del 154 y 156 respectivamente.

En conclusión lo que quiero que me devuelva es el valor 154 en esta disposición de registros

Ej.-
IdMensaje /// Cabecera /// Padre /// Cuerpo
154 154 0 Esto es un msg
155 154 154 Esto es un msg

ya que la consulta encuentra Padre e Hijo poseen la subcadena "es"

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #4 (permalink)  
Antiguo 05/12/2007, 01:01
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Re: Consulta y Subconsulta a BD

, una idea descabellada.....

tomando en consideracion que la estructura de la base de datos sea de la siguiente forma:
Código PHP:
campo        valor en arreglo
idcomentario      0
cabecera          1
padre             2
cuerpo            3 
de esto nos basamos para la realizacion del listado de registros
el codigo similar a esto

Código PHP:
'Realizamos la consulta, y si existen resultados, se creara un arreglo
SQL = "select * from tabla where cuerpo like '
%" & criterio & "%'"
set rs = conexion.execute(SQL)

if Err=0 then
    if RS.EOF=FALSE then
        '
Eurekafunciono!!
        
resultados=RS.getrows
    
else
        
response.write "No sabes buscar, no encontre nada..."
    
end if
else
    
response.write "Esto valio .... llamale al doctor"
end if
'liberamos la base de datos
conexion.close
set RS = nothing
set conexion = nothing

'
si existio un resultadose creara el arregloy se podra mostrar
if isarray(resultadosthen

    
'inicializo, y evitemos errores
    cabecera = ""
    padre = ""

    for I = 0 to UBound(resultados,2) 

        padre = resultados(2,I)
        mensaje = resultados(3,I)

        '
verificando mensajes consecuentes
        
if cabecera resultados(1,Ithen

            
'verifico que sea el primer mensaje
            if padre = 0 then
                response.write "Mensaje " & mensaje
                cabecera = resultados(1,I)

            '
esto se realiza en caso de que contenga respuestas el post inicial
            
else
                
response.write "<span>" mensaje "</span>"
                
cabecera resultados(1,I)
            
end if

        
esto ocurre cuando cambiamos de tema
        
else
            if 
padre 0 then
                response
.write "Mensaje " mensaje
                cabecera 
resultados(1,I)
            else
                
response.write "<span>" mensaje "</span>"
                
cabecera resultados(1,I)
            
end if
        
end if
    
next
end 
if 
al final de cuentas solo es una idea; de aki podria generarse alguna sentencia SQL
mas estructurada o alguna forma de que este codigo sea lo mas sencillo posible

__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #5 (permalink)  
Antiguo 05/12/2007, 07:32
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Re: Consulta y Subconsulta a BD

Gracias Shiryu_Libra intentaré adaptarlo a lo que ya tengo hecho. Como siempre aportando buenas ideas
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #6 (permalink)  
Antiguo 18/12/2007, 08:12
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 5 meses
Puntos: 126
Re: Consulta y Subconsulta a BD

Finalmente no he podido hacerlo como me decía Shiryu_Libra, por varias razones:

El subindice caía fuera del intervalo cuando encontraba a un hijo
La matríz tenía que ser de 12 dimensiones
Quería página los resultados
etc...
así que lo dejé por un tiempo y ayer se me ocurrió un forma tosca pero funciona

Código PHP:
Recogo el valor del form
Hago un Split

Call ConectarForo
Call Registro 
(rs)

' Con las subcadena inicio la consulta

SQL = "Select IdMensaje, Cabecera, Padre, Cuerpo, Fecha FROM Mensajes WHERE "
For i=0 to (UBound(array_cadena))
if i <> 0 then 
SQL = SQL & "OR "
end if
SQL = SQL & "LCase(Cuerpo) LIKE  '
%"&Espacio & array_cadena(i) & Espacio&"%'  "
Next '
i
SQL 
SQL "ORDER BY Fecha desc;"

rs.Open SQLoConn,3,1

IF rs.EOF then ' No se han contrado registros
%>
No se ha encontrado nada
<%
ELSE ' 
Se encontraron registros

' ====== Saca Id's de registros encontrados 
Dim registros
Dim suma
registros
=rs.getrows
suma 
UBound(registros,2)+1
' ====== Fin Saca Id's de registros encontrados 

Call LimpiarRS 
(rs)

' ========= Elimino los registros repetetidos en la consulta anterior ===============
Dim iniValores()
Dim limValores()
Redim iniValores(suma)

    For j=0 to UBound(registros,2)
    iniValores(j) =registros(IdCabecera,j)
    Next '
j

redim preserve limValores
(1)
limValores(0)=iniValores(0)

        For 
x=0 to (UBound(iniValores)-1)
Dim resultado
resultado
=0
    
For y=0 to (ubound(limValores)-1)
    
resultado=StrComp(iniValores(x),limValores(y),1)
    if (
resultado=0then 
    
exit for
    
end if
    
Next 'y
        if(resultado<>0)then
        redim preserve limValores(ubound(limValores)+1)
        limValores(ubound(limValores)-1)=iniValores(x)
        end if
        Next '
x
' ========= Fin Elimino los registros repetetidos ===============

Call Registro (rs1)

Consulta sobre las Ids resultantes

SQL 
"Select IdMensaje, Fecha FROM Mensajes WHERE "

 
For z=0 to (UBound(limValores)-1)
if 
<> 0 then
SQL 
SQL "OR "
end if
SQL SQL "IdMensaje = "CInt(limValores(z)) & " "
Next ' z
SQL = SQL & "ORDER BY Fecha desc;"
rs1.Open SQL, oConn,3,1

====== Saca Id's de registros encontrados 
Dim resulfinal
resulfinal=rs1.getrows
====== Fin Saca Id's de registros encontrados 

Call LimpiarRS (rs1)
Call LimpiarConexion

'
========== Imprime lista registros encontrados ==========
For 
z=0 to UBound(resulfinal,2)
%>
Listado de registros
<%
Next 'z
==== Fin imprime lista registros encontrados  ========
%> 
Esto es todo
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #7 (permalink)  
Antiguo 18/12/2007, 09:59
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Re: Consulta y Subconsulta a BD

lo importante es que te funcione, independientemente de la lluvia de ideas que todo mundo pueda aportarte, recuerda que la principal razon es la orientacion para resolver los problemas

__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
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 23:22.