Annulla record maschera e sottomaschere

di il
1 risposte

Annulla record maschera e sottomaschere

Ciao a tutti. Questa è la maschera della situazione.

In alto c'è la casella combinata lavoro, poi c'è la casella di testo commessa e la data che fanno parte della maschera principale, mentre le altre 5 sono sottomaschere. Vorrei programmare in maniera ottimale il pulsante Annulla, il modo tale che al click annulli tutti i record inseriti fino a quel momento.Finora il suo codice su click è il seguente:

Private Sub cmdAnnulla_Click()
If MsgBox("Sei sicuro di voler annullare il rapporto?", vbYesNo) = vbNo Then
Exit Sub
End If
DoCmd.RunCommand acCmdUndo
Me.cmdAnnulla.Enabled = False
End Sub

In questo modo annullo solo i campi relativi alla maschera principale, cioè Lavoro, commessa e data. 

Come posso fare per cancellare tutti i record inseriti fino a quel momento nelle sottomaschere? Come potete vedere è predisposto un pulsante elimina che consente di eliminare il singolo record nel caso uno si accorga di un errore, ma non si vuole più redigere il rapporto allora un pulsante annulla farebbe comodo. 

Non so come riferirmi alle sottomaschere e più precisamente a quei record. Esiste una soluzione alternativa oppure c'è da fare tipo un trattato di codice? 

1 Risposte

  • Re: Annulla record maschera e sottomaschere

    Concettualmente per inserire Records lato M, quindi nella SubForm, devi avere un Record lato 1, nella Form.

    Quindi se lavori con Maschere DataBound, Connesse all'origine dati, quando inizi a provare ad inserire un dato nella SubForm, la Form ha fatto il commit quindi il SAVE per chiudere la Transazione, viene assegnata la PK se counter, e collegata come campi Master/Secondari alla SubForm e valorizzato il campo FK.

    Nella gestione DataBound quindi il processo di Modifica(sia AddNew che Edit) è transazionale, lo chiariscono gli Eventi BeforeInser/BeforeUpdate che esponendo il parametro Cancel, va ad indicare alla tranzazione aperta se fare il Commit o il RollBack.

    Quindi con Access non è fattibile in quanto non è predisposto per aprire 2 transazioni annidate(Form-SubForm), ma chiude una prima di aprire l'altra.

    Puoi invece fare un Rollback del record lato M, ma anche quì uno alla volta, se inserisci 100Records quando passi al NewRec, hai Salvato e fatto il Commit del precedente.

    Per fare quello che chiedi la gestione dei dati va modificata, e diventa più complessa in quanto invece di usare Access si usa JET direttamente sfruttando ADO o DAO, ovvero si lavora con i Recordset sia lato Form che SubForm e si apre una Transazione che annida i 2 ambienti… trovi un esempio quì, semplice ma concettualmente chiarissimo:

    http://www.databasedevelopment.co.uk/examples/FormTransaction.zip

Devi accedere o registrarti per scrivere nel forum
1 risposte