** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y Otros sistemas
  Mensajes nuevos Mensajes nuevos RSS - Dao.RecordSet
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoDao.RecordSet

 Responder Responder
Autor
Mensaje
JVila Ver desplegable
Asiduo
Asiduo


Unido: 20/Noviembre/2007
Estado: Sin conexión
Puntos: 226
Enlace directo a este mensaje Tema: Dao.RecordSet
    Enviado: 27/Noviembre/2009 a las 11:11
Hola,
 
estoy trabajando en sql server, tengo que actualizar una tabla a partir de datos de dos tablas.
En un formulario en acces tengo un botón con el siguiente código.
Lo que hace es truncar un de las fechas cuyo formato está en fecha:hora, si no hago este truncamiento sql server me redondea fechas al alza, falseando los días.
Se que se podría conseguir algo con T-Sql, pero necesito arreglarlo desde acces.
Tengo el siguiente código:
 
Dim Fecha As Date
Dim Reaction As Integer
Dim Final As Integer
Dim rst As DAO.Recordset
Dim rst2 As DAO.Recordset
Dim i As Long

Set rst = CurrentDb.OpenRecordset("Select * from [POST VENTA]")
'La linea de arriba me la marca en amarillo y me dice VARIABLE DE OBJETO O BLOQUE WITH NO ESTABLECIDO.
'Yo no he creado ningún bloque with i la variable rst la uso de forma igual en otros sitio y funciona sin problemas
Set rst2 = CurrentDb.OpenRecordset("Select * from [ordenes trabajo]")
rst.OpenRecordset
rst2.OpenRecordset
rst.MoveLast
rst.MoveFirst

For i = 1 To rst.RecordCount
  
   rst.Edit
   Set rst2 = CurrentDb.OpenRecordset("Select * from [ordenes trabajo] where [numero de la orden]=" & rst![NUMERO DE LA ORDEN])
   Fecha = Left(rst2![FECHA ACEPTACION PRES], 10)
   Final = rst![FECHA INCIO REPARACION]
   Reaction = Final - Fecha
   rst![reaction time] = Reaction
   rst.Update
   rst.MoveNext
  
Next

rst.Close
rst2.Close
 
JVila
Arriba
kinito11 Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 08/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 5800
Enlace directo a este mensaje Enviado: 27/Noviembre/2009 a las 14:55
hola , falta declarar la varible database
Dim db as Dao.Database
set db= Currentdb() 
set rs = db.openrecordset("tusql")
 
tambien debes liberar la memoria
 
rst.Close
rst2.Close
set rst= nothing
set rst2 = nothing
set db = nothing


Editado por kinito11 - 27/Noviembre/2009 a las 15:17
Saludos desde Santander España
Arriba
Patxi Sanz Ver desplegable
Administrador
Administrador
Avatar

Unido: 26/Noviembre/2007
Localización: España
Estado: Sin conexión
Puntos: 5023
Enlace directo a este mensaje Enviado: 27/Noviembre/2009 a las 17:55
A veces, los mensajes de error que da el VBA, no tienen que ver con los errores reales que tenemos, aunque pueden dar una pista. Por ejemplo, tú tienes la sentencia:
 
Set rst = CurrentDb.OpenRecordset("Select * from [POST VENTA]")
 
Y el mensaje de error es:
 
Variable de objeto o bloque With no establecido
 
Teniendo en cuenta que el objeto rst sí está declarado, nos quedan 2 opciones:
 
1.- Que falta algo en ese código que no has copiado y pegado, y es donde se genera el error, aunque marque otra línea.
 
2.- Que no exista un objeto CurrentDb. Y teniendo en cuenta que estás hablando de tablas en SQL Server, eso me genera una nueva pregunta: ¿no tendrás un adp en vez de un mdb? Si es el caso, Access no se conecta vía DAO (el objeto CurrentDb) a la base de datos de SQL Server, sino mediante ADO (el objeto CurrentProject), que será el que tendrás que usar.
 
Pero claro, si estás accediendo a tablas en SQL Server, es más recomendable usar la tecnología ADO que DAO. DAO está pensado sobre todo para acceder a bases de datos de Access, mientras que ADO se maneja mejor con otros tipos de bases de datos; como es el caso de SQL Server, por ejemplo.
 
Aunque teniendo en cuenta lo que haces, actualizar un campo de una tabla dependiendo del valor de otro campo de esa tabla, más el valor de un campo de otra tabla, ¿para qué usar código, ya sea en VBA o en T-SQL? ¿Por qué no creas una consulta de actualización y la ejecutas?
 
Pero como lo que haces es guardar un campo calculado, y no se recomienda guardar valores calculados, sobre todo si se pueden calcular después, ¿por qué no calculas el valor del "reaction time" cada vez que lo necesites en una consulta de selección, y te olvidas del código y de la consulta de actualización? Nada más fácil que usar las 2 tablas en la consulta, unirlas por el campo "Numero de la orden", e indicar que una de las columnas a devolver será la resta de la fecha de inicio y de la fecha de aceptación. Y si precisas de algún formato especial, SQL Server permite usar funciones propias para sumar y restar fechas, al igual que Access. Eso sí, tendrás que usar las propias de SQL Server, no las de Access.
 
Kinito11: No es necesario declarar la variable db (o dbs, o...). CurrentDb es un objeto DAO.Database y, como tal, se puede usar cuando y como se desee. Que quieres crear otro objeto DAO.Database, de acuerdo. Que quieres usar el objeto CurrentDb directamente, también se puede.
Un saludo,

Patxi Sanz
Tudela (NA)
Mi Web
Arriba
kinito11 Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 08/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 5800
Enlace directo a este mensaje Enviado: 27/Noviembre/2009 a las 21:33
hola, gracias patxi por tu aclariacion Wink , siempre pense que abria que abrir un objeto database para que la conexion con el origen de datos obcd corriese mejor la aplicacion
Saludos desde Santander España
Arriba
Patxi Sanz Ver desplegable
Administrador
Administrador
Avatar

Unido: 26/Noviembre/2007
Localización: España
Estado: Sin conexión
Puntos: 5023
Enlace directo a este mensaje Enviado: 28/Noviembre/2009 a las 15:17
Si el origen es una conexión ODBC, casi mejor usa una conexión ADO. Access también nos facilita una serie de métodos y propiedades para acceder vía ADO a la base de datos, al igual que lo hace con DAO:
 
 
Y al igual que con CurrentDb, CurrentProject nos facilita una conexión ADO a la base de datos independiente de la que usa Access directamente, para evitarnos el tener que ajustar cadenas de conexiones, rutas y directorios, etc.
 
Y hay que tener en cuenta que DAO está pensado para trabajar con bases de datos Access, mientras que ADO está enfocado a cualquier tipo de bases de datos, incluyendo ODBC. Aunque con DAO se puede acceder a bases de datos vía ODBC, se le supone un mejor rendimiento y velocidad de acceso a este tipo de datos el uso de ADO.
 
Y por supuesto, tanto CurrentDb como CurrentProject sólo nos devolverán una conexión válida a la base de datos abierta. Si la base de datos no la abrimos directamente, entonces sí que tendremos que declarar un objeto DAO.Database o ADODB.Connection para abrir la conexión y poder acceder a la base de datos.
Un saludo,

Patxi Sanz
Tudela (NA)
Mi Web
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable