2012-01-13 4 views
5

Ho un sistema di tracciabilità del lavoro, e c'è una query che restituisce i risultati di tutti i lavori che sono in ritardo. Ho un modulo che visualizza ciascuno di questi lavori uno alla volta e ha due pulsanti (il lavoro è stato completato e il lavoro non è stato completato). Non completato mostra semplicemente il prossimo record. Non riesco a trovare un modo per accedere al record corrente per aggiornarne il contenuto se viene premuto il pulsante "È stato completato", il più vicino che posso ottenere è il numero lungo che rappresenta la posizione dei record nel modulo.Come aggiornare direttamente un record in un database da un numero di modulo (Access 2007)

Il VBA per ottenere l'indice del record nel modulo è il seguente.

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

Questo è il mio primo colpo a VBA, e dopo un'ora di ricerche non riesco a trovare nulla per risolvere il mio problema. Sto andando in questo modo completamente sbagliato? Lavorare in Microsoft Access 2007

Ulteriori informazioni Tutte le tabelle sono normalizzati

Tabella veicolo: Contiene vehicle_id (PK), così come Rego e il modello ecc

tabella di lavoro: Contiene job_id (PK), vehicle_id (fk) e altre informazioni su ciò che deve accadere, nonché la prossima data di occured, giorni tra ogni occorrenza del lavoro (tutti i lavori ripetuti) e altre informazioni

Tabella cronologia lavori: contiene job_history_id (pk), job_id (fk), data di completamento e commenti

Quando si preme il pulsante di completamento del lavoro, dovrebbe creare una nuova voce nella tabella della cronologia lavoro con la data corrente, eventuali commenti e l'ID del processo

Questo è lo script che sto cercando di ottenere

lavoro
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 riga Set Rs = CurrentRs è completamente errata, credo che sia ciò che devo capire? Questo viene chiamato pulsante-premere

Sto postando un'immagine che mostra il modulo (non continuo).

@HansUp, ho capito quello che stai dicendo, ma io non penso che sia abbastanza applicabile (non ho fornire informazioni sufficienti prima volta intorno per voi capire credo)

@sarh Credo che questo Recordset che si stiamo parlando di ciò di cui ho bisogno, tuttavia non riesco a capire come usarlo, qualche suggerimento?

@Matt Sono sicuro al 90% che sto utilizzando un modulo associato (come ho detto, nuovo per Access, ho esaminato tutto ciò che le persone hanno suggerito e l'apprendimento mentre procedo). C'è ovviamente un ID per il lavoro (solo che non è mostrato, non è necessario essere visibile), ma come potrei accedervi per eseguire un'operazione su di esso? SQL che posso fare, l'integrazione con Access/VBA Sono un

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

+1

"Sto andando in questo modo completamente sbagliato?" Sospetto che tu possa essere, fatto correttamente, l'accesso è facile. La tua forma è una forma continua? Perché non puoi accedere ai dati? Il tuo recordset è complicato, quindi non è aggiornabile? Hai progettato le tue tabelle per includere un ID univoco? Hai iniziato il tuo lavoro leggendo i database relazionali? Hai esaminato uno dei modelli di accesso? – Fionnuala

+1

BTW se un'altra persona fa valere la tua domanda, avrai abbastanza reputazione per pubblicare un'immagine del tuo modulo, il che potrebbe essere utile, quindi ancora una volta non lo è :) – Fionnuala

+0

Venerò per il possibile caricamento dell'immagine, inoltre sembra che si utilizza un modulo associato e pertanto dovrebbe essere possibile includere un campo con il numero univoco del lavoro (spero che ne abbia uno) e quindi è possibile fare riferimento a questo campo di testo nell'aggiornamento SQL. –

risposta

2

quanto ho capito la tua situazione, il modulo è associato a dati legato (si può ottenere indice del record), quindi - il modulo già trova su questo disco.Se è necessario aggiornare qualche campo di set di dati di base, è possibile scrivere qualcosa di simile a

Me!SomeField = ... 
DoCmd.RunCommand acCmdSaveRecord 

Se il modulo è controllo associato a "SomeField", quindi il modulo verrà aggiornato automaticamente.

Se questo non vi aiuterà, si può guardare a un paio di altre direzioni:

1) aggiornare i record utilizzando il codice SQL. Ad esempio, si dispone di ID di record che dovrebbe essere aggiornato nel set di dati del modulo, in modo da poter scrivere qualcosa di simile:

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

2) Potete guardare la proprietà Bookmark - sia Recordset e forma ha questa proprietà, descrive la posizione del record. Quindi puoi scrivere qualcosa del genere (non il migliore esempio, ma può aiutarti a farti un'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

Non sono sicuro di come funzionano gli avvisi di Overflow dello stack, ma ho postato più informazioni sopra – StandOff

+0

@StandOff I sorgenti di record del modulo contengono il campo JOB_ID, quindi per utilizzarlo è possibile scrivere solo io! JOB_ID (non è necessario aggiungere CurrentRs). Quindi strSQL1 (ma senza commenti) vorrei riscrivere come "INSERT INTO completed_jobs (JOB_ID, DATE_COMPLETED) VALUES (" & Rs! Job.ID & ", Date())" – sarh

+0

Appena notato, ho fatto un refuso nel primo codice snippet: dovrebbe essere Me! SomeField invece di Rs! SomeField, mi dispiace, corretto. – sarh

1

Considerare un approccio più semplice. Dubito che sia necessario preoccuparsi della proprietà CurrentRecord del modulo. E non vedo perché dovresti avere bisogno di un pulsante di comando per "È stato completato" e un altro per "Non è stato completato".

Aggiungere un campo "Tipo di dati Sì/No" alla tabella utilizzata dall'origine record del modulo. Imposta la proprietà del valore predefinito su 0, che rappresenta False o No. Chiamalo "completion_status". Crea un nuovo modulo usando quella fonte record. Quindi il tuo modulo può avere un controllo casella di controllo per completion_status.

I nuovi record aggiunti avranno False/No come stato_finizione --- la casella di controllo apparirà deselezionata. Il completamento_stato per altri record nei moduli può essere alternato tra Sì (selezionato) e No (deselezionato) utilizzando il controllo casella di controllo.

+0

Non so come funzionano gli avvisi Stack Overflow, ma ho postato più informazioni – StandOff