Fuente de fila personalizada para cuadro combinado en forma continua en Access

StackOverflow https://stackoverflow.com/questions/86278

  •  01-07-2019
  •  | 
  •  

Pregunta

He buscado por ahí y parece que esto es una limitación en MS Access, así que me pregunto qué soluciones creativas han encontrado otros para este rompecabezas.

Si tiene un formulario continuo y desea que un campo sea un cuadro combinado de opciones específicas de esa fila, Access no se entrega;la fuente de la fila del cuadro combinado solo se consulta una vez al principio del formulario y, por lo tanto, muestra opciones incorrectas para el resto del formulario.

El siguiente paso que todos intentamos, por supuesto, es usar el evento onCurrent para volver a consultar el cuadro combinado, que de hecho limita las opciones a la fila dada.Sin embargo, en este punto, Access se vuelve loco y las consultas todo de los cuadros combinados, para cada fila, y el resultado suele ser que las opciones desaparecen y reaparecen en otras filas, dependiendo de si han elegido una opción que sea válida para el origen de la fila del registro actual.

La única solución que he encontrado es simplemente enumerar todas las opciones disponibles, todo el tiempo.¿Alguna respuesta creativa por ahí?

Editar Además, debo tener en cuenta que el motivo del cuadro combinado es tener una consulta como tabla de búsqueda, el valor real debe ocultarse y almacenarse, mientras se muestra la versión legible por humanos...varias columnas en la fuente de fila del cuadro combinado.Por lo tanto, cambiar el límite a la lista no ayuda, porque las identificaciones que no están en la consulta de origen de la fila actual no tendrán una parte legible por humanos coincidente.

En este caso particular, las formas continuas tienen mucho sentido, así que no me digan que es la solución incorrecta.Estoy pidiendo respuestas creativas.

¿Fue útil?

Solución

También odio Access, pero debes jugar con las cartas que te reparten.Los formularios continuos son algo maravilloso en Access, hasta que te encuentras con algún tipo de complejidad, como suele ser el caso, como en este caso.

Esto es lo que haría ante esta situación (y he implementado soluciones similares antes):

Coloque un cuadro combinado SIN CONTINUAR en el formulario.Luego coloque un cuadro de texto ENLACE para el campo que desea editar.

Asegúrese de que el cuadro combinado esté oculto detrás (NO invisible, simplemente oculto) detrás del cuadro de texto.

En el evento OnCurrent complete el listBox con los datos necesarios.Continúe y "Limitar a listar" también.

En el evento OnEnter o OnClick del cuadro de texto, dé el foco al cuadro combinado.Esto pondrá el cuadro combinado en primer plano.Cuando el foco abandone el cuadro combinado, se ocultará una vez más.

En el evento AfterUpdate del cuadro combinado, establezca el valor del cuadro de texto igual al valor del cuadro combinado.

Dependiendo de su situación, puede haber otros detalles que resolver, pero eso debería lograr más o menos su objetivo sin agregar demasiada complejidad.

Otros consejos

utilizar formas continuas..definitivamente.De hecho, puede crear aplicaciones completas con una interfaz de usuario excelente e intuitiva basada en formularios continuos.¡No escuches Toast!

Su solución de enumerar todas las opciones disponibles es la correcta.De hecho, no existe otra solución limpia.Pero te equivocas cuando dices que Access se vuelve loco.En un formulario continuo, podría ver cada línea como una instancia de la sección de detalles, donde el cuadro combinado es una propiedad común a todas las instancias de la sección de detalles.Puede actualizar esta propiedad para todas las instancias, pero no puede establecerla para una instancia específica.¡Es por eso que Access DEBE mostrar los mismos datos en el cuadro combinado para todos los registros!

Si necesita aceptar solo valores específicos de registros en este cuadro combinado, utilice el evento beforeUpdate para agregar un procedimiento de control.En caso de que no se pueda aceptar un nuevo valor, puede cancelar la actualización de datos, recuperando el valor anterior en el campo.

No puede establecer la propiedad limitToList en 'No' donde los datos vinculados (los que están almacenados en el control) están ocultos.Esto es lógico:¿Cómo puede la máquina aceptar la entrada de una nueva línea de datos cuando el campo vinculado (no visible) permanece vacío?

También puede convertir el valor del cuadro combinado en un campo de texto no editable y luego abrir una ventana emergente/modal para editar ese valor.Sin embargo, si estuviera haciendo eso, podría inclinarme a editar el registro completo en una de esas ventanas.

No creo que los formularios continuos de Access deban condenarse en absoluto, pero definitivamente creo que deben evitarse para EDITAR DATOS.Funcionan muy bien para listas y le brindan sustancialmente más capacidades de formato que un simple cuadro de lista (y también es mucho más fácil trabajar con ellos, aunque no permiten la selección múltiple, por supuesto).

Si desea utilizar un formulario continuo para navegar a registros para editar, use un subformulario que muestre los datos detallados para editar y use el valor PK del subformulario para el campo de enlace.Esto se puede hacer con un formulario continuo donde se coloca un subformulario detallado en el encabezado o pie de página, vinculado en el PK de la tabla detrás del formulario continuo.

O, si está utilizando un formulario continuo para mostrar datos secundarios en un formulario principal, puede vincular el subformulario detallado con una referencia a la PK en el subformulario continuo, algo como:

[MySubForm].[Form]!MyID

Esa sería la propiedad maestra del enlace y MyID sería la propiedad secundaria del enlace.

También encontramos esto mucho en nuestras aplicaciones.Lo que hemos encontrado que es una buena solución:Simplemente muestre todas las filas en los cuadros combinados.Luego, tan pronto como el usuario ingrese al cuadro de composición en una fila específica, ajuste el origen de la fila (con el filtro para esa fila).Cuando el cuadro combinado pierde el foco, puede restablecer el origen de filas para mostrar todo.

Tengo un camino más sencillo que Gilligan.Parece mucho trabajo pero realmente no lo es.Mi solución requiere tener mi formulario continuo como una hoja de datos de subformulario.En mi subformulario tengo dos cuadros combinados de búsqueda, entre otros campos, llamados Equipo y Fabricante.Ambos simplemente contienen una clave de número entero largo en la fuente de datos.El fabricante debe filtrarse según lo seleccionado en Equipo.La única vez que filtro Manufacturer.RowSource es en el evento Manufacturer_GotFocus.

Subfabricante privado_GotFocus()

If Nz(Me.Equipment, 0) > 0 Then
    Me.Manufacturer.RowSource = GetMfrSQL()  '- gets filtered query based on Equipment
Else
    Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If

Subtítulo final

En Manufacturer_LostFocus también restablezco Manufacturer.RowSource a todos los fabricantes.Debe hacer esto porque cuando hace clic por primera vez en el subformulario, los eventos GotFocus se activan para todos los controles, incluido el Fabricante, aunque en realidad no esté actualizando ningún campo.

Subfabricante privado_LostFocus()

Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

Subtítulo final

En el evento Ingresar de Fabricante, debe verificar si se ha seleccionado Equipo; de lo contrario, establezca el foco en Equipo.

Subfabricante privado_Enter()

If Nz(Me.EquipmentID, 0) = 0 Then
    '-- Must select Equipment first, before selecting Manufacturer
    Me.Equipment.SetFocus
End If

Subtítulo final

También debe volver a consultar el cuadro combinado Fabricante en el evento Form_Current (es decir,Me.Manufacturer.Requery), y debe establecer la propiedad Ciclo de este subformulario en "Registro actual".

Parece bastante simple, pero aún no has terminado.También debe restablecer Manufacturer.RowSource a todos los fabricantes en el evento SubForm_Exit en el formulario principal en caso de que el usuario vaya al cuadro combinado Fabricante pero no haga una selección y haga clic en algún lugar del formulario principal.Ejemplo de código (en formato principal):

Private Sub sFrmEquip_Exit (Cancelar como entero)

Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

Subtítulo final

Todavía hay una parte de esto que no está limpia.Cuando hace clic en Fabricante y tiene varias filas en la cuadrícula de la hoja de datos, el campo Fabricante quedará en blanco en otras filas (los datos debajo de los cuadros combinados aún están intactos) mientras cambia el Fabricante en la fila actual.Una vez que salga de este campo, volverá a aparecer el texto de los otros campos del Fabricante.

Esto parece funcionar bien.CBOsfrmTouchpoint8 es un cuadro combinado reducido a solo el cuadro desplegable.CBOsfrmTouchpoint14 es un cuadro de texto que constituye el resto del espacio.Nunca digas nunca:

  Private Sub CBOsfrmTouchpoint8_Enter()  

  If Me.CBOsfrmTouchpoint8.Tag = "Yes" Then  
  CBOsfrmTouchpoint14.SetFocus  
  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Exit Sub  
  End If  

  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  Me.CBOsfrmTouchpoint8.SetFocus  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_GotFocus()  
  Me.CBOsfrmTouchpoint14.Width = 0  
  Me.CBOsfrmTouchpoint8.Width = 3420  
  Me.CBOsfrmTouchpoint8.Left = 8580  
  Me.CBOsfrmTouchpoint8.Dropdown  
  End Sub

  Private Sub CBOsfrmTouchpoint8_LostFocus()  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_Exit(Cancel As Integer)  
  Me.CBOsfrmTouchpoint14.Width = 3180  
  Me.CBOsfrmTouchpoint8.Width = 240  
  Me.CBOsfrmTouchpoint8.Left = 11760  
  Me.CBOsfrmTouchpoint8.Tag = "Yes"  
  End Sub

¿Qué sucede si desactiva la opción "Limitar a la lista" y realiza una validación antes de la actualización para confirmar que lo que el usuario pudo haber escrito coincide con algo en la lista que le presentó?

Mejor...

Configure su cuadro combinado Fuente de control en una columna de la consulta donde se almacenarán los valores de su cuadro combinado.

Para mí, creo que la mejor manera y la más sencilla es crear una tabla temporal que tenga todos los campos enlazados más un campo adicional que sea un campo de sí/no.

entonces utilizará esta tabla como fuente de datos para el for continuo.Puede usar onLoad para llenar la tabla temporal con los datos que desee.

Creo que después de eso es fácil realizar un bucle para buscar las opciones, solo un pequeño bucle para leer el campo sí/no de la tabla temporal.

Espero que esto sea de ayuda

Usar OnEnter evento para llenar el cuadro combinado, no utilice un fijo rowsource.

Acabo de hacer algo similar.Mi solución fue utilizar una fuente de fila fija vinculada a una consulta.la consulta WHERE Las cláusulas hacen referencia al control del formulario, es decir. Client=Forms!frmMain!ClientTextBox.Esto por sí solo llenará los cuadros combinados con los datos de la primera fila.El truco entonces es establecer un 'On Enter' evento que simplemente realiza una nueva consulta en el cuadro combinado, p. ComboBox1.Requery, esto volverá a consultar ese cuadro combinado solo y solo arrastrará los datos relacionados con esa fila de registro.

¡Espero que eso funcione para ti también!

Descargo de responsabilidad:Odio Access con pasión.

No utilice formas continuas.Son una pista falsa para lo que quieres lograr.Los formularios continuos son el mismo formulario repetido una y otra vez con datos diferentes.Ya es un error del modo de funcionamiento normal de Access, ya que no se puede abrir el mismo formulario varias veces.El comportamiento que está viendo es "según lo diseñado" en Access.Cada uno de esos controles ComboBox es en realidad el mismo control.No se puede afectar a uno sin afectar a los demás.

Básicamente, lo que ha hecho aquí es llegar al área donde Access ya no es adecuado para su proyecto (pero no puede abandonarlo porque ya representa una gran cantidad de trabajo).

Lo que parece ser el curso de acción más probable aquí es fingir muy bien.Ejecute una consulta con los datos y luego cree los elementos del formulario mediante programación en función de los resultados.Esta es una buena cantidad de trabajo ya que usted mismo duplicará una buena parte de la funcionalidad de manejo de datos de Access.

Responder a Editar:
Pero tal como están, las formas continuas no pueden lograr lo que usted desea.Es por eso que sugerí falsificar tus propias formas continuas, porque las formas continuas tienen limitaciones reales en lo que pueden hacer.No se quede tan atascado en una implementación en particular que no pueda dejarla cuando deje de funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top