Cambiar valor cuadro de texto dependiendo de registros de subformulario access

Tengo un formulario Compra y un subformulario con los detalles de la compra. Quisiera que cuando todos los estados de los detalles de la compra sean "Pedido - En camino", automaticamente cambie el estado del form Compra a "En camino", pero si hubiese un solo detalle con estado diferente a los demás, el estado de compra del form cambiase. Muchas gracias

3 Respuestas

Respuesta

Debes vincular la propiedad listindex del combo del subformulario con el combo del formulario en el evento combo change

Respuesta
2

Adrián: Una forma que se me ocuree ys que cada vez que actualices en el Sub Formulario una posición, hagas un con conteo, previo grabado de ese Estado.

Haré las siguientes suposiciones y tu has de adecuar los nombres a lo que tengas.

Nombre de la Referencia del Pedido de Compra >> RefCompra y numérico

Nombre de ese Control tipo Combo del Form Continuo >> CboEstadoLinea

Nombre del Campo de la Tabla o Consulta como Origen >> EstadoLinea

Tabla de detalle Pedidos de Compra >> TblDetallPedCompra

Nombre del Combo del Formulario Principal >> CboEstadoTotal

Con éstos datos:

Private Sub CboEstadoLinea_AfterUpdate()
'Grabamos éste registro
DoCmd.RunCommand acCmdSaveRecord
'Variables para desglosar un poco los conceptos que intervienen
Dim DistEnCamino As Integer
Dim CritPedCompra As String, CritEstadoLin As String, CritTotal As String
CritPedCompra = "RefCompra =  & Me.Parent.RefCompra
CritEstadoLin = "EstadoLinea <> 'Pedido en Camino'"
CritTotal = CritPedCompra & " AND " & CritEstadoLin
DistEnCamino = Nz(DCount("EstadoLinea","TblDetallPedCompra",CritTotal),0)
If DistEnCamino = 0 Then
    Me.ParentCboEstadoTotal = "En Camino"
End If
End Sub

Hay otras alternativas como pueden ser un ChecBox auxiliar...

No lo he probad, de modo que asegura bien los Nombres que tengas y si no funciona, me dices por favor cada uno de ellos. Si tienen acentos o están separados han de ir entre corchetes. Mis saludos >> Jacinto

Gracias Jacinto. Lo he probado cambiando los textos y me da error. Te paso mis datos

Nombre de la Referencia del Pedido de Compra >> RefCompra y texto corto

Los dos cuadros combinados son numéricos, con el id oculto para que aparezca el texto.

Al ejecutar el código me aparece este error

Adrián: De acuerdo a la imagen que pones has de cambiar >>

CritPedCompra= "RefCompra = "& Me.Parent.RefCompra
CritEstadoLin = "EstadoLinea <> 1"
 ,"[Compras - Detalles]",
'La Tabla entre Corchetes además de las comillas

Espero que ahora se resuelva >> Un saludo >> Jacinto

Adrián: Repasando mis respuestas  y donde pone el If.....End If, según tecito

If DistEnCamino = 0 Then
    Me.Parent.CboEstadoTotal = "En Camino"
End If
'Si quieres puedes añadirle un Else, con otro valor o darle color Rojo etc
'Ejemplo
If DistEnCamino = 0 Then
    Me.Parent.CboEstadoTotal = "En Camino"
Else
    Me.Parent.CboEstadoTotal = "Faltan Lineas"
    Me.Parent.CboEstadoTotal.BackColor = RGB(255,0,0)
End If  

Mis saludos >> Jacinto

Me sigue saliendo el mismo fallo

Adrián: Lo primero de todo, es asegurar de que realmente los Nombres que estás usando sean exactamente los que pones.

El Error que te daba antes era normal, porque me línea de código >>

CritPedCompra estaba mal:

'Estaba como
CritPedCompra= "RefCompra =  & Me.Parent.RefCompra  'Mal
'Y debe de ser tal como te la he rectificado
CritPedCompra= "RefCompra = "& Me.Parent.RefCompra  'Correcta siempre que el pedido sea un Número
'Si fuera un Texto
CritPedCompra= "RefCompra = '" & Me.Parent.RefCompra & "'"

Veo que si me comentabas que RefCompra era Texto Corto, con lo que es la segunda la que vale. Así tienes las dos. Para número y Texto. Un saludo >> Jacinto

Hola Jacinto ya lo he solucionado!!, pero ahora el problema es que me gustaría que cambiara el estado, ya que tengo diferentes estados. Ejemplo: Tabla compras estado: 0-Nueva, 1-Recibido, 2-En preparación, 3-En camino y Tabla Detalles estado: 0-Nueva, 1-Recibido, 2-En preparación, 3-En camino. Me gustaría que cuando fuesen todos recibido apareciese en el form recibido, ...

Adrián: Perfecto que funcione, pero para ir más a lo seguro, pega por favor aquí el código con el que lo has resuelto y te complemento con alguna línea o líneas. Saludos >> Jacinto

Private Sub CboEstadoLinea_AfterUpdate()
'Grabamos éste registro
DoCmd.RunCommand acCmdSaveRecord
'Variables para desglosar un poco los conceptos que intervienen
Dim DistEnCamino As Integer
Dim CritPedCompra As String, CritEstadoLin As String, CritTotal As String
CritPedCompra = "IdCompra = " & Me.Parent.IdCompra
CritEstadoLin = "EstadoLinea <> 1"
CritTotal = CritPedCompra & " AND " & CritEstadoLin
DistEnCamino = Nz(DCount("EstadoLinea", "[Compras - Detalles]", CritTotal), 0)

'Si quieres puedes añadirle un Else, con otro valor o darle color Rojo etc
'Ejemplo
If DistEnCamino = 0 Then
Me.Parent.CboEstadoTotal = 3
Me.Parent.CboEstadoTotal = 2
Me.Parent.CboEstadoTotal.BackColor = RGB(255, 0, 0)
End If
End Sub

Adrián: Te pongo ese código complementado.

Private Sub CboEstadoLinea_AfterUpdate()
'Grabamos éste registro
DoCmd.RunCommand acCmdSaveRecord
'Variables para desglosar un poco los conceptos que intervienen
Dim DistEnCamino As Integer, DistRecibido As Integer
Dim CritPedCompra As String, CritEstadoLin As String, CritCamino As String, CritRecibido As String
CritPedCompra = "IdCompra = " & Me.Parent.IdCompra
CritEstadoLin = "EstadoLinea <> 3"
CritCamino = CritPedCompra & " AND " & CritEstadoLin
DistEnCamino = Nz(DCount("EstadoLinea", "[Compras - Detalles]", CritCamino), 0)
If DistEnCamino = 0 Then
     Me.Parent.CboEstadoTotal = 3
     Me.Parent.CboEstadoTotal.BackColor = RGB(255,255, 255)
Else
     Me.Parent.CboEstadoTotal = Null
     Me.Parent.CboEstadoTotal.BackColor = RGB(255, 0, 0)
End If
'Ahora para contar las líneas de Recibido
'El Criterio del Pedido será el mismo, pero cambia el de la línea
CritEstadoLin = "EstadoLinea <>1"
CritRecibido = CritPedCompra & " AND " & CritEstadoLin
DistRecibido = Nz(DCount("EstadoLinea", "[Compras - Detalles]", CritRecibido), 0)
If DistRecibido = 0 Then
     Me.Parent.CboEstadoTotal = 1
     Me.Parent.CboEstadoTotal.BackColor = RGB(255,255, 255)
Else
     Me.Parent.CboEstadoTotal = Null
     Me.Parent.CboEstadoTotal.BackColor = RGB(255, 0, 0)
End If
End Sub

Espero que con ésto ya lo tengas. Un saludo >> Jacinto

Respuesta
1

Más sencillo. Supongamos que las tablas son Compras y DetalleCompra( en ella hay un campo Situacion donde se guarda le de En espera, etc) relacionadas por Idcompra. Supongamos tambien que el cuadro de texto del formulario se llama Estado, en el evento después de actualizar del combinado del subformulario puedes poner algo como

DoCmd. RunCommand acCmdSaveRecord
If DCount("situacion", "detallecompra", "situacion=""En espera"" and idcompra = " & Me.Idcompra & "") = Form.Recordset.RecordCount Then
Me.Parent!Estado = "En espera"
Else
Me.Parent!Estado = "adios"
End If

Es decir, que si todos los registros del subformulario, de esa compra en particular, son En espera, en el cuadro de texto Estado te pondrá En espera", sino, Adiós. La ventaja en que en un determinado momento un registro puede estar "en trámite" y más adelante, lo cambias por en espera y si los demás registros están En espera te cambia el cuadro Estado a En espera

Lo de situación, es que he puesto en el combinado como origen de la fila una lista de valores, pero con sustituirlo por el valor que guarda basta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas