Tengo error Combos en cascada

Estoy trabado en un Formulario continuo, Exactamente en Cuadros Combinados en cascada: cuando ingreso un nuevo registro El programa funciona(Cuadros combinados) los combos en cascada, el problema esta en la modificación de los combos y exactamente en el ultimo. Al no coincidir con los anteriores combos queda vacío osea no carga nada, Y ESO ESTA BIEN, lo que no quiero es que siga adelante o que NO PUEDA GUARDAR, a pesar de que salio vacío el cuadro combinado deja pasar a la siguiente caja y guarda el dato que se guardo por primera vez guardando una información falsa o no escogida.

Explicación detallada.
Así esta ordenado el formulario:
Por(combo) codestilo(combo) lote(combo) codcolor(combo) talla(combo)
****tengo el combo PO, Que al escoger un registro llena el siguiente combo que es ESTILO
Private Sub cmbPO_AfterUpdate()
Me.COD_ESTILO = Me.cmbPO.Column(1)
*****EL COMBO LOTE AL ESCOGER UN REGISTRO LLENA EL SIGUIENTE COMBO CODCOLOR Y TAMBIEN LLENA TALLA DE ACUERDO A LO QUE ESCOGIMOS OSEA PO,ESTILO, Y COLOR SI LOS TRES COMBOS ESTAN EN EL PEDIDO APARECE LA TALLA, PERO SI NO COINCIDE ESOS 3 COMBOS NO APARECE NADA EN EL COMBO TALLA (HASTA TODO BIEN).
El problema esta que si yo dejo ese espacio vacío siempre se guarda el dato anterior acuérdate que estamos
MODIFICANDO EL REGISTRO.
Private Sub LOTE_AfterUpdate()
Me.COD_COLOR = Me.LOTE.Column(3)
Me.COD_TALLA.RowSource = "SELECT Entrada_Gilma.TALLA, TALLA.TALLA FROM Entrada_Gilma INNER JOIN TALLA ON Entrada_Gilma.TALLA = TALLA.Id_TALLA WHERE PO = '" & Me.cmbPO & "' AND ESTILO = " & Me.COD_ESTILO & " AND COLOR = " & Me.COD_COLOR & " GROUP BY Entrada_Gilma.TALLA, TALLA.TALLA"
Cuando ingreso un nuevo dato Todos los cuadros combinados funcionan super bien.
El problema es cuando edito o modifico el dato de unos o dos combos y como funciona en cadena afecta al ultimo combo que es Talla

Buenas, enviare una foto y el archivo de mi dolor de cabeza.

http://www.filebig.net/files/55FryCW7Ts 

1 respuesta

Respuesta
1

Vamos a suponer que el combo es el de talla. Puedes hacerlo de muchas formas, todo depende de como rellenes los controles. Por ejemplo, en el evento Al recibir el enfoque del control siguiente puedes poner

if talla="" or isnul([talla]) then

Msgbox"¿Es que no te das cuenta de que Talla está en blanco?", vbokonly,"Yo no sigo"

Talla. Setfocus

end if

O si pulsas un botón para guardar, pones lo mismo en el evento al hacer clic.

GRACIAS POR TU APORTE PERO NO ES EL CASO, ACUÉRDATE QUE YA HAY UN DATO EN LA TABLA Y QUE LO QUE QUIERO ES MODIFICAR VARIOS COMBOS . TE DEJO UN MENSAJE DE ALGÚN COLABORADOR PARA SER MÁS ESPECIFICO.

Lo que yo entiendo es que es la lista lo que se queda vacía, no el valor. Es decir si tenemos 2 cuadros combinados, donde en el primero se puede seleccionar Fruta o Verdura; y en el segundo de puede seleccionar Manzana o Pera para la fruta, y Lechuga o Alcachofa para la verdura, le ocurre que en un registro ya creado: Fruta-> Manzana, si después selecciona Verdura, el valor en el segundo cuadro combinado "desaparece" porque Manzana no es una verdura, pero si no lo modifica sigue quedando ese valor en el campo de la tabla.

Ya pero para eso puedes poner en el evento Al recibir el enfoque del segundo combinado, que para el ejemplo vamos a llamarlo Producto

Producto. Requery

Es decir que "reconsulte" su origen de la fila.

De todas formas, no digo que sea lo mejor, pero, personalmente, suelo darle el origen de la fila de los combinados en código.

Por ejemplo, vamos a suponer que el primer combinado se llama Categoría. En el evento Al recibir el enfoque se le puede poner

Categoria.rowsource="Select categoria from Categorias group by categoria"

Y en el evento al recibir el enfoque( y depende de como estén construidas las tablas) del combinado Producto puedes ponerle

Producto.rowsource="select Producto from Productos where categoria='" & me.categoria & "'"

De forma que cuando pones el cursor en el, "mira" que valor hay en el combinado Categoría y te "busca" aquellos productos de la tabla Productos que su categoria coincida con la que hay en el combinado Categoria.

Y si cambiaras algún valor en el combinado Categoria, cuando pongas el cursor en el combinado Productos te aparecerán sólo los que corresponden a esa categoria.

De todas formas, si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando un ejemplo.

Si lo haces, en el asunto del mensaje pon tu alias Jimmy Aramburu, ya que si no sé quien me escribe ni los abro.

¡Gracias! Te envíe un correo

Julián te agradezco por el archivo que me enviaste, pero no es eso lo que buscaba.

http://www.filebig.net/files/55FryCW7Ts

Suponiendo que si abres mi archivo y lo revisas, lo que me ayudaría es que si no hay nada o esta vacío en el combo talla porque busco y no encontró que haga lo siguiente:

Opción 1 que por ningún motivo guarde porque guardaría con un dato que no escogí, creo que con que NO me deje pasar de esa fila, y que se vaya al primer combo para escoger de nuevo hasta que escoja la información adecuada. Osea que los tres combos sean los correctos para que se llene el combo talla.

La opción 2 seria que si no sale nada en el combo talla que se actualice con update en dato vacío o null, porque así no me dejaría pasar de talla ya que tengo como requerido en la Tabla . hasta ingresar el correcto

Creo que seria algo así es un ejemplo que baje del internet.

 If Me.cboCustomer.ListIndex = -1 Then Exit Sub
strSQL = "INSERT INTO tmpARCustomer SELECT tblARCustomer.* FROM tblARCustomer WHERE '        DoCmd.RunSQL strSQL
'        Me.Requery

Gracias y mil disculpas por las molestias

Ahora si que no entiendo nada. Si el campo Cod_talla es requerido, no te guardará el registro hasta que no lo rellenes. Personalmente no me gustan, no les veo ninguna utilidad, ya que se le puede decir en código que se rellene un campo. Por ejemplo,

Private Sub CODE_PACA_GotFocus()
If IsNull([COD_TALLA]) Then
MsgBox "¿No te das cuenta de que la talla está vacía, me vuelvo a Talla", vbOKOnly + vbCritical, "Otra vez será"
[COD_TALLA].SetFocus
End If
End Sub

usando For each control in form.controls. Pero, si relleno un registro

Dejo Talla en blanco y cuando el campo CODE_paca recibe el enfoque

Al aceptar se vuelve a Talla, pero se le podría decir que borrara, por ejemplo, algún campo requerido. Con lo cual, aunque quisieras guardarlo no te dejaría. Además no entiendo que un campo como CODE_PACA que lo haces funcionar como autonumérico, vaya detrás de un control cualquiera. Lo lógico, ya que el valor lo va a poner él, es que esté bloqueado o que no reciba el enfoque. Bueno, el cursor se vuelve a Talla( si aumentas la imagen se ve el cursor)

El código del evento Al recibir el enfoque del control CODE_PACA es

Private Sub CODE_PACA_GotFocus()
If IsNull([COD_TALLA]) Then
MsgBox "¿No te das cuenta de que la talla está vacía, me vuelvo a Talla", vbOKOnly + vbCritical, "Otra vez será"
[COD_TALLA].SetFocus
End If
End Sub

Gracias por responder, tu probaste con el ultimo registro abajo, agregaste uno nuevo ese no es el problema el problema es los de arriba intenta modificar, prueba modificando algo de arriba escoge otro por, otro lote y te darás cuenta que al no encontrar la talla dale enter oclic fuera de talla y veras que pasa a código busque y no captura ningún error, (ese es mi problema) ya le puse tu código y aun así deja pasar

If IsNull([COD_TALLA]) Then
MsgBox "¿No te das cuenta de que la talla está vacía, me vuelvo a Talla", vbOKOnly + vbCritical, "Otra vez será"
[COD_TALLA].SetFocus
End If
Gracias una vez más y disculpa sino me explique bien

Hice un video de 1 minuto mira lo por favor

https://www.filebig.net/files/pMrDfSz3ik 

Me vas a a perdonar pero la construcción me parece, cuando menos, "retorcida", siendo generoso. Se puede hacer mucho más sencilla.

La instrucción, en registros anteriores no valía porque lógicamente el campo Cod_talla sí tenía valor. Es más, si le cambias el valor a PO o Lote, que son los que le dan valor a los combinados siguientes, talla, aunque lo veas en blanco sigue teniendo valor, no se vé, porque le tienes dicho que la columna dependiente tenga un ancho de 0 cm. Sólo tienes que mirar la tabla, porque los nuevos valores todavía no se han guardado. Lo que no entiendo es que si el el combinado PO eliges un valor, entre los que se encuentra Estilo, ¿por qué éste tiene que ser un combinado? Con poner un simple cuadro de texto es suficiente. Sigamos, la única solución que le veo es que si cambio o el PO o el lote( ver imágenes)

Ahora le cambio el lote

El cursor se va a talla

Hago caso omiso y pongo el cursor en Code_paca y

El código que le he puesto es

Private Sub CODE_PACA_GotFocus()
If Not Me.NewRecord Then
If [cmbPO] <> DLookup("po", "entradas_detalle_cortekit", "ido=" & Me.Ido & "") Or LOTE <> DLookup("lote", "entradas_detalle_cortekit", "lote='" & Me.LOTE & "'") Then
MsgBox "¿No te das cuenta de que la talla está vacía, me vuelvo a Talla", vbOKOnly + vbCritical, "Otra vez será"
[COD_TALLA].SetFocus
End If
End If
End Sub

Es decir, si es un registro antiguo y he cambiado, el PO, el Lote o ambos, que compare el nuevo valor con el antiguo y si es distinto, que se supone que sí porque se ha cambiado te avise. 

Lo siento, pero teniendo en cuenta la construcción no puedo hacer más. No consigo entender porqué el combinado talla tiene origen de la fila, pero en el evento Después de actualizar del combinado Lote se lo vuelves a dar. Para eso están los filtros en cascada, y mas...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas