Modificación de código en access 2007

Me surge un problema que seguro sera de facil solucion pero yo al menos no lo consigo.

En mi BD para la gestion de un criadero de animales tengo dos tablas una TDatos_Machos y otra TDatos_Variedad_Ventas.

El Formulario basado en la tabla TDatos machos tiene un grupo de opciones, en criadero=1 vendido=2 etc que se guarda el valor en el campo "Estado"

En otra tabla llamada compradores tiene insertado un subformulario basado en la tabla TDatos_Variedad_Ventas y relacionados, en este subformulario (formularios continuos) hay un combo NAnillaCompleta filtrado por una consulta donde muestra los animales en venta y si eliges uno pues en el siguiente registro ya no aparece, para saber los animales que quedan disponibles..

Bueno el problema viene por que lo que quiero es que por ejemplo en el evento al perder el foco del Cuadro combinado si elijo un animal logicamente estaria vendido entonces al perder el foco si el campo NAnillaCompleto_Macho de la tabla TDatos_Machos coincide con el valor del combo NAnillaCompleta de la tabla TDatos_Variedad_Ventas fuese a la tabla TDatos_Machos y me cambiase cualquier valor existente del campo "Estado" por el valor 2 (vendido). Y si borro el numero del combo me vuelva a cambiar el valor el "Estado" a 1

Lo he intentado con este codigo pero solo me cambia el primer registro aunque no lo hayas elegido en le combo

Private Sub cboAnillaAñoCompleta_LostFocus()
Dim NAnilla, NAnillaB As Variant
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
'Definimos las variables
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("TDatos_Machos", dbOpenTable)
NAnilla = Me.cboAnillaAñoCompleta.Value 'valor del combo formulario
NAnillaB = DLookup ("[NAnilla_Año_MachoCompleta]","TDatos_Machos","[NAnilla_Año_MachoCompleta]='" & NAnilla & "'")
If IsNull(NAnilla) Then Exit Sub
If NAnillaB = NAnilla Then
With rst
.Edit
.Fields("Estado_Macho").Value = "2"
.Update
End With
End If
rst.Close
dbs.Close
Set rst = Nothing
Set dbs = Nothing
End Sub

La parte en negrita va toda seguida claro...

Respuesta
1

Tu error está en que antes de editar el recordset tienes que buscar el registro que quieres editar (imagino que por el campo NAnilla_Año_MachoCompleta). Sería algo así:

With rst

.FindFirst "[NAnilla_Año_MachoCompleta]=" & NAnilla
.Edit
.Fields("Estado_Macho").Value = "2"
.Update
End With

Lo que sí, comentarte que este código lo único que hace es cambiarte el Estado del macho correspondiente a 2, pero no te lo pone de nuevo a 1 si borras el combo.

Para eso tendrías que hacerlo de otra manera, por ejemplo, recorriendo todos los registros de la tabla TDatos_Machos, con un recordset, y comprobando si el NAnilla está en la tabla

De ventas. Si está, editas el registro para ponerle Estado=2, y si no lo está, lo editas para ponerle 1.

hola de nuevo Sveinbjorn je je cuantas cosas me vas a solucionar....

vale a ver si puedo probar lo que me dices, porque ahora si veo el codigo mejor ...yo queria llevarlo al registro coincidente pero no he podido, con .FindFirst "[NAnilla_Año_MachoCompleta]=" & NAnilla lo veo mas claro,.

si ya se que falta codigo para la segunda opcion de borrado, como tendria que modificarlo?

Perdona,, se me olvido parece que sigue dando error comentarte que los campos son tipo texto incluso el valor de estado es tipo texto

OK, si el campo es tipo texto, tienes que ponerlo entre comillas simples:

.FindFirst "[NAnilla_Año_MachoCompleta]='" & NAnilla & "'"

Disculpa, que no me di cuenta al ponerlo...

El otro código te lo pongo a la tarde, que ahora ando liadillo, jeje

Al final saqué un ratillo... XD

Veamos, si tus tablas son las dos que comentas (TDatos_Machos y TDatos_Variedad_Ventas) las que guardan los datos de los formularios/subformularios que comentas, en el evento Al perder el enfoque del combo cboAnillaAñoCompleta (o si tienes un botón guardar, lo puedes poner en el), le pones este código:

Dim rst as DAO.Recordset

Set rst=CurrentBD.OpenRecordset("TDatos_Machos", dbOpenDynaset)

if rst.RecordCount=0 Then Exit sub 'Si no hay datos, sales

'Primero hay que guardar el registro, para que se actualicen los datos de la tabla

DoCmd. RunCommand acCmdSaveRecord

'Recorremos los registros de la tabla Machos

Rst. MoveFirst

Do Until rst.EOF

Rst. Edit

'Miramos si la

If DCount("NAnilla_Año_MachoCompleta","TDatos_Variedad_Ventas","[NAnilla_Año_MachoCompleta]='" & rst("NAnilla_Año_MachoCompleta") & "'")=0 Then

rst("Estado_Macho")=2

Else

rst("Estado_Macho")=1

End If

rst.Update

rst.MoveNext

Loop

rst.Close

Set rst=Nothing

Puntualizaciones, he supuesto que en las dos tablas, el campo anilla se llama igual (NAnilla_Año_MachoCompleta), pues no se los nombres de los campos en las tablas.

Si no lo son tendrás que cambiarlos en la función DCount:

DCount("NombreCampoTablaVentas", "TDatos_Variedad_Ventas", "[NombreCampoTablaVentas]='" & rst("NombreCampoTablaMachos") & "'")

Si tienes un campo "Eliminado" en la tabla, puedes hacer más rápido el proceso si abres el recordset sólo sobre los Machos "activos":

Set rst=CurrentBD.OpenRecordset("SELECT * FROM TDatos_Machos WHERE Eliminado<>True", dbOpenDynaset)

Hola, he probado el codigo, pero tengo una duda este ultimo hace las dos funciones o hay que añadir el primero junto con este ultimo. si es asi no tengo ni idea de como hacerlo.

si este ultimo codigo realiza las dos funciones, hay error en algo y te explico:

en el combo del subformulario eligo un NAnilla y supuestamente al perder el enfoque en la tabla TDatos_Machos el campo "estado" deberia haber cambiado a valor 2 y todos los demas sin cambios pero pasa lo siguiente el registro elegido se queda con valor 1 y me cambia todos los registros a valor 2. al reves de lo que deberia hacer.

despues si elimino NAnilla del combo (elimino el registro claro) en el subformulario, en la tabla TDatos_Machos el campo "estado" de ese registro se cambia a valor 2 (deberia ser 1) y me deja todos los demas como estaban osea con valor 2 sin cambios.

y si entro en el formulario ventas selecciono el combo del subformulario y lo dejo vacio osea no selecciono ningun Nanilla o lo que es lo mismo, No activo el registro, al perder el enfoque me cambia todos los valores del campo "estado" de la tabla TDatos_Machos a 2 cuando no deberia modificar nada.

a ver que te parece

perdon otra vez te dejo el codigo tal y como esta ahora:

Private Sub cboAnillaAñoCompleta_LostFocus()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("TDatos_Machos", dbOpenDynaset)
If rst.RecordCount = 0 Then Exit Sub 'Si no hay datos, sales
'Primero hay que guardar el registro, para que se actualicen los datos de la tabla
DoCmd.RunCommand acCmdSaveRecord
'Recorremos los registros de la tabla Machos
rst.MoveFirst
Do Until rst.EOF
rst.Edit
'Miramos si la
If DCount("NAnilla_Completa_VentaMacho", "TSub_Variedad_Ventas_Machos", "[NAnilla_Completa_VentaMacho]='" & rst("NAnilla_Año_MachoCompleta") & "'") = 0 Then
rst("Estado_Macho") = 2
Else
rst("Estado_Macho") = 1
End If
rst.Update
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub

El código lo tienes que poner sustituyendo al anterior.

Acabo de darme cuenta de que te puse los valores (1 y 2 ) al revés...

¿Sería posible que me pasaras una copia de tu BD, al menos con las dos tablas y formularios que intervienen en esta consulta, y así, al poder hacer pruebas yo te doy una solución acertada 100%?

Si....no hay problema pero no puedo pasartela hasta la noche

Sveinbjorn no es necesario enviarte la BD le he echado un rato para probar el codigo cambiando los valores, y !funciona perfectamente¡ muchas gracias por tu ayuda, simplemente comentarte que me salio un error en el codigo concretamente en esta linea que lo veras rapidamente, bueno a mi costo unos 10 minutos verlo.

Set rst = CurrentDb.OpenRecordset("TDatos_Machos", dbOpenDynaset)

muchas gracias por todo maestro, mi BD va avanzando y queda mas profesional. un saludo y hasta la proxima que seguro será pronto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas