Access - Copiar datos usando portapapeles

   
Vista:
Imágen de perfil de Toni

Copiar datos usando portapapeles

Publicado por Toni (129 intervenciones) el 27/03/2013 20:00:59
Hola que tal,

Intentando asignar a un botón la acción de copiar al portapapeles los datos que tengo en una caja de texto, no doy con la solución.

El código que he puesto es:

OPCION 1
=========
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70

Resulta que a veces me funciona y a veces no, en unos ordenadores si y en otros no, todos tienen la misma versión de Access 2007, cuando me salta el error me dice:

"Error 2046 en tiempo de ejecucion, la accion o comando copiar no esta disponible ahora"

Por más vueltas que le doy no le encuentro solución.

OPCION 2
========
Otra opción que he probado es simular envío de teclas (control+c)

TXT_DNICIF.SetFocus
TXT_DNICIF.SelLength = 10
SendKeys "^+(C)"

Una ayuda no me vendría mal.
Gracias a todos
Toni
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 Norberto

Copiar datos usando portapapeles

Publicado por Norberto (432 intervenciones) el 28/03/2013 14:07:38
Hola.

En vez de usar .DoMenuItem que se mantiene por compatibilidad con versiones anteriores es mejor que uses .RunCommand. Así te evitarás indicar en qué barra de herramientas se encuentra el comando.

Prueba con esto:

1
2
3
4
5
6
Private Sub Boton_Click()
    Me.Campo.SetFocus
    Me.Campo.SelStart = 0
    Me.Campo.SelLength = Len(Me.Campo.Text)
    DoCmd.RunCommand acCmdCopy
End Sub


Un saludo.
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

Copiar datos usando portapapeles

Publicado por Toni (129 intervenciones) el 28/03/2013 20:14:36
Hola Norberto,
De nuevo tengo que agradecerte la ayuda que me prestas, he cogido el Access con aplicaciones acabadas, otras a medias y otras que tengo yo que hacer y mi inexperiencia la estoy pagando, pero contento de que noto que avanzo con cada problema que resuelvo con ayuda (valiosa ayuda), como la que tu me acabas de dar.

Ahora funciona perfectamente, lo he probado en varios ordenadores y perfecto, por si acaso he capturado el error que me daba y ahí le he puesto el otro método antiguo, así me aseguro de que funcionará en todos los PC's.

Voy a abusar un poco de tu amabilidad y aprovecho que me acaba de surgir una nueva duda, me vuelvo loco buscando información por internet y hay tanta que a veces acabo liandome.

Aunque me estoy familiarizando con el manejo de los registros, aún hay una cosa que me cuesta y es la siguiente, la explico con un ejemplo:

Para empezar decir que me gusta utilizar código mucho más que entrar en el manejo del diseño de consultas, quizás ese es parte de mi error.

Tengo un formulario: "Form_Facturas" en el que el origen de los datos es una tabla: Facturas

Cada campo asignado a varias cajas de texto, etc.. etc..

Necesito en un momento dado, mediante un botón, recorrer los registros de la tabla tomando el valor de un campo: "Descuento" y en función de su valor actualizar otra tabla: "Facturas_temp" que en ese momento no está enlazada a formulario alguno.

Mi duda es cómo debo enfocarlo, ¿es necesario o mejor o de cajón que deba hacerlo mediante consultas?, con código lo he logrado hacer, pero no se si es el mejor método ya que mientras el formulario está en pantalla yo por detrás mediante código estoy trasteando las tablas, y además me extraña que si en el origen del formulario ya tengo una tabla asignada, lo mismo estoy desaprovechando esta ventaja ¿no?.

Actualmente lo tengo así, y funciona.

Dim dbEngine As DAO.dbEngine
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim nnumero As integer
Set db = CurrentDb
Set rs1 = db.OpenRecordset("Facturas")
Set rs2 = db.OpenRecordset("Facturas_temp")

Do While Not rs1.EOF
nnumero = rs1!Descuento
if nnumero >0 then
rs2.AddNew
rs2!Dto_temporal = nnumero
'resto de actualizaciones en esta tabla con mas valores
rs2.Update
endif
rs1.MoveNext
Loop
rs1.Close
rs2.Close
db.Close
Set rs1 = Nothing
Set rs2 = Nothing


Hay alguna forma de utilizar ya el origen que está asignado en el formulario desde donde estoy ejecutando este codigo y así me ahorro algo?
Si tu tiempo te lo permite te agradeceré cualquier comentario al respecto.
Saludos, gracias y buen fin de semana.
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 Norberto

Copiar datos usando portapapeles

Publicado por Norberto (432 intervenciones) el 09/04/2013 11:20:45
Hola de nuevo.

Primero disculpas por mi tardanza para contestar pero he estado de vacaciones y el ordenador ni tocarlo, jejeje.

En cuanto a trastear las tablas desde código/SQL ningún problema. Imagina, por ejemplo, que en función de una elección de un combo en un formulario, te tenga que crear en el subformulario una serie de registros predeterminados. Lo lógico es hacerlo por código, bien creando uno a uno con rst.AddNew - rst.Update o, mejor aún, por medio de una consulta de Datos anexados, y refrescar el subformulario para que refleje los cambios. Lo que no tiene ningún sentido es empezar con algo como...

1
2
3
4
5
Do While LoQueSea
    DoCmd.GoToRecord acDataForm, Me.Name, acNewRec
    Me.Campo1=YoQueSe
    ...
Loop



Lo que sí que puedes hacer para utilizar el origen del formulario es la propiedad RecordsetClone. Ésta contiene una copia del conjunto de registros del formulario. Su uso es sencillo:

1
2
3
4
5
6
7
8
9
10
'Defines una variable tipo Recordset
Dim miRst as DAO.Recordset
 
'La asignas
Set miRst = Me.RecordsetClone
'La usas como usas Rst1 en tu ejemplo
 
'No la cierras (no miRst.Close)
'Pero la vacías al terminar
Set miRst = Nothing


Si quieres establecer algún tipo de vinculación entre un registro del RecordsetClone y el registro que se visualiza actualmente en el formulario usas la propiedad Bookmark. Imagina que quiesres activar un registro en el formulario según el contenido de un cuadro de búsqueda:

1
2
3
4
5
6
7
8
9
...
Dim miRst as DAO.Recordset, miCrit as String
 
miCrit = "Descripción LIKE '*" & Me.txtBúsqueda & "*'" 'Establecemos el criterio de búsqueda
Set miRst = Me.RecordsetClone 'Asignamos la variable miRst
rst.FindFirst miCrit 'Buscamos el primer registro que coincida con el criterio
If Not miRst.NoMatch Then 'Si se encuentra alguno
    Me.Bookmark = miRst.Bookmark 'Asignamos el registro actual del formulario al encontrado
End If


En cuanto a usar SQL, date una vuelta por el sitio de Neckkito. Seguro que le sacas provecho.

Un saludo.
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

Copiar datos usando portapapeles

Publicado por OSKAR mauricio.1381@hotmail.com (1 intervención) el 31/08/2016 23:47:22
Buena tarde, no tengo mucho conocimiento del tema y por este motivo necesito ayuda, tengo una base de datos en Access, cree un formulario con muchos campos, me almacena bien en la tabla, me bloquea los campos para evitar editarlos y se activan con un boton editar registro, agrega nuevos registros y hasta ahí bien, el inconveniente se presenta cuando intento duplicar un Registro (completo) para poder editar solo algunos campos y guardarlo como uno nuevo, encontrè este codigo y funciona,

1
2
3
4
5
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70
Id = 1 + DLast("id", "SIAN")
DoCmd.GoToRecord , , acLast

me clona el registro seleccionado en uno nuevo, con el id siguiente, PERO!!!, no me deja editar el registro actual me genera error

Escriba la cedula, porque la cedula es un campo requerido,
si quito los campos requeridos me clona un registro pero me lo muestra en blanco
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