Newsgroup: it.comp.appl.access
Titolo: Transazioni e Sottomaschere

Vorrei aggiungere la funzionalita' di Annulla nelle mie maschere.
Nelle maschere in cui c'e' una sottomaschera (il classico Ordine-Dettagli
Ordine) il semplice ingresso nella sottomaschera provoca un update della
maschera principale.
Ogni record aggiunto nella sottomaschera provoca l'update di quello aggiunto
in precedenza.
In generale ci si aspetta che la pressione del tasto annulla tolga
completamente l'immissione dei dati dell'ordine, e questo non riesco a farlo
con Me.Undo o simili, dato che il record si trova gia' sul server a causa
degli update forzati.
La questione e' complessa nel senso che se il dettaglio dell'ordine e' stato
aggiunto allora un annulla dovrebbe rimuoverlo, ma se e' stato semplicemente
modificato allora bisognerebbe annullare la modifica. Il dettaglio
dell'ordine, in entrambi i casi, risulta *salvato* e assolutamente identico.
L'idea sarebbe allora di incapsulare tutta l'operazione del record della
maschera principale e dei record della sottomaschera in una transazione, in
modo da fare un rollback su annulla e un commit su ok. Il problema e': come
si puo' fare una cosa di questo genere?
Forse la soluzione potrebbe venire anche dai batch, ma ancora una volta,
come?
Qualcuno e' interessato a discutere dell'argomento?
Grazie per l'attenzione, Luca



 ha scritto nel messaggio
news:P9iG6.7962$sb5.8...@news.infostrada.it...

Ciao a tutti.
Anch'io sono interessato al problema, anzi aggiungo un altro elemento: cioè
andrebbe al limite bene la transazione se si riuscisse a limitarla agli
inserimenti/modifiche fatti nella maschera/sottomaschera ordini.
Ma se io - nel bel mezzo di questa transazione - aggiorno qualche altra
tabella (per esempio l'anagrafico articoli), poi se annullo la transazione
perdo anche le modifiche all'anagrafico articoli. È così, vero?
Grazie e ciao.
--
Alberto

 Alberto
Dato che la domanda l'ho postata io non dovrei dire nulla ;-)
Credo pero' che la transazione sia legata alla connessione, se tutti i
recordset sono appoggiati
su un'unica connection allora il rollback li annulla tutti, pero' se sono su
connection diverse
dovresti annullare solo quello che vuoi. In sql diventerebbe:
BEGIN TRANSACTION
    UPDATE Ordini ...
    INSERT INTO DettagliOrdini
    INSERT INTO Articoli
    ROLLBACK
END TRANSACTION
questa annulla tutto.
Pero' :
BEGIN TRANSACTION
    UPDATE Ordini
    INSERT INTO DettagliOrdini
    ROLLBACK
END TRANSACTION
BEGIN TRANSACTION
    INSERT INTO Articoli
    COMMIT
END TRANSACTION
questo annulla solo gli ordini.
Mi viene anche da dire che un utente che preme annulla potrebbe essere
d'accordo ad annullare tutto, credo che il comportamento piu' corretto
sarebbe questo.
Piuttosto IMHO ci sono problemi ad annullare solo gli ordini, perche' se
l'ordine prima non esisteva (caso INSERT, non UPDATE) i dettagli
resterebbero orfani.
Un' altra cosa strana e': se la maschera e' Singola ma con spostamento
record, annulla dovrebbe (come penso io) annullare tutti i cambiamenti fatti
a tutti i record dei vari ordini dall'apertura della maschera, oppure solo
di quello corrente?
Al limite, un pulsante di Annulla che annulla tutto e chiude la maschera, e
uno di ripristina che rimette a posto il record corrente ma lascia la
maschera aperto. Temo, pero' nella fantasia delle segretaria :-(
Idee? Commenti?
P.S. Mi sa che per ottenere questi comportamenti occorrerebbe lavorare solo
su maschere non associate, ma non ho ancora capito bene come si fa... Qui ci
vorrebbe SuperRoberto!


--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 Roberto
Luca