Newsgroup: it.comp.appl.access
Titolo: Sincronizzazione maschere.

DoCmd.OpenForm stDocName, , , stLinkCriteria
ho provato a spostare il codice sul click del pulsante in maschera1
lasciando sul current il codice senza l'ultima riga e, inutile
dirvelo, non funziona.
Immagino che dovrei in qualche modo testare, sul current della m1,
quando la m2 e' aperta e quindi passargli i criteri ma non so proprio
come fare.
Un grazie a chi vorrà darmi una mano, Marco.

T_A_O ha scritto:



Vedi:
http://support.microsoft.com/kb/q210060/
--
sv
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio 
news:1171903718.7...@l53g2000cwa.googlegroups.com...



Io farei così:
1) Imposto una variabile Global che dovrà contenere la chiave da ricercare
global IDdaricercare as long   'ipotizzando che l'IDArticolo da ricercare 
sia un campo numerico
2) Imposto una variabile della maschera principale che indicherà se è stata 
aperta la maschera figlia
dim mascherafigliacaricata as boolean
3) Nella routine del pulsante che apre la maschera figlia inserisco 
l'istruzione
mascherafigliacaricata = true
4) Inserisco nell'evento "su corrente" della maschera principale le seguenti 
istruzioni
if nz(mascherafigliacaricata) = true then
    IDdaricercare = me.IDArticolo
    forms("nomemascherafiglia").form.routinepersincronizzazione
end if
5) crea nella maschera figlia la routine che viene richiamata dall'evento 
"su corrente" come indicato nel punto precedente
Public sub routinepersincronizzazione
    dim rsetclone as recordset
    Set rsetclone = Me.RecordsetClone
    rsetclone.FindFirst "ID = " & IDdaricercare
    Me.Bookmark = rsetclone.Bookmark
    rsetclone.Close
    set rsetclone = nothing
end sub
Credo che dovrebbe funzionare: io ora non ho la possibilità di provare.
Ma mi domando... non potresti utilizzare una sottomaschera in modo che i 
problemi di sincronizzazione se li gestisca Access in modo nativo ?
Ciao
Antonio

antonio ha scritto:

Intanto grazie ad entrambi per la risposta. Provero' a lavorare sui
vostri suggerimenti anche se pensavo che la procedura non fosse cosi'
complessa (lo è per me ovviamente).
Non posso usare una sottomaschera per problemi di spazio, mi tocca
risolvere la cosa cosi'.
Un saluto, Marco.

 Antonio
Grazie Antonio, ciao.

T_A_O ha scritto:

Ho risolto, in modo direi indegno, ma ho risolto :)
Sul current della maschera1
Dim stDocName As String
Dim stLinkCriteria As String
stLinkCriteria = "[IDarticolo]=" & Me![IDarticolo]
stDocName = "maschera2"
If Forms("maschera2").Visible = False Then
DoCmd.OpenForm stDocName, , , stLinkCriteria, , acHidden
Else
DoCmd.OpenForm stDocName, , , stLinkCriteria, , acWindowNormal
End If
Sul click del pulsante che apre maschera2
On Error Resume Next
DoCmd.OpenForm "maschera2", , , "[IDarticolo]=" & Me![IDarticolo]
Forms("maschera2").Visible = True
End Sub
Resto ovviamente aperto a soluzioni più razionali o alla spiegazione
del metodo di Antonio.
Un saluto, Marco.

 ha scritto nel messaggio 
news:1171969649....@k78g2000cwa.googlegroups.com...
T_A_O ha scritto:


Sul current della maschera1




La soluzione che ti prospettavo io apriva maschera2 alla pressione del 
pulsante e poi rimaneva aperta, sincronizzandosi con la maschera1: quindi 
dovevi fare solo una volta il click sul pulsante per aprire maschera2.
 La soluzione tua, invece, credo che apra una nuova maschera per ogni record 
da esaminare e poi la lascia lì... se fa così credo proprio che dopo un po' 
di records esaminati le funzionalità di Access regrediranno fino a bloccarsi 
(comunque non sono sicuro, su questo computer non ho Access e non posso fare 
le prove).
Un'altra cosa: l'istruzione "If Forms("maschera2").Visible = False Then" per 
quanto ne so io, dovrebbe fare errore se la maschera non è aperta. Forse 
andrebbe meglio così:
Dim frm As Form
For Each frm In Forms
    If 
frm.name
 = "Maschera2" Then _
        If Forms("Maschera2").visible = False Then
            ...
            Exit For
        End If
Next
Per quanto riguarda Global... sì, devi inserirla in un modulo. I moduli sono 
come le routines dei singoli eventi, solo che vengono richiamati da un'altra 
parte del programma e non vengono scatenati dagli eventi. In testa al modulo 
si dichiarano le variabili globali, che rimangono impegnate per tutto 
l'applicativo. Io, per esempio, ho un modulo che ho chiamato "Funzioni di 
servizio" che è fatto più o mebo così:
Option Compare Database
Option Explicit
global i as long, j as long, k as long, l as long, m as long, n as long
global arco1 as string, arco2 as string, arco3 as string, arco4 as string
in questo modo, quando mi serve per esempio impostare un ciclo for...next, 
non devo dichiararle all'inizio, ma potrò semplicemente scrivere:
for i = 1 to 10
    for j = i + 1 to 10
        ....
    next
next
arco1, arco2, etc sono delle aree di comodo (arco è proprio l'acronimo di 
area di comodo1, etc). Come per i campi long, utilizzo queste aree per un 
appoggio momentaneo. Per esempio, invece di creare il campo stLinkCriteria 
avresti potuto utilizzare arco1.
Continuando nelle funzioni di servizio...
Global dbs As Database
Global tdfs As TableDefs
Global qdfs As QueryDefs
e poi viene una rounine vera e propria:
Public Sub VarialeopzionidiAccess ()
    Dim proprieta As String, Opzionivariate As Boolean
    Opzionivariate = False
    CambiaOpzioni "AppTitle", Titoloapplicazione, dbText, Opzionivariate
    CambiaOpzioni "AppIcon", Cartellalavoro & "\Immagine.bmp", dbText, 
Opzionivariate
    CambiaOpzioni "UseAppIconForFrmRpt", True, dbBoolean, Opzionivariate
    CambiaOpzioni "StartupForm", "M 0020-0010 Menu 1", dbText, 
Opzionivariate
    CambiaOpzioni "StartupShowDBWindow", True, dbBoolean, Opzionivariate
    CambiaOpzioni "StartupShowStatusBar", False, dbBoolean, Opzionivariate
    CambiaOpzioni "StartupMenuBar", False, dbBoolean, Opzionivariate
    CambiaOpzioni "StartupShortcutMenuBar", True, dbBoolean, Opzionivariate
    CambiaOpzioni "AllowFullMenus", True, dbBoolean, Opzionivariate
    CambiaOpzioni "AllowShortcutMenus", True, dbBoolean, Opzionivariate
    CambiaOpzioni "AllowBuiltInToolbars", True, dbBoolean, Opzionivariate
    CambiaOpzioni "AllowToolbarChanges", True, dbBoolean, Opzionivariate
    CambiaOpzioni "AllowBreakIntoCode", True, dbBoolean, Opzionivariate
    CambiaOpzioni "AllowSpecialKeys", True, dbBoolean, Opzionivariate
    If Opzionivariate = True Then
'        dbs.Properties.Refresh
        MsgBox "Si è reso necessario variare alcune opzioni di Access." & 
vbCrLf & _
                "Affinchè queste possano essere attivate, bisogna chiudere " 
& _
                "l'applicazione e farla ripartire.", , Titoloapplicazione
        Chiusuraforzata = True
        Application.Quit
    End If
end sub
Public Sub CambiaOpzioni(Opzione As Variant, Valore As Variant, _
                            Tipoparametro As Variant, SwVariata As Boolean)
    Dim PrpNew As Property
    Set dbs = CurrentDb
    Codicinonerrore = "3270;"
    Erroreoccorso = 0
    dbs.Properties(Opzione).Value = dbs.Properties(Opzione).Value
    If Erroreoccorso = 0 Then
        If dbs.Properties(Opzione).Value <> Valore Then
            dbs.Properties(Opzione).Value = Valore
            SwVariata = True
        End If
    Else
        Set PrpNew = dbs.CreateProperty(Opzione, Tipoparametro, Valore)
        dbs.Properties.Append PrpNew
        SwVariata = True
    End If
End Sub
Su Apertura della maschera "M 0020-0010 Menu 1" c'è l'istruzione 
"VarialeopzionidiAccess"
Codicinonerrore ed Erroreoccorso ed altri campi vengono gestiti da altre 
routines che non allego per non appesantire la risposta.
[OT] Non so se la febbre alta che mi ha immobilizzato a casa mi ha fatto 
scrivere corbellerie... eventualmente, porta pazienza verso uno che scrive 
quasi dall'aldilà.
Ciao
Antonio

 - Mostra testo tra virgolette -
Ti avevo scritto un messaggio lungo e articolato oggi pomeriggio e
google nuovo (che proprio non mi va giù...) prima mi ha detto che era
inviato correttamente e poi lo ha perso chissà dove...
Non riesco a risponderti ora, per il momento ti faccio i miei migliori
auguri di pronta guarigione e grazie per il tuo aiuto.
Marco.

 Antonio
Spero che si riesca a trovare una soluzione, un grande saluto, Marco.

 Antonio

Ciao Marco.
Ho dovuto correggere il richiamo della routine perchè quella sintassi è 
valida solo per le sottomaschere. In generale, comunque, il procedimento è 
quello che ti avevo indicato l'altra volta. Ho provato il tutto e a me 
funziona. Ecco il codice con qualche commento se necessario:
1) Ho creato un Modulo1 così fatto:
Option Compare Database
Option Explicit
Global IDdaricercare As Long
2) Ho creato una maschera "M sincronizzazione 1" con questo codice:
Option Compare Database
Option Explicit
Dim mascherafigliacaricata As Boolean
Dim frm As Form
Private Sub Form_Current()
    If Nz(mascherafigliacaricata) = True Then
        IDdaricercare = Me.ID
'        Forms("M sincronizzazione 2").Form.routinepersincronizzazione
        frm.routinepersincronizzazione
    End If
End Sub
Private Sub ApriMaschera2_Click()
    DoCmd.OpenForm "M sincronizzazione 2"
    mascherafigliacaricata = True
    Set frm = Forms("M sincronizzazione 2")
End Sub
3) Ho creato una maschera "M sincronizzazione 2" (basata sulla stessa 
origine dati dell'altra maschera) con questo codice:
Option Compare Database
Option Explicit
Public Sub routinepersincronizzazione()
'Stop
    Dim rsetclone As Recordset
    Set rsetclone = Me.RecordsetClone
    rsetclone.FindFirst "ID = " & IDdaricercare
    Me.Bookmark = rsetclone.Bookmark
    rsetclone.Close
    Set rsetclone = Nothing
'MsgBox "ID = " & Me.ID
End Sub
In questo "poco" codice ci sono, comunque, delle cose da aggiustare.
Primo (forse non è necessario, ma di sicuro è prudente): fai un controllo 
che quando è stata aperta la seconda maschera, anche se viene fatto un altro 
click sul pulsante non viene riaperta (magari potresti anche nascondere il 
pulsante stesso).
Secondo: Se la seconda maschera viene chiamata non all'inizio dei records, 
appena viene aperta visualizza il primo record, che non è quello della prima 
maschera...
Sarebbe opportuno anche controllare che la lettura del record nella routine 
sia andata a buon fine. In caso contrario non fare l'assegnazione del 
bookmark che risulta non impostato.
A te il compito di completare queste cose.
Un ultimo suggerimento:
nella routine richiamata avevo messo uno STOP (che poi ho invalidato) per 
fare fermare il programma e farlo proseguire "passo-passo" con l'uso del 
tasto F8. Mentre lo eseguo passo-passo visualizzo la finestra immediata 
(Control G) per poter controllare lo stato delle variabili e degli oggetti 
mentre vengono valorizzati. Questo sistema è molto utile, anche perchè se 
andando avanti passo passo si verifica un errore, hai la possibilità nella 
finestra immediata di sperimentare altre forme dell'istruzione che è incorsa 
in errore.
Buona continuazione
Antonio

 3) Ho creato una maschera "Msincronizzazione2" (basata sulla stessa

Ciao antonio, intanto non so davvero come ringraziarti per l'aiuto che
mi stai dando e per la tua pazienza.
Sono tornato a casa in questo momento e quindi in internet dall'ultima
volta che ti ho scritto ed ho cercato subito la tua risp che per
fortuna c'era e, quanto mai esaustiva :)
Non riesco ad applicarmici in questo momento perchè ho avuto una
sveglia alle 3.45 stamattina ma, non appena potrò, mi divorerò i tuoi
suggerimenti e cercherò di capire i passaggi della tua soluzione (se
riesco a far funzionare tutto ne sarei felicissimo :)
Un saluto a te e a tutte le brave persone di questo NG.

 ha scritto nel messaggio 
news:1172341198.2...@m58g2000cwm.googlegroups.com...


Da parte mia sono convinto che la gentilezza e la cortesia siano qualità 
indispensabili nella vita ed anche per frequentare un newsgroup. Purtroppo 
la maggior parte delle volte si trovano più facilmente arroganza e 
strafottenza. Non è certamente il caso tuo. Continua così e sono convinto 
che anche i tuoi programmi avranno un qualcosa di signorilità che sarà 
apprezzato.
Ciao
Antonio