Pregunta

Tengo un Acceso de 2007, de forma que se pueden realizar búsquedas por un combobox.Al agregar un nuevo registro, necesito actualizar el combobox para incluir en el nuevo elemento.

Supongo que algo tiene que ser hecho en el evento AfterInsert de la forma, pero no puedo averiguar qué.

¿Cómo puedo volver a enlazar el combobox después de la inserción, de modo que el nuevo elemento aparece en la lista?

¿Fue útil?

Solución

La forma más fácil es garantía de que el combobox es siempre a la fecha es simplemente volver a consultar el combobox una vez que se obtiene el foco.Incluso si el conjunto de registros a continuación, se actualiza en algún otro lugar, su combobox está siempre actualizada.Un simple TheCombobox.Nueva consulta en el evento OnFocus debería ser suficiente.

Otros consejos

Hay dos posibles respuestas aquí que son eficientes:

  1. el uso del Formulario AfterInsert evento para volver a Consultar el cuadro combinado (así como la OnDeleteConfirm evento).Esto será suficiente si el cuadro combinado no muestra los datos que el usuario puede actualizar y que necesita ser actualizado si el subyacente registro se actualiza.

  2. si las actualizaciones de los datos necesitan ser reflejadas en el cuadro combinado, entonces tendría sentido agregar una nueva consulta en la AfterUpdate eventos de los controles que se utilizan para editar los datos que se muestran en el cuadro combinado.

Por ejemplo, si el cuadro combinado muestra los nombres de las personas en la mesa, usted querrá utilizar el método #2, y en el evento AfterUpdate de Mí!txtFirstName y a Mí!txtLastName, consultar el cuadro combinado.Ya estás haciendo la misma operación en cuatro lugares, vas a querer escribir una subrutina para hacer la nueva consulta.Así que, la sub sería algo como esto:

  Private Sub RequerySearchCombo()
    If Me.Dirty Then Me.Dirty = False
    Me!MyCombo.Requery
  End Sub

La razón para asegurarse de que usted consultar de nuevo sólo cuando no es en realidad una actualización de los datos que se muestran en el cuadro combinado es porque si eres de rellenar el cuadro combinado con lista de toda la tabla, la nueva consulta puede tomar un tiempo muy largo si usted tiene 10s de 1.000 s de los registros.

Otra alternativa, que guarda todas las consultas sería tener un espacio en blanco origendelafila (rowsource) para el cuadro combinado, y rellenar sólo después de 1 o 2 caracteres que se han escrito, y filtrar los resultados que el combo muestra basándose en los caracteres escritos.Para eso, tendría que utilizar el cuadro combinado del evento OnChange:

Private Sub MyCombo_Change()
  Dim strSQL As String

  If Len(Me!MyCombo.Text) = 2 Then
     strSQL = "SELECT MyID, LastName & ', ' & FirstName FROM MyTable "
     strSQL = strSQL & "WHERE LastName LIKE " & Chr(34) & Me!MyCombo.Text & Chr(34) & "*"
     Me!MyCombo.Rowsource = strSQL 
  End If
End Sub

El código anterior se supone que usted está buscando el nombre de una persona en un cuadro combinado que muestra "Apellido, Nombre".

Hay otra advertencia importante:si estás en busca de un formulario enlazado a una tabla completa (o una instrucción SQL que devuelve todos los registros en la tabla) y el uso de marcadores de navegación para localizar los registros, este método no escala muy bien, ya que se requiere de tirar todo el índice para el término buscado campos a través de la red.En el caso de mi imaginario cuadro combinado de arriba, usted estaría usando FindFirst para desplazarse al registro con la correspondiente MyID valor, por lo que el índice de MyID que tendría que ser tirado (aunque sólo como muchas páginas de índice como sea necesario para satisfacer la búsqueda de realmente conseguir tirado).Este no es un problema para las tablas con un par de miles de registros, pero más allá de unos 15-20K, puede ser un cuello de botella.

En ese caso, en lugar de navegar a través de marcadores, tendría que utilizar el cuadro combinado para filtrar el resultado establecido para el registro único.Este es, por supuesto, extremadamente eficiente, independientemente de si usted está usando un Chorro de back-end o un servidor back-end.Es altamente deseable para iniciar la incorporación de estos tipos de eficiencia en su aplicación tan pronto como sea posible.Si lo hace, que lo hace mucho más fácil convertir a un servidor back-end, o lo hace bastante sencillo si usted debe golpear a ese punto de inflexión, con una masa de nuevos datos que hace el viejo método demasiado ineficientes para ser amigable con el usuario.

Supongo que tu combobox es un control en un formulario, no un control combobox en un commandBar.Este combobox tiene una propiedad llamada origendelafila (rowsource), que puede ser una lista de valores (esposo, esposa, hijo, niña) o la instrucción SELECT de SQL (SELECT relationDescription DE Table_relationType).

Supongo también que su forma de conjunto de registros tiene algo que ver con su combobox conjunto de registros.Lo que tienes que hacer es, una vez que su forma de conjunto de registros actualizado correctamente (evento afterUpdate creo), para reiniciar la propiedad rowsource del control combobox

si el origendelregistro (recordsource) es una instrucción SQL:

myComboBoxControl.recordsource = _
    "SELECT relationDescription FROM Table_relationType"

o si es un valor de la lista

myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew"

Pero sobre todo creo que su petición muy extraña.¿Tienes un reflexivo (padre-hijo) de la relación en su mesa?

Yo normalmente uso el evento NotInList para agregar datos a un combo con

   Response = acDataErrAdded

Para actualizar el combo.

El Acceso De 2007 de Referencia para Desarrolladores tiene todos los detalles, incluyendo el código de ejemplo:http://msdn.microsoft.com/en-us/library/bb214329.aspx

Consultar el cuadro combinado en el formulario después de la actualización el evento y el evento de eliminación.Su cuadro combinado será actualizada cada vez que el usuario hace cambios en el conjunto de registros, si se trata de un nuevo récord, y el cambio, o una eliminación.

A menos que los usuarios deben tener la de todos los demás cambios tan pronto como estén hechas, no volver a consultar el cuadro combinado cada vez que se pone el foco de atención porque no sólo el usuario tiene que esperar (lo cual es evidente en grandes conjuntos de registros), es innecesario si el conjunto de registros que no ha cambiado.Pero si ese es el caso, todo el formulario se vuelve a consultar tan pronto como alguien hace un cambio, no sólo el cuadro combinado.Este sería un muy inusual escenario.

Después de la actualización:

Private Sub Form_AfterUpdate()    
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery   

    Exit Sub    
Proc_Err:    
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear        
End Sub

Después de eliminar:

Private Sub Form_Delete(Cancel As Integer)    
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery   

    Exit Sub    
Proc_Err:    
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear        
End Sub
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top