Regresar al foco previo luego de cancelar evento

Te molesto porque no logro solucionar un tema que quedó en la última consulta. Era del formulario Expedientes

La cuestión es que cuando el expediente ya estaba ingresado se cancelaba el evento (Cadena) pero no regresa el foco al campo Carátula si no que se quda en el campo Año.

Te mando el evento

Private Sub Año_BeforeUpdate(Cancel As Integer)
Dim CadenaExpediente As String
If Not IsNull(Me.Carátula) And Not IsNull(Me.Número) And Not IsNull(Me.Año) Then
CadenaExpediente = Me.Carátula & Me.Número & Me.Año
If Nz(DCount("TextoExp", "Expedientes", "TextoExp = '" & CadenaExpediente & "'"), 0) > 0 Then
MsgBox "Este Expediente ya se encuentra registrado" & vbCrLf & "Ingréselo en la Opción Buscar ", vbCritical, "DATO YA INTRODUCIDO"
DoCmd.CancelEvent
Me.Undo
Else
Me.TextoExp = CadenaExpediente
End If
End If
End Sub

Bueno, si bien no es una cosa del otro mundo, al tener el foco nuevamente en posición inicial agilita bastante el mecanismo. Si no se puede bueh, ya está. Pero creo que para vos no ha de ser complicado.

He probado con GoToControl, SetFocus, pero nada, luego del CancelEvent no logro hacer nada que funciones.

Un abrazo y desde ya

1 respuesta

Respuesta
1

Tabaré: En lugar de Programar el Evento BeforeUpdate (Antes de Actualizar), Programa el Lost_Focus (Al perder el enfoque) con el Siguiente Código.

Private Sub Año_LostFocus()
Dim CadenaExpediente As String
If Not IsNull(Me.Carátula) And Not IsNull(Me.Número) And Not IsNull(Me.Año) Then
   CadenaExpediente = Me.Carátula & Me.Número & Me.Año
   If Nz(DCount("TextoExp", "Expedientes", "TextoExp = '" & CadenaExpediente & "'"), 0) > 0 Then
       MsgBox "Este Expediente ya se encuentra registrado" & vbCrLf & "Ingréselo en la Opción Buscar ", vbCritical, "DATO YA INTRODUCIDO"
       Me.Año = Null
       Me.Numero = Null
       Me.Carátula = Null
       Me.Carátula.SetFocus
   Else
       Me.TextoExp = CadenaExpediente
   End If
End If
End Sub

Ya me contarás. Mis saludos >> Jacinto

Hola Jacinto, hice los cambios y no me funcionó, pero era porque los tres campos son requeridos. Cambié a no requeridos y funciona.

El problema es que el registro queda vacío.

Yo pienso que habría que introducir en el evento que en vez de regresar al primer campo, saliera de la creación de nuevo registro.

Creo que de esta manera no se acumularían registros vacíos en la tabla.

O mejor aún, como el MsgBox le indica que lo ingrese en la opción buscar que saltara a esa opción, que en el formulario lo tengo como un Comando (Comando65). 

En la parte Me.Carátula.SetFocus cambiarla por algo que hiciera:

Salir del registro sin agregar (para que no quede un registro vacío en la tabla) y luego

Que se abra el cuadro de la opción buscar y ahí el operario ingresa el Expediente que ya está registrado.

Muchas gracias por las inmediatas respuestas

Un abrazo

Maestro, hice esto y algo funciona

Private Sub Año_LostFocus()
Dim CadenaExpediente As String
If Not IsNull(Me.Carátula) And Not IsNull(Me.Número) And Not IsNull(Me.Año) Then
CadenaExpediente = Me.Carátula & Me.Número & Me.Año
If Nz(DCount("TextoExp", "Expedientes", "TextoExp = '" & CadenaExpediente & "'"), 0) > 0 Then
MsgBox "Este Expediente ya se encuentra registrado" & vbCrLf & "Ingréselo en la Opción Buscar ", vbCritical, "DATO YA INTRODUCIDO"
Me.Año = Null
Me.Número = Null
Me.Carátula = Null
Me.Carátula.SetFocus
Me.Undo
DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70
Else
Me.TextoExp = CadenaExpediente
End If
End If
End Sub

Agregué lo que está en negrita.

Bueno, funciona pero no me gusta por el buscador predeterminado. 

Creo que habría que hace un formulario con un txtBox para que introdujera el número a buscar y con el botón aceptar de ese formulario se genere una consulta. Entonces la parte  DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70  cambiarla por una acción que hiciera abrir ese formulario.

Vos tenés una idea más simple??

Tabaré: Un par de aclaraciones previas y una sugerencia.

1.- El comando deshacer (Undo), en ningún momento evita que se genere un Nuevo registro si sales del Formulario, aunque no rellenes nada. Si tienes un Autonumérico te generará un Nuevo "Numero", con el resto de Datos en Blanco. El tema es sencillo y es que tu le has dicho de antemano que vaya a un Nuevo Registro.

2.- El Método . MenuItem se abandonó a partir de Access 97 si no recuerdo mal, aunque Microsoft hasta ahora lo conserva por cuestiones de Compatibilidad. Si lo quitará pronto o tarde no lo sé, pero intuyo que lo quitará.

Como sustitución Microsoft introdujo el Metodo >> RunCommand. Puedes mirarlo en la ayuda de Access.

En cuanto a un buscador distinto al de Office, la verdad es que hay mucha documentación en la Red, pero algo muy util y simple lo puedes encontrar en la Web de Neckkito, en éste par de enlaces.

http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/todos/93-ejemplos-explicados/ejemplos-de-formularios/209-formulario-buscador-al-tecleo 

y ésta es la segunda versión.

http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/todos/93-ejemplos-explicados/ejemplos-de-formularios/296-formulario-buscador-al-tecleo-2 

Y si quieres algo mas complejo, en la misma Web.

http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/todos/97-ejemplos-explicados/ejemplos-especiales/313-multibuscador 

Espero te sirva para seguir trabajando. Mis saludos >> Jacinto

¡Gracias! 

Estoy probando y a medida que hago cosas me surgen "mejoras".

Como la cuestión es que al estar el Expediente ya ingresado anteriormente ir a ese registro para modificarlo elaboré un formulario (Buscar Expediente)con los tres campos  y un botón buscar al que le introduje una macro. 

Anteriormente, se había colocado (gracias a vos) un campo que es TextoExp que se genera a través de una consulta y es un número formado por los tres campos juntos (por ejemplo: 2436 - 5328 - 13 queda 2436532813).

Entonces la macro hace que Carátula & Número & Año = [TextoExp] es decir, los del formulario que creé igualados al campo de la Tabla Expedientes.

Pero si uso la macro ir a registro no pasa nada, si uso abrir formulario me lo encuentra pero el formulario queda filtrado (y mi formulario de trabajo no tiene la cinta de herramientas disponible). Con encontrar registro tampoco.

Entonces por este lado no le encuentro hasta ahora la vuelta.

Pero pensando, me parece que si el expediente está registrado (y existe la Cadena) usando ese campo de la tabla TextoExp, en vez de hacer que sea buscado, sería lógico que automáticamente se dirija a ese registro (te parece?)

O sea, el MsgBox diría "El Expediente ingresado ya se encuentra registrado" y al dar en el botón Aceptar, fuick.... directo al registro donde es modificado.

Acordate que no quiero que la base quede filtrada, de modo que al terminar de introducir las modificaciones en el registro encontrado avance y retroceda por los registros como si nada.

Esto sucede porque el expediente es "diríamos" móvil, va y viene con agregados. Entonces cuando ingresa un expediente sea anota. Si no existe, en ese momento queda registrado, pero quizás vuelva a los dos meses con agregados que hay que registrar y no puede suceder que esté ingresado dos o más veces ya que faltarían datos en cada uno de los registros.

Un abrazo, y gracias por la paciencia y las explicaciones.

Tabaré: Casi siempre conviene contemplar el conjunto para decidir que camino es el mejor, pero en éste caso sin ver mucho y dado a lo que has ido comentando te resumo lo que yo haría.

Para salvar la dificultad de que se guarden registros inútiles, cuando vayas a añadir un Registro:

Creas un Formulario Independiente, de buscar muy sencillo con un solo TextBox, en el introduces la "CadenaExpediente", compruebas si existe y>>

1.- Si existe >> Abres el Formulario Expedientes por ese Registro.

2.- S NO existe >> Abres el Formulario Expedientes en un Nuevo registro

Hay que codificarlo claro está pero con los antecedentes que hemos tratado, creo que no te costará mucho. Si en unos días ves que no lo has conseguido, me comentas e intentaré confeccionarte un Ejemplo. Mis saludos >> Jacinto

Tabaré: Ampliandote un poco y si quieres evitar un segundo Formulario, el Text Box "Independiente", puede estar en el mismo Formulario que creo es más practico estéticamente mejor. Mis saludos >> Jacinto

Gracias por la rápida respuesta

Respecto a lo que dices, eso lo logro con el Formulario que hice y que tiene la macro.

Si el autonumérico salta y no queda correlativo eso lo sabré sólo y no interfiere con el funcionamiento. Mientras que ello no genere "engorde" de la BD no me hace mayor problema, uno lo quiere hacer bien por prolijidad.

Además, cuando salgo tildé la casilla en opciones de la base de datos que compacte al cerrar.

Bueno, veré que acontece y si aparecen ideas o dudas te vuelvo a molestar (je je).

Muchas gracias

Tabaré: Dado que tenía que preparar un ejemplo de Filtrar un Informe para otro usuario de Todoexpertos, he aprovechado el mismo con la utilidad complementaria de localizar un Registro si lo hay y hacer las acciones necesarias, tanto si lo encuentra como si no.

En éste enlace lo tienes.

http://www.mediafire.com/download/faa6kcpvxeb86z1/FiltroInformeYBuscaRegistro.rar 

Espero que lo puedas adecuar a tus necesidades y trasladarlo a otra Aplicación si lo necesitas. Mis saludos >> Jacinto

Hola Jacinto, voy a ponerme a revisar esto que me envías.

Te comento que apareció un error raro en la base de datos que es el siguiente: cuando salgo de la aplicación está tildada la opción "compctar al salir". Pero cuando vuelvo a entrar, dos formularios que están creados para dar permisos uno y para agregar usuarios el otro no toman la contraseña, le das al botón y no pasa nada. 

El problema fue después de haber marcado la opción "compactar al salir". 

Bueno, muchas gracias.

Un abrazo

Tabaré: En mi opinión, que no necesariamente ha de ser cierta, es que tienes un Error de Código en esos Formularios que citas o en uno de ellos como mínimo, si es que tienen algún tipo de Relación.

Para segurar de que es así o para descartarlo si no lo es:

1.- Con el Editor de VBA abierto y visible >>

Si hay error debe saltarte al Compilar. Si no fuera así, captura el "Error raro" y adjutas una imagen.

Mi sugerencia es que lo hagas en una nueva pregunta, para que puedas recibir otras respuestas y otros punto de vista, porque ésta ya tiene mucha literatura y será raro que alguien la lea completa. Mis saludos >> Jacinto

¡Gracias! Jacinto, he visto el formulario que me enviaste y está excelente.

El tema de los errores lo solucioné gracias a que tenía un archivo donde trabajaba y era donde hacía todos los cambios, etc.

Cuando logré algo ya casi listo lo guardé como dándole otro nombre y ahí empezaron esos errores. Incluso cuando quería agregar un botón de comando me ponía un mensaje de faltaba apploadstring. 

Bueno, volví a ese archivo, que funcionaba bien, volví a gurdarlo con otro nombre y quedó andando bien. la verdad que ni idea que pudo haber pasado.

Pero lo más importante para vos es que este tema lo doy por terminado ya que pude hacer lo que necesitaba.

Por ahí aparezco en una nueva pregunta por alguna idea de perfeccionamiento para la aplicación

Un abrazo maestro y gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas