Autor Tema: ADO posicion y cuanto registros en un Recorset?  (Leído 12260 veces)

0 Usuarios y 1 Visitante están viendo este tema.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
ADO posicion y cuanto registros en un Recorset?
« en: Enero 02, 2012, 01:37:41 am »
Hola chicos una pregunta tonta estoy haciendo algo con ADO, la pregunta es como puedo saber la posicion del del recorset es decir cuantos registros tengo cargado y en que posicion esta?




Código: (VB) [Seleccionar]
    cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                           App.Path & "\db1.mdb" & ";Persist Security Info=False"
   
    cnn.Open
   
    rs.Open "Select * from Clientes", cnn, adOpenDynamic, adLockOptimistic

Código: [Seleccionar]
rs.MovePrevious
rs.MoveNext

no encuentro algo que seria rs.Count o rs.Position me explico?

Saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #1 en: Enero 02, 2012, 02:08:38 am »
Hola Leandro.

Inmediatamente después de rs.Open "Select ... " ya puedes saber cuantos registros tienes cargados en el recordset:

MiVariable = rs.RecordCount

No es necesario posicionarse ni al principio ni al final para saber cuantos registros existen.


Saludos
« última modificación: Enero 02, 2012, 02:14:31 am por YAcosta »
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #2 en: Enero 02, 2012, 03:42:53 am »
Hola Yvan, había probado con RecordCount pero me tiraba -1 lo mismo para AbsolutePosition y es porque uso el flag adOpenDynamic, segun en este hilo hay una explicación, pero bien yo lo que estoy haciendo es un ABM para la tabla Clientes, que problema o desventaja traeria usar las otras adOpenForwardOnly, adOpenKeySet, adOpenStatic, es mejor usar adOpenDynamic y porque?

SAludos.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #3 en: Enero 02, 2012, 12:38:37 pm »
Hola, Leandro, y para que usas .MovePrevius o .MoveNext ?, solamente que estes haciendo el AMB tipo flechitas que van avanzando de a un registro, lo cual no lo recomiendo para nada, mejor una grilla, yo ya me olvide hace tiempo de usar eso, solamente lo uso cuando tengo que recorrer un recordset en memoria, ahi si es necesario.

el tema de los cursores del recordset es asi, segun el tipo que uses la propiedad recordcount te va a devolver -1, y tambien segun el que uses, perdes el manejo de algunas propiedades, por ejemplo si lo abris en adOpenForwardOnly, solo vas a poder recorrer para delante y el recordcount te va a devolver -1.

yo uso 2 tipos, aclarar que el adOpenForwardOnly es terriblemente mas rapido que el que se usa siempre que es el adOpenStatic, el tema que con adOpenForwardOnly no te podes mover, con el otro si.

o sea que si necesitas "velocidad" y solo recorer para adelante, por ejemplo cargar un listview, usa adOpenForwardOnly, cuando necesites volver para atras y demas usa adOpenStatic.

con respecto al bloqueo uso siempre adLockReadOnly.

tambien me he fijando que la "solucion" para que al usar adOpenForwardOnly no te devuelva -1 es que en la conexion principal le tenes que poner .CursorLocation = adUseClient, con eso estas listo.

por lo tanto ese open ahi si lo unico que necesitas hacer es ir para adelante, seria asi, el adOpenStatic se pone solo por defecto en el segundo parametro, es mas si tampoco pones el adOpenForwardOnly, te lo pone igual ya que es por defecto ese.

Código: (vb) [Seleccionar]
rs.Open "Select * from Clientes", cnn, adOpenForwardOnly
y si necesitas recorrer y volver para atras y demas:

Código: (vb) [Seleccionar]
rs.Open "Select * from Clientes", cnn, adOpenStatic, adLockReadOnly
saludos.
« última modificación: Enero 02, 2012, 03:52:31 pm por seba123neo »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #4 en: Enero 02, 2012, 12:43:26 pm »
Exacto, lo pones en un listview o alguna lista elegante, con adOpenForwardOnly y adLockReadOnly va como piña. Asi que usa eso tranquilamente, y si queres ver uno solo simplemente volves a pedir filtrando con un WHERE Id= ... y listo :P

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #5 en: Enero 02, 2012, 01:40:10 pm »
Mejor explicado ya no puede estar jeje.
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #6 en: Enero 02, 2012, 07:01:27 pm »
Hola chicos gracias por tantas sugerencias, bien me explico porque quería saber cuanto y en posicion de registros, era por el tema de las flechitas ( |< < > >| ) para ponerlas enabled o no.
Entiendo tu punto Seba de no utilizarlas y poner una Grilla o Listview, ya que es mas facil para moverse, pero bueno despues veo si lo cambio
por el momento quiero hacer un simple sistemita para un Kiosco, Almacen o Verduleria nada complicado y sin muchos clientes es para ir anotando el fiado, ingresar artículos e imprimir una boleta, de todas formas la velocidad siempre es buena tenerla en cuenta.

por el momento solo hice un formulario de ingreso de cliente baja y modificacion, me guie con un ejemplo de RercursosVB, asi que no hay nada novedoso, pero me gustaria sus opiniones si es que lo estoy haciendo mal o que corregir, optimizar,  para no empezar con el pie izquierdo.

aun esta desorganizado.

Descargar.

Saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #7 en: Enero 02, 2012, 09:23:36 pm »
Hola Leandro.

Aqui te paso otra alternativa de ABM que podrias considerar y que construi en base a tu proyecto y siguiendo las rutinas que usualmente uso en mis proyectos, el detalle es que requiere el control MSHFlexGrid (es un vicio personal).
El componente es el Microsoft Hierarchical FlexGrid Control 6.0 (archivo MSHFLXGD.OCX)

Propuesta ABM2

Saludos

EDITO: Lo que te estoy mandando es un borrador funcional. No me esmere en cuestiones de orden como poner las consultas SQL y la conexión en módulos aparte porque ese tema de variables y demás creo que lo conoces, declarar con As New nunca en muchos años me trajo algún problema ni de performance ni de nada, tampoco veo la necesidad de cuando tener en un bucle esa declaración, pero igual es una buena recomendación.
« última modificación: Enero 03, 2012, 03:03:29 pm por YAcosta »
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #8 en: Enero 03, 2012, 09:55:27 am »
Leandro, esta bien, salvo como te dije, el tema este de los botones (flechas), puede parecer simple, pero es un lio mantenerlo si tenes mas campos, tenes que nadar deshabilitando y habilitando controles, y lineas de codigo al pedo, que con una grilla lo solucionas.

la basica es una grilla principal, donde hacer doble click significa editar el registro(se te levanta una pantalla con los datos del registro seleccionado), y un boton nuevo arriba de la grilla, donde se te levanta la misma pantalla de la edicion, pero vacio, asi das de alta el registro.

primero no declarar las variables como As New, y siempre lo hagas con As primero, y despues setearla con Set, ¿porque? bueno porque la primera forma esta desaconsejada usar por temas de performance, ya que el visual basic internamente chequea (cada vez que usas la variable), chequea si el objeto esta instanciado o no (demora un tiempo imperseptible, pero en bucles puede notarse), en cambio de la segunda forma no lo hace y es la correcta, aparte una vez me paso de mantener un sistema que lanzaba un error y era porque estaba declarada una variable con As New, desde el IDE funcionaba correctamente, pero al compilarlo en la pc destino lanzaba error y era por eso.esto es para cualquier objeto.

siempre que se usa algo de bases de datos es bueno usar un modulo comun para declarar las variables globales y ahi en el Sub_Main hacer la conexion a al base, y dejar los formularios sin ese codigo.

aca te paso un codigo de como deberia quedar el modulo.

Código: (VB) [Seleccionar]
Option Explicit

Public mConexion As ADODB.Connection 'Conexion Principal
Public mRs As ADODB.Recordset  'Recordset Principal
Public mRsAux As ADODB.Recordset  'Recordset Auxiliar
Public mCmd As ADODB.Command 'Para Ejecutar Comandos

Sub Main()
   
    Set mConexion = New ADODB.Connection
    Set mRs = New ADODB.Recordset
    Set mRsAux = New ADODB.Recordset
    Set mCmd = New ADODB.Command
       
    mConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TuBase.mdb;"
    mConexion.Open
   
    frmLogin.Show ' Aca mostras tu Formulario de inicio
   
End Sub

esa variable que puse llamada "mCmd" es para ejecutar comandos SQL, o sea INSERTS, DELETE, UPDATE a la base de datos, ya que yo opto por usarlo asi en vez de usar los metodos .AddNew o .Update o Delete del recordset, lo cual te va a enseñar de paso el lenguaje SQL.

la variable "mRs" es para ejeuctar selects rapidos, por ejemplo si queres abrir , consultar y despues cerrar, ahi tenes este recodset para llamarlo desde donde quieras. el otro que se llama "mRsAux" es tambien un recodset, por las dudas necesites otro mas tener abierto, ya si necesitas mas que 2, entonces los declaras en los formularios y los destruis ahi.

saludos.

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #9 en: Enero 03, 2012, 12:04:29 pm »


Espero no llegar tarde acá. Te muestro una ventana de como lo hago yo Lea, a ver si quizas tomas una idea.

Saludos y un abrazo.

PD: Seba te ha explicado excelentemente bien esos detalles importantes de BD....! Tomalos en consideración.
Miguel Núñez.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:ADO posicion y cuanto registros en un Recorset?
« Respuesta #10 en: Enero 04, 2012, 09:08:52 pm »
Gracias!!!, estuve mirando el ejemplo Yvan ya ni me acordaba de cnn.Execute, bueno creo que con esto puedo seguir.

Saludos.