Newsgroup: it.comp.appl.access
Titolo: Requery maschera da subform dopo copia/incolla record

Buongiorno a tutti,
 
nel database su cui sto lavorando ho una maschera a schede:
 
Scheda 1: Mainform
Scheda 2: Sottomaschera 1 + Sottomaschera 1a (dipendente dalla 1)
Sulla sottomaschera 1 ho un pulsante che mi permette di duplicare il
record delle sottomaschere 1 + 1a. Per fare questo uso il codice
fornito qui:
 
http://allenbrowne.com/ser-57.html
 
 
-------
Private Sub cmdDupe_Click()
'On Error GoTo Err_Handler
    'Purpose:   Duplicate the main form record and related records in
the subform.
    Dim strSql As String    'SQL statement.
    Dim lngID As Long       'Primary key value of the new record.
 
    'Save any edits first
    If Me.Dirty Then
        Me.Dirty = False
    End If
 
    'Make sure there is a record to duplicate.
    If Me.NewRecord Then
        MsgBox "Select the record to duplicate."
    Else
        'Duplicate the main record: add to form's clone.
        With Me.RecordsetClone
            .AddNew
                !CustomerID = Me.CustomerID
                !EmployeeID = Me.EmployeeID
                !OrderDate = Date
                'etc for other fields.
            .Update
 
            'Save the primary key value, to use as the foreign key for
the related records.
            .Bookmark = .LastModified
            lngID = !OrderID
 
            'Duplicate the related records: append query.
            If Me.[Orders Subform].Form.RecordsetClone.RecordCount > 0
Then
                strSql = "INSERT INTO [Order Details] ( OrderID,
ProductID, Quantity, UnitPrice, Discount ) " & _
                    "SELECT " & lngID & " As NewID, ProductID,
Quantity, UnitPrice, Discount " & _
                    "FROM [Order Details] WHERE OrderID = " &
Me.OrderID & ";"
                DBEngine(0)(0).Execute strSql, dbFailOnError
            Else
                MsgBox "Main record duplicated, but there were no
related records."
            End If
 
            'Display the new duplicate.
            Me.Bookmark = .LastModified
        End With
    End If
 
Exit_Handler:
    Exit Sub
 
Err_Handler:
    MsgBox "Error " & Err.Number & " - " & Err.Description, ,
"cmdDupe_Click"
    Resume Exit_Handler
End Sub
----
 
Il problema è che io mi trovo nella necessità di dover a volte legare
il nuovo record della sottomaschera ad un diverso record della
mainform.
Ho modificato il codice e adesso passo il legame tra maschera e
sottomaschera e la chiave primaria della sottomaschera tramite
inputbox.
Il sistema così funziona e ottengo il mio bel nuovo record, però
ovviamente fino a quando la non chiudo e riapro la maschera non vedo
il nuovo record della sottomaschera legato al record principale
corretto, lo vedo accodato al record da cui ho fatto copia/incolla.
Nessun problema, per me, ma chi lo deve usare vuole vedere subito il
risultato corretto.
 
C'è un modo per ovviare a questo inconveniente?
L'unica cosa che mi viene in mente è comandare da sottomaschera il
requery della mainform e poi riportare il focus sulla sottomaschera,
sullo stesso record su cui stavo lavorando, ma i risultati che ho
ottenuto sono nulli (beh, ho incartato la maschera 3 volte e ho
cancellato metà dei dati, ma non credo si possa definire un
successo :-), che bella cosa i backup ^_^).
 
Avete qualche suggerimento?
 
Spero che la mia spiegazione non sia troppo fumosa e vi ringrazio in
anticipo per l'aiuto
 
Grazie
Erika
 

Ciao!
 
Scusa la domanda (stamattina faccio fatica a svegliarmi!) ma ... perché fare la requery della form principale se il tutto sta in una subform?
 
Farai, semmai, la requery della subform stessa :)
 
HTH
Popi


La requery della mainform mi serve quando io cambio il record della
maschera principale cui è legato il nuovo record.
 
Esempio (da lunedì mattina):
Record Mainform = Paperino
I Record della Subform sono = Qui + Quo + Qua
Se io copio Qui e lo chiamo Gastone e lo lascio come subrecord di
Paperino va tutto bene.
Il codice che uso fa già l'update della subform e vedo il dato.
 
            'Display the new duplicate.
            Me.Bookmark = .LastModified
        End With
 
Il mio problema è se io il record Gastone non lo voglio legare a
Paperino, ma a Topolino.
A quel punto io Gastone lo vedo sempre sotto a Paperino fino a quando
non chiudo e riapro la maschera.
 
Ciao!
Erika

Capito!
 
A fine lavoro (e solo se il record è stato realmente duplicato) prima della exit sub ti salvi le tue chiavi in variabili globali della maschera, poi imposti il timer della form principale a 100.
 
Nella form gestisci l'evento ontimer che, nell'ordine:
- reimposta timer a 0,
- fa la requery della form principale,
- usando le chiavi salvate in precedenza si riposiziona sul record che avevi attivo.
 
HTH
Popi


Purtroppo non è proprio quello che volevo fare. Il requery dev'essere
immediato. E comunque fatto in questo modo non mi serve, anche perché
io mi trovo sulla sottomaschera, non sulla maschera principale.
Stasera proverò con alcuni moduli che ho trovato (per l'aggiornamento
automatico di tutte le form aperte) per l'update.
Comunque grazie!
Erika

Immediato???
Vabbè, ho impostato il delay a 100 millisecondi, ma se per te un decimo di secondo non è abbastanza immediato puoi anche metterlo a 50 ...
 
Per il resto, se nella SUBFORM (dove fai la duplicazione del record) imposti il timer della FORM principale e nella FORM principale, nell'evento timer, fai tutte le requery che ti pare e poi ti riposizioni nel record che era corrente nella FORM e nella FORM ... cosa c'è di diverso con quello che chiedevi?
 
HTH
Popi

 B1
 
Nella mia vbignoranza, la mia idea sarebbe stata di aggiungere una
serie di comandi a fine routine per fare il requery della form e poi
tornare sul record della subform appena inserito.
 
Ciao e grazie
Erika

Ciao Erika.
 
Dato che il caso 1 non dà problemi, facciamo riferimento al solo caso 2.
 
Quando scrive il nuovo record B1, il sistema ha evidentemente conoscenza tanto di "B" quanto di "1", cioè di tutte le chiavi che servono per identificarlo.
 
Quindi, adeguando quanto già ti suggerivo, nell'evento timer della form principale dopo la requery dovrai riposizionarti sul record "B" padre del "B1" appena creato .
 
Vorrei poter essere più chiaro e meno astratto, ma senza altre info sul resto del codice che stai usando mi riesce difficile.
 
Oltretutto con tali info si potrebbe scoprire un modo per fare ciò che chiedi senza usare il timer (che, peraltro, io stesso ho usato ed uso da parecchio tempo in molte situazioni senza problemi).
 
HTH
Popi


Se la maschera che hai visualizzata è una master-details (come mi
sembra), tu fai pure tutte le tue operazioni di inserimento, alla fine
di tutto non devi fare requery e poi gotorecord o cose simili. Componi
la tua bella stringa SQL (SELECT * FROM.....WHERE Id=NuovoIdInserito)
e piazzi il recordsource della form con il tuo nuovo SQL
E lei si apre dove deve e senza storie


E qui mi sono persa ^_____^;;;;
Vado a studiare l'help!

 - Mostra testo citato -
 
Quando tu apri una maschera master-details ha cmq 2 stringhe sql che
sottendono le form no?

 sottendono le form no?
 
Sì. Però... queste cose non sono il mio forte... specialmente se devo
andare a richiamare la mainform dalla subform.
 
E comunque come base della form ho delle tabelle, non delle query,
quindi complica le cose, o sbaglio?
 
Grazie, comunque!
Erika
 
 


Nel tuo caso query o tabella è lo stesso in pratica (ma NON in
teoria!!!!!) Nn dovresti MAI e poi MAI usare le tabelle per alimentare
le form!!!!! Ci sono le qry apposta!!!! Poi cmq access fa una query
per visualizzare la tabella......quindi.....
Nella casellina Record source della finestra delle proprietà dove hai
messo il nome della tabella basta sostituire un SELECT * FROM
TuaTabella e nn cambia nulla.
Cmq, la procedura è una cosa del genere
Sull'evento Load della main metti la stringa SQL che ti interessa
assegnandola al recordsource
 
(una cosa tipo
if me.OpenArgs = "" then
StrSql="SELECT....."
Me.Recordsource=StrSql
else
Me.Recordsource=Me.OpenArgs).
 
La subform la basi invece su una qry fissa (lo scrivi nella casellina
delle proprietà della sub).
Per esempio la MAIN la apri con questa procedura:
 
StrSql="SELECT.....WHERE ID=XXX"
DoCmd openform "TuaForm",,,,,,, StrSql
 
e lui ti apre la maschera al record voluto (StrSql è OpenArgs, nn ho
contato le virgole ma è quello)
 
Quando fai i tuoi copia/incolla, alla fine fai esattamente la stessa
cosa. Definisci la stringa SQL usando come WHERE l'OpenArgs appena
passato e fai un openform. vedrai che funziona e nn avrai problemi.
Questa cosa si può raffinare (e molto) ma il succo è questo

 per visualizzare la tabella......quindi.....
 
Sì, ma se la mia maschera mi serve per inserire dei dati nella
tabella, perché devo andarmi a complicare la vita con le query?
Sono due form di inserimento dati.
Poi ho delle altre form, che uso solo per ricercare e visualizzare i
dati e quelle sì che sono basate su query, ma nel momento in cui devo
andare ad inserire i dati in tabella...
Nel mio caso alimento la tabella dalla form, non viceversa.
 
Grazie
Erika