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

Filtrar un RecordSet

Estas en el tema de Filtrar un RecordSet en el foro de ASP Clásico en Foros del Web. ...después de haber hecho una sentencia SQL tengo como resultado un RecordSet (RS) con un listado de empresas...hasta aqui bien... ...ahora me gustaría hacer un ...
  #1 (permalink)  
Antiguo 11/02/2003, 06:07
Avatar de codify  
Fecha de Ingreso: febrero-2002
Ubicación: Barcelona (España)
Mensajes: 183
Antigüedad: 23 años, 2 meses
Puntos: 1
Filtrar un RecordSet

...después de haber hecho una sentencia SQL tengo como resultado un RecordSet (RS) con un listado de empresas...hasta aqui bien...
...ahora me gustaría hacer un filtrado de este listado y que solo quedaran en el RecordSet (RS) las que cumplan una norma X...se pueden eliminar registros de un RecordSet o debería crear una tabla nueva con este listado, espero que no porque eso ya es una movida chunga...

...si no se pudiera hacer lo de eliminar registros de un RecordSet (RS)...alguien me podría dar una idea de como hacerlo de otra forma????

...ya sé que podría haber incluido la norma X en la primera sentencia SQL pero en mi caso (que no empezaré a contar) eso es imposible y debo hacer filtrado sobre filtrado por fuerza...

...gracias de antemano!...
__________________
====================
Codify
====================
  #2 (permalink)  
Antiguo 11/02/2003, 06:16
Avatar de DanielRey
Usuario no validado
 
Fecha de Ingreso: enero-2001
Ubicación: Mendoza
Mensajes: 630
Antigüedad: 24 años, 3 meses
Puntos: 1
Hola Codify

Ignoro lo de filtrar el recordset pero, ¿no te sirve hacerlo por código?, digo, supongo que querrás mostrar las que cumplen con determinada norma, entonces:

Código PHP:
Do While Not Rs.EOF
  
if [I]Cumple_con_la_norma[/I]  Then
    Response
.Write ...
  
End If
  
Rs.MoveNext
Loop 
Suerte
  #3 (permalink)  
Antiguo 11/02/2003, 06:39
Avatar de codify  
Fecha de Ingreso: febrero-2002
Ubicación: Barcelona (España)
Mensajes: 183
Antigüedad: 23 años, 2 meses
Puntos: 1
gracias pero no me sirve...

no me sirve porque el filtrado quiero que siga siendo un RecordSet para que en un futuro pueda hacer otro "subfiltrado"...

...aunque gracias de todos modos...
__________________
====================
Codify
====================
  #4 (permalink)  
Antiguo 11/02/2003, 06:48
Avatar de DanielRey
Usuario no validado
 
Fecha de Ingreso: enero-2001
Ubicación: Mendoza
Mensajes: 630
Antigüedad: 24 años, 3 meses
Puntos: 1
Encontré algo...

Un archivo de ayuda que se llama ADO210.CHM y pesa 827 Kb (si querés que te lo pase, mandame un mail desde mi perfil en el foro indicando a que mail te lo envío).

Allí encontré esto:

Filter, propiedad


Especifica un filtro para datos en un Recordset.

Configuración y valores devueltos

Establece o devuelve un valor Variant, que puede contener uno de los siguientes elementos:

Cadena de criterios: una cadena compuesta por una o más cláusulas individuales concatenadas con operadores AND u OR.


Matriz de marcadores: una matriz de valores de marcador que apuntan a registros del objeto Recordset.


Uno de los valores siguientes de FilterGroupEnum. Constante Descripción
adFilterNone Elimina el filtro actual y vuelve a poner todos los registros a la vista.
adFilterPendingRecords Permite ver sólo los registros que han cambiado, pero que no han sido enviados aún al servidor. Aplicable sólo para el modo de actualización por lotes.
adFilterAffectedRecords Permite ver sólo los registros afectados por la última llamada a Delete, Resync, UpdateBatch o CancelBatch.
adFilterFetchedRecords Permite ver los registros de la caché actual, es decir, los resultados de la última llamada para recuperar registros de la base de datos.
adFilterConflictingRecords Permite ver los registros que fallaron en el último intento de actualización por lotes.


Comentarios

Utilice la propiedad Filter para descartar de manera selectiva registros de un objeto Recordset. El Recordset filtrado se convierte en el cursor actual. Esto afecta a otras propiedades, como AbsolutePosition, AbsolutePage, RecordCount y PageCount, que devuelven valores basados en el cursor actual, puesto que al establecer para la propiedad Filter un valor específico, el registro actual se moverá al primer registro que cumpla el nuevo valor.

La cadena de criterios se compone de cláusulas con el formato NombreCampo -Operador-Valor (por ejemplo, "LastName = 'Smith'"). Se pueden crear cláusulas compuestas mediante la concatenación de cláusulas individuales con AND (por ejemplo, "LastName = 'Smith' AND FirstName = 'John'") u OR (por ejemplo, "LastName = 'Smith' OR LastName = 'Jones'"). Utilice las siguientes directrices para las cadenas de criterios:

NombreCampo debe ser un nombre de campo válido del Recordset. Si el nombre de campo contiene espacios, deberá poner el nombre entre corchetes.


Operador debe ser uno de los siguientes: <, >, <=, >=, <>, = o LIKE.


Valor es el valor con el que comparará los valores de los campos (por ejemplo, 'Smith', #8/24/95#, 12.345 o $50.00). Utilice comillas sencillas con las cadenas y el símbolo de almohadilla (#) con las fechas. Para los números, puede utilizar puntos decimales, el signo de dólar y la notación científica. Si Operador es LIKE, en Valor se podrán utilizar comodines. Los únicos comodines que se admiten son el asterisco (*) y el signo de porcentaje (%) y deben ser el último carácter de la cadena. Valor no puede ser Null.


No existe prioridad entre AND y OR. Las cláusulas se pueden agrupar entre paréntesis. No obstante, no puede agrupar cláusulas unidas por un operador OR y después unir el grupo a otra cláusula con un operador AND, como en este ejemplo:
(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

En su lugar, debería generar este filtro como:
(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')

En una cláusula LIKE, puede utilizar un comodín al principio y al final del modelo (por ejemplo, LastName Like '*mit*'), o solamente al final del modelo (por ejemplo, LastName Like 'Smit*').
Las constantes de filtro permiten solucionar fácilmente los conflictos entre registros individuales durante el modo de actualización por lotes, permitiéndole ver, por ejemplo, sólo los registros afectados durante la última llamada al método UpdateBatch.

Incluso, es posible que no se pueda establecer la propiedad Filter debido a un conflicto con los datos subyacentes (por ejemplo, un registro ha sido eliminado por otro usuario). En este caso, el proveedor devolverá mensajes de advertencia a la colección Errors pero no detendrá la ejecución del programa. Se producirá un error en tiempo de ejecución sólo si hay conflictos en todos los registros solicitados. Utilice la propiedad Status para localizar los registros con conflictos.

Si establece para la propiedad Filter una cadena de longitud cero (""), esto tendrá el mismo efecto que utilizar la constante adFilterNone.

Cada vez que se establece la propiedad Filter, la posición del registro actual se mueve al primer registro del subconjunto de registros filtrados del Recordset. De manera similar, cuando se borra la propiedad Filter, la posición del registro actual pasa al primer registro del Recordset.

Vea la propiedad Bookmark para obtener una explicación acerca de los valores de marcación desde los que puede generar una matriz para utilizar con la propiedad Filter.
  #5 (permalink)  
Antiguo 11/02/2003, 06:50
 
Fecha de Ingreso: enero-2002
Ubicación: Dentro del corralón
Mensajes: 287
Antigüedad: 23 años, 4 meses
Puntos: 0
¿Probaste con la propiedad filter?

No la usé nunca pero acá tenés el link
Suerte.
__________________
Leonardo D'Angelo
  #6 (permalink)  
Antiguo 11/02/2003, 06:53
Avatar de DanielRey
Usuario no validado
 
Fecha de Ingreso: enero-2001
Ubicación: Mendoza
Mensajes: 630
Antigüedad: 24 años, 3 meses
Puntos: 1
Ejemplo de las propiedades Filter y RecordCount

Este ejemplo utiliza la propiedad Filter para abrir un nuevo objeto Recordset basado en una condición especificada aplicada a un objeto Recordset existente. Utiliza la propiedad RecordCount para mostrar el número de registros de ambos objetos Recordset. La función FilterField es necesaria para poder ejecutar este procedimiento.

Public Sub FilterX()

Dim rstPublishers As ADODB.Recordset
Dim rstPublishersCountry As ADODB.Recordset
Dim strCnn As String
Dim intPublisherCount As Integer
Dim strCountry As String
Dim strMessage As String

' Abre un objeto Recordset con datos de la tabla Editores.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
Set rstPublishers = New ADODB.Recordset
rstPublishers.CursorType = adOpenStatic
rstPublishers.Open "editores", strCnn, , , adCmdTable

' Llena el objeto Recordset.
intPublisherCount = rstPublishers.RecordCount

' Obtiene la entrada del usuario.
strCountry = Trim(InputBox( _
"Escriba el país por el que desea filtrar:"))

If strCountry <> "" Then
' Abre un objeto Recordset filtrado.
Set rstPublishersCountry = _
FilterField(rstPublishers, "País", strCountry)

If rstPublishersCountry.RecordCount = 0 Then
MsgBox "No hay editores de ese país."
Else
' Imprime el número de registros del objeto Recordset
' original y del objeto Recordset filtrado.
strMessage = "Pedidos del conjunto de registros original: " & _
vbCr & intPublisherCount & vbCr & _
"Pedidos del conjunto de registros filtrado (País = '" & _
strCountry & "'): " & vbCr & _
rstPublishersCountry.RecordCount
MsgBox strMessage
End If
rstPublishersCountry.Close

End If

End Sub

Public Function FilterField(rstTemp As ADODB.Recordset, _
strField As String, strFilter As String) As ADODB.Recordset

' Establece un filtro sobre el objeto Recordset especificado y,
' después, abre un nuevo objeto Recordset.
rstTemp.Filter = strField & " = '" & strFilter & "'"
Set FilterField = rstTemp

End Function



Nota Cuando se conocen los datos que se desean seleccionar, suele ser más eficiente abrir un objeto Recordset con una instrucción SQL. El ejemplo siguiente ilustra cómo se puede crear un único objeto Recordset y obtener registros de un país específico.

Public Sub FilterX2()

Dim rstPublishers As ADODB.Recordset
Dim strCnn As String

' Abre un objeto Recordset con datos de la tabla Editores.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
Set rstPublishers = New ADODB.Recordset
rstPublishers.CursorType = adOpenStatic
rstPublishers.Open "SELECT * FROM Editores " & _
"WHERE País = 'EE.UU.'", strCnn, , , adCmdText

' Imprime los datos actuales en un objeto Recordset.
rstPublishers.MoveFirst
Do While Not rstPublishers.EOF
Debug.Print rstPublishers!pub_name & ", " & _
rstPublishers!country
rstPublishers.MoveNext
Loop

rstPublishers.Close

End Sub
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 15:40.