Como forzar a No un campo?

Tengo un problema con un formulario que no me está funcionando.

Es un formulario de modificación de datos, que me muestra los datos ya cargados, donde tengo un grupo de opciones llamado

¿Tiene productos activos? Las opciones son SI y NO. Luego tengo un listado donde figuran los productos (son etiquetas con una casilla de verificación)

Lo que necesito es que si selecciono SI, por lo menos tenga un producto seleccionado y que si ya tiene productos seleccionados porque estaba en SI, si quiero seleccionar NO, me borre todos los productos seleccionados.

Escribí el siguiente código pero sólo me funciona la parte de SI, si selecciono la opción NO, no me borra los productos seleccionados (necesito que los borre)

If Me.[PRODUCTOS ACTIVOS] = True Then
If Me.CTA = 0 And Me.TJ = 0 And Me.PIL = 0 And Me.ACO= 0 Then
MsgBox "Debe seleccionar el/los Productos Activos", vbInformation, "Atención"
Exit Sub
End If
ElseIf Me.[PRODUCTOS ACTIVOS] = False Then
Me.CTA= 0 And Me.TJ= 0 And Me.PIL= 0 And Me.ACO= 0
Exit Sub
End If

Agradezco desde ya su ayuda para ver como modificar el código para que funcione todo.

3 respuestas

Respuesta
1

Sería posible que adicionara una imagen del formulario para no entrar a improvisar

Asi es como se ve el formulario, lo que necesito es que una vez que esos productos no est[en mas activos ponerlo en NO y que se desmarquen todos los productos que est[an tildados .

Muchas gracias

No se entendí su pregunta, complemento con lo siguiente. Creo que el problema está en el nombre que toma las opciones del control PRODUCTOS ACTIVOS.

Marco estas casillas y hago clic en No.

Se desactivan las casillas que estaban marcadas, es decir,  TJ y PIL.

Aquí es donde pienso tiene el problema Access por defecto numera las opciones como 1, 2 etc, en este caso le asigné al sí el valor de la opción -1 y para No le asigné 0.

Ahora, suponiendo que el valor de las casillas de verificación son INDEPENDIENTES, les asigno el valor predeterminado 0, ! Pero solo si son independientes !.

Ahora, programo el evento Después de actualizar del cuadro de opciones PRODUCTOS ACTIVOS.

Private Sub PRODUCTOS_ACTIVOS_AfterUpdate()
    If Me.[PRODUCTOS ACTIVOS] = -1 Then
        If Me.CTA = 0 And Me.TJ = 0 And Me.PIL = 0 And Me.ACO = 0 Then
            MsgBox "Debe seleccionar el/los Productos Activos", vbInformation, "Atención"
            Exit Sub
        End If
    Else
        Me.CTA = 0
        Me.TJ = 0
        Me.PIL = 0
        Me.ACO = 0
    End If
End Sub

¡Gracias! 

Muchas gracias, el problema lo tenía en el código, que otro experto tmbién me ayudó, y luego que puse el código en un botón, en vez de ponerlo en el evento after update del cuadro de opciones tal como me indicas acá mismo.

Con esto se solucionó mi problema. Muchas gracias!!

Respuesta
1

Tal como se plantea el problema, el código es redundante.

Las dos posibles opciones son Verdadero/False

Se puede evaluar cualquiera de ellas y la construcción es simple :

IF ...... THEN ..... ELSE .... END IF

Sobra el Exit Sub en ambas partes
(el End IF del primer condicional finaliza el SUB de forma natural)

-----------------------------

If Me.[PRODUCTOS ACTIVOS] = True Then

If Me.CTA = 0 And Me.TJ = 0 And Me.PIL = 0 And Me.ACO= 0 Then

MsgBox "Debe seleccionar el/los Productos Activos", vbInformation, "Atención"
End If

Else

Me.CTA= 0 : Me.TJ= 0 : Me.PIL= 0 : Me.ACO= 0
End If

--------------------------------

He marcado el principio y final de los condicionales en negrita.

Al segundo condicional en cursiva.

Sustituido los And en el ELSE por dos puntos (:)

Es una alternativa para que que Access los interprete como líneas independientes útil para forzar que se ejecuten todos a la vez (el motor de Access lee y ejecuta Línea a Línea)

Enrique buen día! Antes te nada muchas gracias por tu respuesta.

Cambié el código exactamente a como explicaste pero sigue igual, sí hace la primera validación de que haya un producto marcado si tengo la opción en SI, pero cuando lo cambio a NO no me destilda ningún check box

Quitar la marca de selección:

En base a esta línea:

If Me.CTA = 0 And Me.TJ = 0 And Me.PIL = 0 And Me.ACO= 0 Then

He asumido que son objetos diferentes y que la referencia a ellos (la que esta publicada) es correcta, solo conociendo como esta diseñada se puede lograr un resultado adecuado.

Si se aclara que son CTA, TJ, PIL, ACO (tipo de objeto y su origen) se podrá aplicar la solución mas idónea.

Al revisar el hilo inicial me surge una duda:

¿Qué se evalúa en esta línea?:
If Me.[PRODUCTOS ACTIVOS] = True Then

Si los productos activos son CTA, TJ, PIL, ACO, alguno de ellos debería estar a verdadero por lo que carecerá de sentido esta verificación:
If Me.CTA = 0 And Me.TJ = 0 And Me.PIL = 0 And Me.ACO= 0 Then

Posiblemente la lógica este invertida ...

Si los objetos son casillas de verificación, estas pueden tener hasta tres estados Si/NO/Null (se puede evitar el valor Null y además seria lo correcto)

Si se suman los valores de las casillas (y sin opción a Null o aplicando Nz) se obtendrá un cero (False) o diferente de cero (True)

De acuerdo a lo anterior:
(Me.CTA + Me.TJ + Me.PIL + Me.ACO) = ???

Todos a cero (suma = 0) ==> False
Suma diferente de cero (Access por defecto asume -1 como True) ==> True

Como exigir que al menos se seleccione un producto:

IF (Me.CTA + Me.TJ + Me.PIL + Me.ACO) = 0 Then MsgBox "Debe seleccionar el/los Productos Activos", vbInformation, "Atención"

No veo la necesidad de modificar los datos (que ya están guardados), al cambiar de registro (y acceder a otro registro guardado) se presentaran los valores correspondientes y si se va a un nuevo registro, deberá aparecer con todos a cero (si en el diseño de la tabla no se fuerza otro valor).

Respuesta
1

Esta parte es incorrecta:

Me.CTA= 0 And Me.TJ= 0 And Me.PIL= 0 And Me.ACO= 0

Aquí no está actualizando los valores de CTA, TJ, PIL y ACO.

Debería hacer:

Me.CTA= 0

Me.TJ= 0

Me.PIL= 0

Me.ACO= 0

¡Gracias! 

Te agradezco pero no me ha funcionado...sabés que otra cosa podría hacer?

Con:

Me.CTA= 0

Me.TJ= 0

Me.PIL= 0

Me.ACO= 0 

Está estableciendo los valores para los campos CTA, TJ, PIL y ACO.

Después debe guardarlos. Para ello, use:

Me.Recordset.Update

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas