Restar campo independiente y campo cuando se selecciona un art en un cuadro de lista

O buenas noches. Tengo la siguiente inquietud. Estoy tratando de hacer funcionar el siguiente código

Private Sub Dias_Exit(Cancel As Integer)
Dim IdItm As Variant, SQL As String

If Me.ART_114.ItemsSelected.Count = 1 Then
Me.RESTO114 = Me.DIASFALTAS - Me.Dias
For Each IdItm In Me.ART_114.ItemsSelected
Me.Art_114.SetFocus: Me.Art_114.Selected(IdItm) = False
Next IdItm
Me.ART_114.Requery
Else
Me.RESTO115 = Me.Dias - Me.Dias

For Each IdItm In Me.ART_115.ItemsSelected

Me.Art_115.SetFocus: Me.Art_115.Selected(IdItm) = False
Next IdItm
Me.ART_114.Requery
End If
End Sub

A través del cual, busco que el campo Art_114 o Art_115 se llene de manera automática, al restar los campos diasfaltas y el campo dias1.

Los problemas que encuentro es, el campo dias1 es independiente, no lo quiero guardar, pero no he podido que quede registrado, cuando cambio de registro y necesito poner la cantidad de días, me cambia los demás.

2 Respuestas

Respuesta
1

Pregunta:

Si en el campo Dias1 el valor fuera cero (o NULL) al cambiar de registro ¿Qué ocurriría?

Esto es un punto de vista que solo pretende optimizar recursos.

Si se necesita hacer de forma reiterada la misma operación, hay mas de una posibilidad, la clásica de copiar y pegar el código cambiando las referencias (en caso de querer modificarla hay que hacer tantos cambios como copias y sin que pierdan las referencias)o la opción de crear una función (si se desea que devuelva algo) o una subfunción (cuando no no se necesita que retorne un valor).

En este caso declararía la variable IdItm a nivel de formulario (para no embarrar la memoria creándola y destruyéndola cada vez que se utilice) y la utilizaría en la subfunción a la que se pasara únicamente el nombre del objeto a modificar.

El mismo código para la acción repetitiva y si se desea mejorarla o corregirla, solo se tiene que hacer una vez en un único lugar.

Estimado un gusto tener su ayuda, e leído muchos de sus ejemplos y asesoramientos.

El código que pase lo reducí a este. Un profesor siempre decía "El menor código posible hace que todo funcione normal". Quedo así.

If Nz(Me.ART_114) = "" Then
Me.RESTO114 = 0
Me.RESTO115 = Me.DIASFALTAS - Me.dias1 'AQUI APLICO LA FORMULA SI EN NULL
Else
Me.RESTO115 = 0 ' PASO A 0 SI ES VERDAD QUE ART_114 TIENE DATOS
Me.RESTO114 = Me.DIASFALTAS - Me.dias1 ' APLICO LA FORMULA
End If

Hasta aquí todo va bien. Sigo con el problema del campo DIAS1, el cual es independiente, no logro que al pasar a otro registro, no se borre o cambien los demás.

No quiero guardar ese campo. Si no queda otra lo deberé hacer, pero me sale cuando paso esos datos a un excel.

Voy a ampliar la respuesta.

.- Si el campo no necesita ser guardado
.- Si solo se utiliza en un registro concreto (el actual)
.- Si no debe de modificar otro registro

En mi particular punto de vista la opción correcta es cambiarlo por un cero en el evento Current (que siempre se ejecuta al cambiar de registro) o inmediatamente después de que se apliquen los cálculos.

Como la operación matemática es una suma, con el cero como valor predeterminado para Dias1 no se producirán cambios indeseados (seria transparente).

Lo del valor Null solo pretendía saber si ese posible problema ya estaba contemplado.

Lo anterior solo tiene un problema (que puede ser un beneficio) y es que antes de calcular hay que cambiar el dato 'Dias1' (algo que se supone es parte de lo que se hace actualmente).

Sobre la optimización de recursos:

Desmarcar o limpiar los items seleccionados en los cuadros de lista (la acción repetitiva) se puede optimizar con una subfunción.

Para una mayor optimización, las variables utilizadas se declaran en la cabecera del codigo (en la ventana de VBA), así solo se declaran una vez (se utilizan cuantas veces se precise) y se destruyen al cerrar el formulario.

Son los pequeños detalles los que hacen las diferencias (optimizando ciclos de reloj) y que aplicado a la F1 diferencia a los ganadores de los que les persiguen.

Respuesta
1

Su código no es claro ¿Para qué define la variable SQL?.

Es necesario conocer la tabla origen de datos del formulario, de esta forma se puede dar un concepto apropiado, este es uno de los problemas de formularios dependientes. No entiendo para que hace un Requery sobre el cuadro de lista.

Analice este código por si le sirve (como le digo sin conocer la tabla que recibe los datos, cualquier respuesta es provisional).

Dim flag As Boolean
If Me.newrecod Then
  flag = True
Else
  flag = False
End If
If Nz(Me.ART_114) = "" Then
Me.RESTO114 = 0
Me.RESTO115 = IIf(flag, Me.DIASFALTAS - Me.dias1, Me.DIASFALTAS) 'AQUI APLICO LA FORMULA SI EN NULL
Else
Me.RESTO115 = 0 ' PASO A 0 SI ES VERDAD QUE ART_114 TIENE DATOS
Me.RESTO114 = IIf(flag, Me.DIASFALTAS - Me.dias1, Me.DIASFALTAS) ' APLICO LA FORMULA
End If

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas