Access - Uso correcto del Recordset

 
Vista:
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 05/10/2012 19:36:14
Hola,

No llevo mucho tiempo con access y aquí lanzo otra duda, de estos dos ejemplos me gustaría saber cual es correcto para empezar a trabajar con una tabla de la base de datos..

Ejemplo 1:

Set db = CurrentDb
Set rs = db.OpenRecordset("CLIENTES")


Ejemplo 2: (declaro las variables pero no se hasta que punto es indispensable)

Dim db as Database
Dim rs as Recordset

Set db=OpenDatabase("C:\datos\negocio.mdb")
Set rs=db.OpenRecordset("CLIENTES")


En una aplicación que tengo después de estar utilizando el Ejemplo 1 funcionando ok, luego en otro evento he colocado otra rutina que trabaja con el Ejemplo 2 y me lanza error, no se si es que se me ha quedado colgado el anterior Recordset o qué pasa.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Uso correcto del Recordset

Publicado por Neckkito (1157 intervenciones) el 05/10/2012 20:56:32
Hola!

Ambos ejemplos son correctos, e incluso te diría que puedes mejorarlos para aumentar el rendimiento de la BD. Por ejemplo (y es sólo un ejemplo), si necesitas manipular la tabla podrías escribir:

Set rs = db.OpenRecordset("CLIENTES", dbOpenTable)

Pero si sólo quieres consultarla puedas abrirla, por ejemplo, en vista sólo lectura, lo cual te mejora la velocidad de recorrido de los registros. Es decir, escribirías:

Set rs = db.OpenRecordset("CLIENTES", dbOpenSnapShot)

o incluso

Set rs = db.OpenRecordset("CLIENTES", dbOpenForwardOnly)

Si vas a trabajar con un recordset sobre la tabla que está en el mismo Access sobre el que estás trabajando (no es un Access externo) la primera es más usual por ser más cómoda de escribir. Sin embargo, si vas a utilizar una BD externa deberás definir db con el sistema 2.

La declaración de variables es algo que tú fijas en las configuraciones del VBE. Si no exiges declaración de variables no tienes porque declararlas en el código; si la exiges no tendrás más remedio que declararlas porque si no tendrás error de código. La mayoría de programadores (hasta donde yo sé) aconsejan exigir la declaración de variables: te ayuda muchísimo en la depuración del código, máxime si el código es complejo.

En cuanto al error, si no indicas el número de error y la descripción dificilmente puede darse una solución.

Finalmente, si echas un vistazo a mi web tienes una sección de manuales, y ahí he preparado un manual de VBA enfocado a Access. Si miras el índice verás dos capítulos dedicados al DAO recordset.

Un saludo,

Neckkito
http://neckkito.siliconproject.com.ar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 05/10/2012 21:20:11
Muchísimas gracias Neckkito, voy a trabajar con los ejemplos que me indicas y además le echaré un vistazo a tu página web.

En cuanto al error voy a tratar de depurar un poco más el código y si no logro resolverlo entonces lo pondré aquí, vengo del antiguo Dbase IV y Clipper, ahí es nada, todo esto es nuevo para mi y voy tirando de la propia ayuda del access para intentar aplicar al Access lo que se de los otros lenguajes del Dos.

Gracias y saludos.
Toni
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 05/10/2012 21:23:57
Se me olvidaba:

La aplicación funcionará en red, entonces...¿ sería posible programar dos botones para ejecutar una consulta abriendo la tabla en modo edición, modificación, etc.. mientras otro usuario abre la misma tabla en modo sólo de consulta, es decir, abierta por dos usuarios, cada uno con un recordset distinto?

¿Después de la ejecución de esa consulta o esa modificación de algún registro de la tabla es recomendable cerrar el recordset?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 10:19:32
saludos toni

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Rem abre un recorset CON ADO    Y CON DAO
REM  CON  ADO------------------------------------------
 
Rem BUSCA
Set rs = CreateObject("ADODB.RecordSet")
Set CON = Application.CurrentProject.Connection
c10 = "": c20 = "": c30 = "": c40 = "": C50 = "": c60 = " ": c70 = "": c80 = ""
c10 = "SELECT   *  FROM [T060-PLATOS] "
c20=
consulta = c10 & c20 & c30 & c40 & C50 & c60 & c70 & c80
rs.Open consulta, CON, adOpenDynamic, adLockOptimistic
rs.MoveLast
rs.MoveFirst
 
 
 Rem  bucle de recordset  para  saber en umero de  registros
                        CUENTA = 0
                        Do While rs.EOF = False
                            CUENTA = CUENTA + 1
                        rs.MoveNext
                        Loop
 
Texto55 = RS.Fields("ID-T060").Value
 
If CUENTA > 1 Then MsgBox " Se ha .-.......de continuar "
 
 
RS.Close
 
 
REM   CON DAO  ------------------------------------------------
 
Rem ABRE UN RECORDSET    busca numero de registros  con DAO
Dim rs As DAO.Recordset
Dim Dato As Variant
Dim C As Integer
Dato = "SELECT  * FROM MOVIMIENTOS"
Set rs = CurrentDb.OpenRecordset(Dato)
rs.MoveLast
rs.MoveFirst
MsgBox rs.RecordCount
For C = 0 To rs.RecordCount
Rem .............
Next C
rs.Close
Set rs = Nothing



adOpenForwardOnly  0 Es el cursor por defecto, solo nos permite recorrer la tabla de forma secuencial (no se puede volver hacia atrás) y no permite modificaciones en los registros. Por contra es el de menos consumo. No vemos los cambios realizados en la tabla por otro recordset.
adOpenKeyset 1 Nos permite movernos en los dos sentidos, si permite modificaciones en los registros. Vemos los cambios realizados en la tabla por otro recordset a excepción de las nuevas altas.
adOpenDynamic 2 Nos permite movernos en los dos sentidos, si permite modificaciones en los registros. Vemos Todos los cambios realizados en la tabla por otro recordset.
adOpenStatic 3 Nos permite movernos en los dos sentidos, no permite modificaciones en los registros. No vemos los cambios realizados en la tabla por otro recordset.
 

Definición del tipo de Cerrojo
Entendemos como cerrojo el tipo de bloqueo que efectuaremos en la base de datos cuando modifiquemos un recordset, a fin de evitar que dos o mas usuarios accedan a modificar un mismo registro a la vez.
El tipo de cerrojo lo definiremos mediante la propiedad LockType, los posibles valores son:
 

Denominación valor Caracteristicas
adLockReadOnly 1 Es el defecto; no permite al usuario modificar los datos de la tabla.
dLockPessimistic 2 Cuando se abra la tabla nadie mas podrá hacerlo, este modo nos asegura la plena integridad de los datos.
adLockOptimistic  3 Cierra la tabla a los demás usuarios cuando se invoque al método Update del objeto recordset; de este modo la Base de datos quedará bloqueada menos tiempo que con el método anterior.

espero te sirva

jose manuel desde el astillero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 11:10:22
saludos Nekkito

He visitado varias veces tu página y me ha gustado
Haces una gran labor de divulgación y ayuda al aprendizaje

No te desanimes nunca.

Jose Manuel desde el Astillero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 06/10/2012 12:42:44
Muchas gracias Jose Manuel, desde luego estoy descubriendo un mundo nuevo en la programación, que aunque sabía que existía, nunca me había atrevido a tocar, ahora por necesidades de trabajo me veo obligado y no me arrepiento, aunque creo me voy a tener que poner las pilas.

Entiendo entonces que lo mejor y después de buscar información sobre ADO y DAO es utilizar ADO, y también creo que con mis dos ejemplos lo que yo estaba utilizando era DAO, ¿es si?.

Lo prioritario para mi es saber abrir correctamente una tabla y extraer o añadir información, a partir de ahí iré investigando

Agradezco mucho vuestra ayuda.

Toni
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Uso correcto del Recordset

Publicado por Neckkito (1157 intervenciones) el 06/10/2012 12:53:12
Hola!

No sé qué opinará José Manuel, pero yo no diría que hay un sistema mejor que otro.
DAO está "especializado" en bases de datos tipo Access. Creo que Microsoft se lo quería "cargar" pero ante la ingente cantidad de programadores que utilizamos DAO pues... ahí ha quedado. De hecho incluso sufrió unas pequeñas actualizaciones con el paso de 2003 a 2007.

ADO es un sistema que va un poco más allá de lo que es una BD Access y te permite realizar conexiones con otras fuentes de datos que no son estrictamente GBDR (Gestores de bases de datos relacionales).

Yo llevo toda la vida utilizando DAO (aunque ocasionalmente también utilizo ADO) y aún no he tenido ningún problema "serio". También, todo hay que decirlo, me es más cómodo el uso de DAO porque es el que tengo más "por mano".

Un saludo,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 17:22:04
saludos a Neckkito y Toni

Yo los uso indistintamente , y no me dan problemas nunca.
Si bien es verdad que prefieto usar ADO porque lo ususaba con vb , pero nada más .
con DAO RS.RECORDCOUNT te da el numero de lineas del recorset, cosa que ADO suele dar problemas y hay que crear un bucle para contarlos.

Por lo demás me funcionan los dos.


jose manuel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 17:59:30
saludos Toni

Puesto que éstás comenzando con acces te voy a comentar un sistema que utilizo y que me simplifica mucho el trabajo


crear una instrucción SQL es bastante complicado y laborioso pero yo uso el genrtado de consultas de access y luego lo transformo un poco y ya tengo la instruccción SQL


POR EJEMPLO CREO UNA CONSULTA Y VOY A VISTA SQL Y LA COPIO y me quedaría algo así


'SELECT MOVIMIENTOS.* 'FROM MOVIMIENTOS 'WHERE (((MOVIMIENTOS.CUENTA) Between [FORMS]![FMAYOR]![CI] And [FORMS]![FMAYOR]![CF]) AND ((MOVIMIENTOS.FECHA) Between [FORMS]![FMAYOR]![FI] And [FORMS]![FMAYOR]![FF]) AND ((MOVIMIENTOS.TITULAR)=[FORMS]![FPRINCIPAL]![TIT]) AND ((MOVIMIENTOS.ANNO)=[FORMS]![FMAYOR]![AN])) ORDER BY MOVIMIENTOS.CUENTA, MOVIMIENTOS.FECHA, MOVIMIENTOS.NUMEASIENTO;


Pues bien la desgloso un poco y me queda así , para que te hagas una idea (respeta siempre los parentesis)

sobre todo en instruciones complicadas es una gozada no tener que escribir todos los campos



'SELECT MOVIMIENTOS.*
'FROM MOVIMIENTOS
'WHERE (((MOVIMIENTOS.CUENTA) Between [FORMS]![FMAYOR]![CI] And [FORMS]![FMAYOR]![CF])
'AND ((MOVIMIENTOS.FECHA) Between [FORMS]![FMAYOR]![FI] And [FORMS]![FMAYOR]![FF])
'AND ((MOVIMIENTOS.TITULAR)=[FORMS]![FPRINCIPAL]![TIT])
'AND ((MOVIMIENTOS.ANNO)=[FORMS]![FMAYOR]![AN]))
'ORDER BY MOVIMIENTOS.CUENTA, MOVIMIENTOS.FECHA, MOVIMIENTOS.NUMEASIENTO;




ahora cambio los campos de la instrucción where para adaptarlos a vb y me quedaría una consulta así :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Rem BUSCA EL NUMERO EN EL INDICE DEL PLATO
Set rs = CreateObject("ADODB.RecordSet")
Set CON = Application.CurrentProject.Connection
c10 = "": c20 = "": c30 = "": c40 = "": C50 = "": c60 = "": c70 = "": c80 = "": c31 = "": c32 = "": c33 = "": c34 = "": c35 = "": c36 = ""
 
c10 = "  SELECT MOVIMIENTOS.* "
c20 = "  FROM MOVIMIENTOS"
c30 = "  WHERE ( ((MOVIMIENTOS.CUENTA) Between '" & [CI] & "'   And   '" & [CF] & "'  ) "
c31 = "  AND ((MOVIMIENTOS.FECHA) Between  #" & Format([FI], "mm/dd/yyyy") & "#  And  #" & Format([FF], "mm/dd/yyyy") & "# )   "
 
c32 = "  AND ((MOVIMIENTOS.TITULAR) = " & Str$(Forms![FPRINCIPAL]!TIT) & "  ))"
c33 = "  AND ( (MOVIMIENTOS.ANNO)='" & [an].Column(0) & "' ))  "
 
 
c80 = "  ORDER BY MOVIMIENTOS.CUENTA, MOVIMIENTOS.FECHA, MOVIMIENTOS.NUMEASIENTO; "
 
 
 
 
 
consulta = c10 & c20 & c30 & c31 & c32 & c33 & c80
'MsgBox consulta
 
 
rs.Open consulta, CON, adOpenDynamic, adLockOptimistic
rs.MoveLast
rs.MoveFirst



otro ejemplo de insertar




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rem esta es lo generado por el generador de consultas
'INSERT INTO [3T-FORMVISITADOS] ( NUMAUTORIZADO, NOMBREAUTORIZADO, FECHAVISITA, NOMBREFORMULARIO )
'SELECT [NUM] AS Expr1, [NOM] AS Expr2, Now() AS Expr3, [NOMBREFORM] AS Expr4;
Rem abre un recorset -----------------------------------------
Rem graba  el nombre del formulario  abierto
Set RS = CreateObject("ADODB.RecordSet")
Set CON = Application.CurrentProject.Connection
c10 = "": c20 = "": c30 = "": c40 = "": C50 = "": c60 = " ": c70 = "": c80 = ""
c10 = "INSERT INTO [3T-FORMVISITADOS] ( NUMAUTORIZADO, NOMBREAUTORIZADO, FECHAVISITA, NOMBREFORMULARIO )"
c20 = " SELECT " & Str$(NUM) & "  AS Expr1, '" & NOM & "' AS Expr2, #" & Format(Now(), "MM/dd/yyyy hh:nn:ss") & "#  AS Expr3, '" & NOMBREFORM & "' AS Expr4;"
consulta = c10 & c20 & c30 & c40 & C50 & c60 & c70 & c80
'MsgBox CONSULTA
 
 
 
RS.Open consulta, CON
 
'RS.Open CONSULTA, CON, adOpenDynamic, adLockOptimistic
'Rs.MoveLast
'rs.MoveFirs




nota :
para referirse a un formulario a datos de un cuadro de texto por ejemplo

Forms![F-T132-PLATOS-POSIBLES]![PLATODELDIA-T060-T132]
Forms![nombre-formulariio]![campo]

para refirirse a campos de un subformulario

Forms![nombre-formulario]![Subformulario-nombre].Form![campo-del-subformulario]



fijate en
c20 = " SELECT " & Str$(NUM) & " AS Expr1, '" & NOM & "' AS Expr2, #" & Format(Now(), "MM/dd/yyyy hh:nn:ss") & "# AS Expr3, '" & NOMBREFORM & "' AS Expr4;"

los campos string van entre comillas simples , ' " & NOM & " '

las fechas utilizan el formato americano mes dia año precedido y terminado con #

...... #" & Format(Now(), "MM/dd/yyyy hh:nn:ss") & " ........
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 06/10/2012 18:18:45
Bueno aquí dejo el primer fallo que me salta una rutina y que no consigo despejar:

Hasta ahora he importado a la tabla TEXTO un archivo TXT y de esta tabla quiero extraer parte de datos para convertirlos en otra tabla con valores a sus respectivos campos, para eso se me ha ocurrido tener dos recordset, uno para cada tabla e ir extrayendo de una para añadir a otra, pero me lanza el siguiente error: "error 3420" El objeto no es válido o no tiene valor"

Dim ncodi, nnumero, nnombre, ndomicili, ncposta,nmunicipio As String

Dim db As Database

Dim rs1, rs2 As Recordset

Set db = CurrentDb

' la tabla TEXTO tiene un sólo campo de donde quiero extraer datos para añadirlos a la tabla
' DATOS en sus respectivos campos.
Set rs1 = db.OpenRecordset("TEXTO")

'En la tabla DATOS quiero añadir lo que extraigo de la tabla TEXTO
Set rs2 = db.OpenRecordset("DATOS")

rs1.MoveFirst


Dim ncodi, nnumero, nnombre, ndomicili, ncposta,nmunicipio As String

Do While Not rs1.EOF
rs1.Edit
ncodi = Mid(campo1, 2, 2)
nnumero = Mid(campo1, 11, 8)
rs1.MoveNext ' los siguientes datos estan en la segunda linea=segundo registro
nnombre = Mid(campo1, 20, 38)
ndomicili = Mid(campo1, 59, 37)
ncpostal = Mid(campo1, 97, 5)
nmunicipio = Mid(campo1, 103, 16)

'Ahora intento añadir a la tabla DATOS un nuevo registro con los datos obtenidos
rs2.AddNew
With rs2
!CODIGO = ncodi
!NUMERO = nnumero
!DOMIC=ndomicili
!POSTAL=ncpostal
!CIUDAD=nmunicipio

rs2.Update
End With


Loop
rs1.Close

Haciendo pruebas mientras escribía esta consulta he logrado quitar el fallo indicado pero sigue sin crearme registros nuevos en la tabla DATOS, ¿qué hago mal?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 18:32:47
mira a ver si puedes separa los campos del txt con ;


luego vas a -DATOS EXTERNOS--aRCHIVO DE TEXTO -->(selecionas el archivo de texto)--continuar

ahora elijes si es separado por ; , o tabulador o si tiene un ancho fijo

y en avanzadas puedesw tomar otras elecciones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 06/10/2012 18:37:45
Gracias Jose por el ejemplo anterior tan extenso, se había cruzado con mi pregunta, lo estudiaré.

Jose el fichero de texto ya lo tengo añadido y perfectamente identificado en la tabla TEXTO, lo hice con el comando "DoCmd.TransferText acImportDelim,......" y me fué perfecto, pero mi problema ahora es que al trabajar con dos recordset en el segudno recordset que intento que apunte a una tabla vacía no me genera registros nuevos con rs2.addnew.

Sigo investigando.
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 18:42:47
crea una consulta de datos anexados con el generador de consultas y en campo de origen tambien puedes poner mid$ (..... siempre y cuando los crees una relación por un campo concreto

haz una vista precia a ver si te funciona y cuando la tengas va a vista
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 18:56:07
continúo que no se porque se ha grabado antes de tiempo

vas a vista sql y lo copias como te indico en la parte de arriba,



INSERT INTO [MOVIMIENTOS 2008 08 06] ( FECHA, CUENTA3D )
SELECT [MOVIMIENTOS 2008 08 06].FECHA, Left([cuentas-3d].[cuenta],3) AS Expr1
FROM [MOVIMIENTOS 2008 08 06] INNER JOIN [CUENTAS-3D] ON [MOVIMIENTOS 2008 08 06].CUENTA3D = [CUENTAS-3D].CUENTA;


INSERT INTO
[MOVIMIENTOS 2008 08 06]
( FECHA, (comentario --- primer campo a insertar)
CUENTA3D ) (comentario -- segundo campo a insertar si tuviera mas los añades separados por comas)
SELECT
[MOVIMIENTOS 2008 08 06].FECHA, (comentario ---- estos son los datos que añades en mismo orden que los anteriores )

Left([cuentas-3d].[cuenta],3) AS Expr1




FROM [MOVIMIENTOS 2008 08 06] INNER JOIN [CUENTAS-3D] ON [MOVIMIENTOS 2008 08 06].CUENTA3D = [CUENTAS-3D].CUENTA;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 06/10/2012 19:26:04
Jose ya lo tengo resuelto, como siempre no vemos nuestros propios errores, he tirado de cajas de texto para ir almacenando variables e ir depurando qué valores me almacenaba, al final mi error estaba en que no apuntaba en el campo al recordset 1

lo tenía así

ncodi = Mid(campo1, 2, 2)


cuando en realidad es así

ncodi = Mid(rs1!campo1, 2, 2)

también se me había olvidado un movenext para que no se atascara siempre en el mismo registro con lo cual el fallo me estaba provocando que la tabla no aumentara de registros más que a uno y además con los valores de todos los campos = a vacío.

Tus ejemplos anteriores son muy buenos aunque he de ser sincero y decirte que me pierdo aún un poco en las líneas de:
c10 = "": c20 = "": c30 = "": c40 = "": C50 = "": c60 = "": c70 = "": c80 = "": c31 = "": c32 = "": c33 = "": c34 = "": c35 = "": c36 = ""

pero con el tiempo, esforzándome y con los ejemplos de personas como vosotros seguro que lo conseguiré.
Un abrazo y muchas gracias.
Toni
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por jose (830 intervenciones) el 06/10/2012 19:32:18
pongo varias variables a o (vacias) luego las utilizo si me hacen falta sino quedan vacias ej a="" con esto se vacía



1
c10 = "": c20 = "": c30 = "": c40 = "": C50 = "": c60 = "": c70 = "": c80 = "": c31 = "": c32 = "": c33 = "": c34 = "": c35 = "": c36 = "" c10 = " SELECT MOVIMIENTOS.* " c20 = " FROM MOVIMIENTOS" c30 = " WHERE ( ((MOVIMIENTOS.CUENTA) Between '" & [CI] & "' And '" & [CF] & "' ) " c31 = " AND ((MOVIMIENTOS.FECHA) Between #" & Format([FI], "mm/dd/yyyy") & "# And #" & Format([FF], "mm/dd/yyyy") & "# ) " c32 = " AND ((MOVIMIENTOS.TITULAR) = " & Str$(Forms![FPRINCIPAL]!TIT) & " ))" c33 = " AND ( (MOVIMIENTOS.ANNO)='" & [an].Column(0) & "' )) " c80 = " ORDER BY MOVIMIENTOS.CUENTA, MOVIMIENTOS.FECHA, MOVIMIENTOS.NUMEASIENTO; " consulta = c10 & c20 & c30 & c31 & c32 & c33 & c80 'MsgBox consulta 
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Uso correcto del Recordset

Publicado por Neckkito (1157 intervenciones) el 06/10/2012 20:03:29
Hola!

Si se me permite añadir mi granito de arena te diré, Toni, que:

- Si sólo se trata de "leer" la información del registro no es necesario utilizar el rs.edit. Eso lo utilizamos cuando necesitamos modificar el valor de un campo de un registro existente.
- Puedes pasar el valor del recordset por una variable, con lo que no tendrías que escribir tanto (eso entre comillas). Es decir, que si haces:

Do While Not rs1.EOF
campo1 = rs1.fields("campo1").value
ncodi = Mid(campo1, 2, 2)
nnumero = Mid(campo1, 11, 8)
rs1.MoveNext ' los siguientes datos estan en la segunda linea=segundo registro
campo1 = rs1.fields("campo1").value
nnombre = Mid(campo1, 20, 38)
ndomicili = Mid(campo1, 59, 37)
ncpostal = Mid(campo1, 97, 5)
nmunicipio = Mid(campo1, 103, 16)

campo1 sería la variable, y "campo1" sería el nombre del campo del cual quieres extraer la información.

- La declaración de variables en VBA Access requiere que se definan cada una de las variables individualmente. Si no las defines Access coge por defecto la variable como Variant. Por eso, si tú haces:

Dim rs1, rs2 As Recordset

rs1 se te está definiendo como Variant, que, evidentemente, a posteriori toma el valor de Recordset. Lo "correcto" para optimizar el código sería definirlas así:

Dim rs1 as recordset, rs2 As Recordset

- Finalmente, si se utiliza Access 2003 o bien se utilizan juntos ADO y DAO, yo te recomendaría que indicaras el tipo de recordset. Es decir:

Dim db as DAO.Database
Dim rs as DAO.Recordset

y, aunque esto no es necesario (sí que es altamente recomendable en ADO), mejor si cierras las instancias de la base de datos y de los recordset para cerrar conexiones y liberar memoria. Es decir

rs1.Close
rs2.Close
db.Close
Set rs1 = nothing
Set rs2 = nothing
Set db = nothing

Un saludo,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Toni

Uso correcto del Recordset

Publicado por Toni (129 intervenciones) el 07/10/2012 20:27:19
Neckkito,

Lo de no editar el recordset con rs.edit ya me había dado y lo tengo suprimido de mi pequeña aplicación.

Todas esas correcciones que me has indicado son muy valiosas para mi, es precisamente lo que me ayuda: saber cuando tengo que abrir y con qué instruccion correcta, cuando cerrar el recordset, etc.. etc.. me lo apunto todo y lo voy a aplicar...tengo dudas de si seguir con DAO o ADO, he visto que DAO lo puedo llegar a manejar y entender meridianamente bien, además llevo un par de semanas batallando, buscando y leyendo mucho sobre ejemplos basados en este sistema y es lo que estoy aplicando, aunque también me pica el gusanillo de intentar hacer algo con lo que me ha explicado Jose Manuel.

Deciros a ambos que gracias a vosotros tengo ya hecha una pequeña parte de mi aplicación que consistía en pasar un fichero de texto plano (depurándolo y suprimiendo lo que no me interesaba) a datos, estoy contento aunque me falta mucho todavía para terminar las otras partes.

Neckkito he visitado tu web y me parece muy interesante, sobre todo para gente como yo que recién empieza en esto del Access.

De nuevo daros las gracias a ambos., seguro que veréis más preguntas mías en esta web ya que hay cantidad de cosas que tengo que hacer y necesito de vuestra ayuda.

Saludos.
Toni.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso correcto del Recordset

Publicado por UrielHS (1 intervención) el 31/08/2014 22:39:11
Excelentes aportes.
Personalmente quiero agradecer y felicitar a Neckkito por la labor que realiza con su página web.
Esta conversación me ha servido para aclarar un poco mi panorama sobre ADO y DAO.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar