2012-01-13 14 views
5

Tengo un sistema de seguimiento de trabajos, y hay una consulta que devuelve los resultados de todos los trabajos que están vencidos. Tengo un formulario que muestra cada uno de estos trabajos uno por uno, y tiene dos botones (el trabajo se completó y el trabajo no se completó). No completado simplemente muestra el siguiente registro. No puedo encontrar una forma de acceder al registro actual para actualizar su contenido si se presiona el botón "Ha finalizado", lo más cercano que puedo obtener es el número largo que representa la posición de registros en el formulario.Cómo actualizar directamente un registro en una base de datos desde un número de formulario (Access 2007)

El VBA para obtener el índice del registro en el formulario es el siguiente.

Sub Jobcompleted(frm As Form) 
    Dim curr_rec_num As Long 
    curr_rec_num = frm.CurrentRecord 
End Sub 

Este es mi primer tiro en VBA, y después de una hora de búsqueda no puedo encontrar nada para resolver mi problema. ¿Voy por esto de una manera completamente equivocada? Trabajando en Microsoft Access 2007

Más Info Todas las mesas están normalizados

Tabla de vehículo: Contiene vehicle_id (pk), así como rego y etc modelo

cuadro de trabajos: Contiene job_id (pk), vehicle_id (fk) y otra información sobre lo que debe suceder, así como la próxima fecha de aparición, días entre cada ocurrencia del trabajo (todos los trabajos se repiten) y otra información

Tabla de historial de trabajos: Contiene job_history_id (pk), job_id (fk), fecha de finalización y comentarios

Cuando se pulsa el botón de validación de, se debe crear una nueva entrada en la tabla de historial de trabajo con la fecha actual, los comentarios y el ID de trabajo

Este es el script que estoy tratando de conseguir

de trabajo
Private Sub Command29_Click() 
    Dim strSQL1 As String 
    Dim strSQL2 As String 
    Set Rs = CurrentRs 
    Set db = CurrentDb 

    strSQL1 = "INSERT INTO completed_jobs(JOB_ID, DATE_COMPLETED, COMMENTS) VALUES " & Rs!job.ID & ", " & Date 
    db.Execute strSQL1, dbFailOnError 
    strSQL2 = "UPDATE job SET JOB_NEXT_OCCURANCE = JOB_NEXT_OCCURANCE+JOB_RECURRANCE_RATE WHERE job.ID = Rs!job.ID" 
    db.Execute strSQL2, dbFailOnError 
End Sub 

Nota: La línea Set Rs = CurrentRs es completamente incorrecta, creo que esto es lo que necesito averiguar. Esto se llama al presionar un botón

Estoy publicando una imagen que muestra el formulario (no continuo).

@HansUp, consigo lo que está diciendo, pero yo no creo que es bastante aplicable (que no proporcionan suficiente información de primera vez para que usted entienda creo)

@sarh Creo que este conjunto de registros que se están hablando es lo que necesito, sin embargo, no puedo entender cómo usarlo, ¿alguna pista?

@Matt Estoy 90% seguro de que estoy usando un formulario encuadernado (como dije, nuevo en Access, he estado mirando todo lo que las personas han sugerido y aprendiendo sobre la marcha). Por supuesto, hay una identificación para el trabajo (simplemente no se muestra, no es necesario que esté visible), pero ¿cómo accedería a esto para realizar una operación en él? SQL que pueda hacer, la integración con Access/VBA Soy nuevo en

Form for ticking off jobs as they are completed, calls code shown

+1

"¿Voy por esto de una manera completamente equivocada?" Sospecho que puede ser, hecho correctamente, el acceso es fácil. ¿Es tu forma una forma continua? ¿Por qué no puedes tener acceso a los datos? ¿Es complicado el conjunto de registros por lo que no es actualizable? ¿Has diseñado tus tablas para incluir una identificación única? ¿Comenzó su trabajo leyendo sobre bases de datos relacionales? ¿Has visto alguna de las plantillas de acceso? – Fionnuala

+1

Por cierto, si otra persona también vota su pregunta, usted tendrá la reputación suficiente para publicar una imagen de su formulario, lo que puede ser útil, de nuevo puede que no :) – Fionnuala

+0

Voy a votar mejor por la posible carga de la imagen, también parece que está utilizando un formulario encuadernado y, por lo tanto, debería poder incluir un campo con el número único del trabajo (espero que tenga uno) y luego podría hacer referencia a este campo de texto en su SQL de actualización. –

Respuesta

2

Según entiendo su situación, su forma es enlazado a datos límite (se puede obtener índice de registro), por lo que - el formulario ya encuentra en este registro.Si necesita actualizar algún campo de la base de datos subyacente, puede escribir algo como

Me!SomeField = ... 
DoCmd.RunCommand acCmdSaveRecord 

Si su formulario ha unido al control de "SomeField", entonces la forma se actualizará automáticamente.

Si esto no ayuda, se puede ver a un par de otras direcciones:

1) Actualizar los registros utilizando el código SQL. Por ejemplo, usted tiene identificador de registro que debe actualizarse en el conjunto de formularios de datos, por lo que puede escribir algo como:

Call CurrentDB.Execute(_ 
"UPDATE SomeTable SET SomeField = SomeValue WHERE SomeTableID = " & Me!SomeTableID, dbSeeChanges) 

2) Usted puede mirar en el marcador propiedad - tanto de registros y la forma tiene esta propiedad, describe la posición de registro. Para que pueda escribir algo como esto (no es el mejor ejemplo, pero puede ayudarlo a tener una idea):

Dim Rs as Recordset 
Set Rs = Me.RecordsetClone 'make a reference copy of the form recordset 
Rs.Bookmark = Me.Bookmark 'locate this recordset to the form current record 
+0

No estoy seguro de cómo funcionan las alertas de desbordamiento de pila, pero he publicado más información sobre – StandOff

+0

@StandOff Creo que el origen de registro de su formulario contiene el campo JOB_ID, de modo que para usarlo puede escribir simplemente Me! JOB_ID (no es necesario agregar CurrentRs). Así que strSQL1 (pero sin Comentarios) lo reescribiría como "INSERT INTO completed_jobs (JOB_ID, DATE_COMPLETED) VALUES (" & Rs! Job.ID & ", Date())" – sarh

+0

Recién notado, hice un error de imprenta en el primer código snippet: debería ser Me! Somefield en lugar de Rs! Somefield, perdón, corregido. – sarh

1

Considere un enfoque más simple. Dudo que deba preocuparse por la propiedad CurrentRecord del formulario. Y no veo por qué debería necesitar un botón de comando para "Ha finalizado" y otro para "No se ha completado".

Agregue un campo de tipo de datos "Sí/No" a la tabla que utiliza la fuente de registro de su formulario. Establezca su propiedad de valor predeterminado en 0, que representa False o No. Llámelo "completion_status". Crea un nuevo formulario usando esa fuente de registro. Entonces su formulario puede tener un control de casilla de verificación para completion_status.

Los registros recién agregados tendrán False/No como completion_status --- la casilla de verificación aparecerá sin marcar. El estado de finalización para otros registros en los formularios se puede alternar entre Sí (marcado) y No (sin marcar) con el control de casilla de verificación.

+0

No estoy seguro de cómo funcionan las alertas de desbordamiento de pila, pero he publicado más información sobre – StandOff

Cuestiones relacionadas