Ayuda con la Evaluación de datos de una tabla

Buenas Tardes, Angeles: voy a intentar definir mi problema lo mejor posible. Tengo un campo en la tabla Averías que determina que uso se puede hacer del vehículo por cada avería. Ejemplo: (Avería)Fundida bombilla de Matricula (Campo "Uso") Utilizable. La opciones que tiene este campo son: Utilizable (poca importancia), Utilizable con condiciones (Importancia Media), Inutilizable (Máxima Importancia)., cada registro de avería tiene un valor de uso, de esta manera, sabemos que uso se le puede dar a un vehículo que tiene varias averías según su importancia, hasta que pueden ser reparadas. El problema es que quiero conseguir que cuando dé de alta un nuevo registro de avería y se introduzca el valor de "Uso" la base evalúe la importancia de las averías que pertenecen al vehículo y que el valor más importante, lo muestre ademas, de en el subformulario de Averías, en un cuadro de texto independiente en el formulario principal, repitiéndose la evaluación cada vez que se introduzca, modifique o elimine un registro.
Espero haber explicado mi problema de forma entendible, ya que es complicado explicarlo.
Un Saludo.
P.D.: En una pregunta que te realicé el 03/11/10, puedes ver un poco la estructura de mi base de datos, si es que todavía puedes ver respuestas anteriores, si no es así, no dudes en preguntar, estaré encantado de contestar.

1 Respuesta

Respuesta
1
Ya he visto tú otra pregunta que descarté porque me pillaste en pleno cambio de ordenador, que además me dio problemas, lo tuve que cambiar por otro y... bueno el tema se retrasó más de lo que en principio creía.
En cuanto a lo que me preguntas unas cositas:
- ¿El campo Uso es numérico y tienes los valores por ejemplo del 1 al 10 según la importancia de la avería?
- Cuando das de alta o modificas una avería ¿lo haces en un subformulario? ¿Añades o modificas por medio de un botón o el subformulario lo tienes basado en la tabla Averías?
Me cuentas.
Hola, me alegro que todo, al final, haya salido bien con el ordenador y por supuesto que estés de vuelta.
En Cuanto a las preguntas que me haces:
- El campo Uso no es numérico, pero no seria ningún problema convertilo a numérico si fuera necesario.
- Con respecto a las Averías lo hago con un Subformulario basado en la tabla Averías
Si tienes alguna pregunta más, que te pueda ayudar, no dudes
Un Saludo
Yo tendría una tabla Usos con los campos Uso y Descripción, el campo Uso lo pondría como numérico para poder ordenarlo y seleccionar el máximo (el de máxima importancia) el campo descripción sería Sin Importancia, Importancia Media, Máxima Importancia ...
Para elegir el Uso pondría un cuadro combinado Uso y en origen de la fila:
Select Uso, Descripcion from Usos order by Uso
Nº de columnas: 2
Columna dependiente: 1
En la acción al hacer clic ---> Procedimiento de evento --->
Me. Refresh
dim db as database
dim rs1 as recordset
dim rs2 as recordset
set db=currentdb
set rs1=db.Openrecordset("Select Max(Uso) as Mayor from Averias where IdAveria='" & Form!txtAveria & "'")
if not rs.eof then
set rs2=db.OpenRecordset("Select Descripcion from Usos where Uso=" & rs1!Mayor & "")
MsgBox rs2!Descripcion
End If
Siendo IdAveria el código de la avería de la tabla averías y txtAveria el cuadro de texto dónde está.
Me cuentas.
Hola Angele: he estado probando lo que me has sugerido y me da error 3061 Pocos parámetros. Se esperaba 1
He creado la tabla LISTAEstado con los campos Uso (numérico) y Descripción (Texto), dentro del formulario Principal tengo un cuadro de texto independiente "txtEstado", tengo un Subformulario "AVERIAS" y dentro de subform "Averias" el Cuadro combinado "boxEstado" con origen de la fila "Select Uso, Descripción from LISTAEstado order by Uso"
Nº de columnas: 2
Columna dependiente: 1
IdAveria el código de la avería de la tabla tblAverias y txtIdAveria el cuadro de texto dónde está dentro del Subformulario.
En la acción al hacer clic ---> Procedimiento de evento ---> "También he probado en el evento Después de Actualizar"
Me.refresh
dim db as database
dim rs1 as recordset
dim rs2 as recordset
set db=currentdb
set rs1=db.Openrecordset("Select Max(Uso) as Mayor from tblAverias where IdAveria='" & Form!boxEstado & "'")
if not rs.eof then
set rs2=db.OpenRecordset("Select Descripcion from LISTAEstado where Uso=" & rs1!Mayor & "")
MsgBox rs2!Descripcion
End If
El texto en negrita es donde me da el error tras pulsar depurar.
& Form!txtIdAveria & "'" Da el mismo error
& Form!txtEstado & "'" en el formulario principal, me dice que no encuentra el campo txtEstado
& Form![00GESTION DE AVERIAS]!txtEstado & "'" en el formulario principal, me dice que no encuentra el campo [00GESTION DE AVERIAS]!txtEstado
Un Saludo
Cuando te sale ese error es porque no encuentra algún campo de la sql.
Si el boxEstado lo tienes en el subformulario Averías tendrás que referirte a él como:
Form![Averias]. Form!boxEstado
Es decir el subformulario lo trata como un control pero le tienes que indicar que es un control del tipo formulario.
Me cuentas.
Hola Angeles: he estado probando lo que me has sugerido y me da error 2465 Gestión de Mantenimiento no encuentra el campo 'Subformulario tblAverias' al que hace referencia en la expresión.
set rs1=db.Openrecordset("Select Max(Uso) as Mayor from tblAverias where IdAveria='" & Form![Subformulario tbl2404].Form!boxEstado & "'")
He probado también a poner Formulario en lugar de Form pero también me da error 424 Se requiere un Objeto
set rs1=db.Openrecordset("Select Max(Uso) as Mayor from tblAverias where IdAveria='" & Formulario![Subformulario tbl2404].Formulario!boxEstado & "'")
He probado también ha llamar al Subformulario desde el formulario principal pero también me da error 2465
set rs1=db.Openrecordset("Select Max(Uso) as Mayor from tblAverias where IdAveria='" & Form![FORMFICHA00].Form![SubfortblReparacionesAV].Form![Subformulario tbl2404].Form!boxEstado & "'")
Un Saludo
El subformulario ¿no se llama Averías?
Si, ha sido un error, ya que en el momento que te contesté estaba tocando otra base de datos que tengo entre manos el nombre completo del subformulario, es subformAverias.
Un saludo y lo siento
Entonces... ¿Funciona?
No, No funciona
Si te parece mándame la BD (en access 2003 y comprimida si puede ser) y la echo un vistazo.
[email protected]
Hasta luego, Angeles
Hola Angeles: Perdona la tardanza, pero he estado haciendo de manitas en casa y no he podido usar el ordenador mientras he estado en casa, pero he estado revisando el código que me mandaste, por las mañanas en el curro y ahora, creo que la primera parte funciona, pero me da otro error en otra linea del código. Este es el código literal de mi base de datos, la linea en negrita es la que da el error 424 se requiere un objeto.
Private Sub boxEstado_AfterUpdate()
Me.Refresh
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Set db = CurrentDb
Set rs1 = db.OpenRecordset("Select Max(tEstado) as Mayor from tblAverias where tEstado =" & Form![boxEstado] & "")
If Not rs.EOF Then
Set rs2 = db.OpenRecordset("Select Descripcion from LISTAEstado where Uso=" & rs1!Mayor & "")
MsgBox rs2!Descripcion
End If
End Sub
Una duda que me ha surgido es, la tabla Usos, la creamos para alimentar el cuadro combinado boxEstado de la tblAverias o tienen que estar relacionada la tablas usos con tblAverias
Cuando dices; Para elegir el Uso pondría un cuadro combinado Uso y en origen de la fila:
Select Uso, Descripcion from Usos order by Uso, te refieres a l cuadro combinado de la tabla tblAverias o tengo que crear un combobox a parte de la tabla Uso.
¿Te importa, por favor, volverme a poner el código con mis datos? Ya que me gustaría entender el código y aun no lo he conseguido, ademas, me he dado cuenta, que me interesa que me evalúe solo las que no se han reparado aun, fReparado= null, te prometo que es el ultimo intento de entenderlo, y no me sale, me rindo y te mando la base.
Las Tablas que tengo creadas son:
tblVehiculo:Matricula(texto y clave principal); varios campos más
tblAverias: IdAveria(autonumerico); fAveria(fecha corta); tDescripcionAveria(texto); tDiagPOR(Texto); fAnotado(fecha corta); tTaller(texto); fReparado; nEstado(numerico)
Usos: Uso (autonumérico); Descripción: (Texto)
Los Formularios son: 00GESTIONDEAVERIAS basado en la tabla Vehículos dentro de este formulario, está el SubfortblAverias: basado en la tabla tblAverias formulario único de entrada de datos con los txtbox: txtAverias(IdAverias),... etc... fReparado y boxEstado (nEstado), dentro de este SubForm, tengo otro llamado SubfortblAveriasTotal, con todos los campos bloqueado, basado también en la tabla averías, que lo utilizo para mostrar una lista total de las que tiene.
Relaciones tblVehiculo 1 a varios tblAverias
Espero tu respuesta y siento ser tan cabezota pero no puedo evitar querer intentarlo.
Un Saludo
El cuadro combinado selUso estaría en el formulario.
El código:
'Actualizamos el formulario
Me.Refresh
'Declaramos las variables de los objetos base de datos y recordset
'Un recordset es una vista de la tabla
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset´
'Activamos la base de datos
Set db = CurrentDb
'Abrimos el 1er recordset, el que nos dá el mayor del campo Estado de la tabla averías
'cuya avería sea la que tenemos en el cuadro de texto txtAveria
set rs1=db.Openrecordset("Select Max(Uso) as Mayor from Averias where IdAveria='" & Form!txtAveria & "'")
'Si el recordset nos devuelve registros (Not rs1.Eof ---> No estamos al final del fichero)
If Not rs1.EOF Then
'Buscamos la descripción de la tabla Usos cuyo campo Uso=mayor que hemos encontrado en 'el otro recordset
set rs2=db.OpenRecordset("Select Descripcion from Usos where Uso=" & rs1!Mayor & "")
'Mándamos un cuadro de mensaje con la descripción
MsgBox rs2!Descripcion
End If
Es decir, 1º controlamos que esa avería este en la tabla Averías, si está que nos devuelva el mayor de Uso (como Uso es numérico no daría el de mayor importancia) y buscamos, con el 2º recordset la descripción que hay en la tabla Usos correspondiente a ese Uso de mayor importancia.
No sé si me he explicado bien, me cuentas, Angeles
Te mando la base de Datos. Tengo mucho que aprender aun.
En access 2003
Ya te la he vuelto a mandar, lo siento
Ya la he recibido, la tengo que estudiar, mañana te cuento.
Hola Angeles, la verdad es que funciona genial, pero me he observado, que la evaluación la realiza de todas las averías (fallo mio) ya que me interesaba que lo hiciera solo con las averías no reparadas fReparado=Null y obviara las que tienen fecha de reparación.
Un Saludo
P.D. Si ya te estoy pidiendo de más, no dudes en decírmelo, lo comprenderé perfectamente. Ya has hecho suficiente por solucionar mi problema.
Gracias
Hola Angeles. Muchas Gracias por todo, ha sido fantástico tu aporte, ya he solucionado el problema, creando una consulta en mi bd con el parámetro fReparado=Nulo, y he cambiado en el rs1 del código, la tblAverias, por la consulta CsAveria lo he probado y va genial.
Si quieres de todas maneras decirme como se haría mediante código vba, pues perfecto, me lo mandas al email y ya está, si no, como ya te dije antes ya has hecho por mi suficiente y estoy muy agradecido.
Un Saludo y de nuevo Muchas Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas