Newsgroup: it.comp.appl.access
Titolo: Sincronizzazione fra form separate con due chiavi primarie e apertura 2^ form da pulsante di comando

Access XP /2003
Ciao a tutti e buona domenica
Problema:
La  sincronizzazione che vorrei fare è fra la form denominata "f1" 
(collegata alla tabella denominata "Tab1" dove vengono scaricati i dati di 
base) e "f2" collegata alla Tab2 dove dovrebbero essere scaricati i dati 
inseriti nei vari record correlati. La correlazione che dovrei fare, 
diversamente da quella in esempio che ha una sola chiave primaria, ha 2 
chiavi primarie che sono: NrProgressivo   e     DataNrProgressivo. Come 
effettuare la sincronizzazione con due chiavi primarie ?
Il codice d'esempio funziona benissimo e mi pare di averlo scaricato dal 
sito comune, ma il problema è che quando si apre la prima maschera "f1", in 
automatico apre anche la seconda form "f2" per la sincronizzazione, cosa che 
non interessa, in quanto vorrei poter aprire a piacimento la "f2" con un 
pulsante di comando, solo quando è necessario correlare record da inserire.
Ho provato a modificare il seguente codice creando un pulsante di comando, 
lasciando comunque su Current della form il codice di sincronizzazione, 
purtroppo nonostante i diversi tentativi non sono riuscito a risolvere.
---------------------- codice inserito in form 
"f1" -----------------------------------
Option Compare Database
Private Sub Form_Current()
On Error GoTo Err_Form_Current
' Se la maschera f2 è già aperta, visualizza i prodotti del fornitore 
selezionato.
    Dim strNomeDoc As String
    Dim strCriteriCollegamento As String
        strNomeDoc = "f2"
        strCriteriCollegamento = "IDPrincTab2 = Forms!f1!IDPrincTab1"
        '[IDFornitore] = Forms![Fornitori]![IDFornitore]"
    If IsNull(Me![IDPrincTab1]) Then
        Exit Sub
    ElseIf Caricata("f1") Then
        DoCmd.OpenForm strNomeDoc, , , strCriteriCollegamento
    End If
Esci_Form_Current:
    Exit Sub
Err_Form_Current:
    MsgBox Err.Description
    Resume Esci_Form_Current
End Sub
---------------------- codice inserito in form 
"f2" -----------------------------------
Option Compare Database
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Me.IDPrincTab2.Value = Forms!f1!IDPrincTab1
End Sub
 Dim strCond As String
 strCond = "Forms!f2!IDPrincTab2 = Forms!f1!IDPrincTab1"
  If IsLoaded([f2]) Then
 Me.Forms![f2].FilterOn = True
 Me.Forms![f2].Filter = strCond
 End If
End Sub
---------------------- codice inserito in form "f2"  nella proprietà 
filtro-----------------------------------
IDPrincTab2 = Forms!f1!IDPrincTab1
----------- fine codice ---------------------
Mille grazie, Bruno

 purtroppo nonostante i diversi tentativi non sono riuscito a risolvere.
[CUT]
Ho scordato di menzionare che alla form principale dovranno essere 
sincronizzare piů maschere ove verranno inseriti dati diversi collegati alle 
due chiavi primarie della form principale.
Grazie
Bruno 

[CUT]
Per maggiore chiarezza ho cambiato i nomi dei 2 campi chiave primarie. Con 
il seguente codice pare che funsioni. Imputa sia il "NrProgrTab1" in 
"Forms!f1!NrProgrTab2" sia la data "DataNrProgrTab1" in 
"Forms!f1!DataNrProgrTab2"., l'unica che mi appare strano è che non riesco a 
far accettare il filtro nella proprietà della form "f2" come segue: 
NrProgrTab2 = Forms!f1!NrProgrTab1 And DataNrProgrTab2 = 
Forms!f1!DataNrProgrTab1, come anche nella "strCriteriCollegamento = " della 
form "f1" e nella "strCond = " della form "f2". Preciso che per unire le 
stringhe ho utilizzato si And, sia & che +, avendo solo pernacchie come 
risposte. Se non ho creato troppa confusione, potete aiutarmi a capire. 
Grazie Ancora da Bruno
---------------------- codice inserito in form 
"f1" -----------------------------------
Option Compare Database
Private Sub Form_Current()
On Error GoTo Err_Form_Current
' Se la maschera f2 è già aperta, visualizza i prodotti del fornitore 
selezionato.
    Dim strNomeDoc As String
    Dim strCriteriCollegamento As String
        strNomeDoc = "f2"
        strCriteriCollegamento = "NrProgrTab2 = Forms!f1!NrProgrTab1"
    If IsNull(Me![NrProgrTab1]) Then
        Exit Sub
    ElseIf Caricata("f1") Then
        'La seguente stringa apre la form in foglio dati
        DoCmd.OpenForm strNomeDoc, acFormDS, , strCriteriCollegamento
        'La seguente stringa apre la form come maschera singola
        'DoCmd.OpenForm strNomeDoc, , , strCriteriCollegamento
    End If
Esci_Form_Current:
    Exit Sub
Err_Form_Current:
    MsgBox Err.Description
    Resume Esci_Form_Current
End Sub
---------------------- codice inserito in form 
"f2" -----------------------------------
Option Compare Database
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Me.NrProgrTab2.Value = Forms!f1!NrProgrTab1
    Me.DataNrProgrTab2.Value = Forms!f1!DataNrProgrTab1
End Sub
 Private Sub Form_Current()
 Dim strCond As String
 strCond = "Forms!f2!NrProgrTab2 = Forms!f1!DataNrProgrTab1"
 ' Use the IsLoaded function from the Northwind
 ' sample database to check whether the Products
 ' form is open, then set the properties.
 If IsLoaded([f2]) Then
 Me.Forms![f2].FilterOn = True
 Me.Forms![f2].Filter = strCond
 End If
End Sub
---------- codice inserito in form "f2"  nella proprietà 
filtro-----------------
NrProgrTab2 = Forms!f1!NrProgrTab1
----------- fine codice ---------------------
Riciao da Bruno

[CUT]
Negativo, non funzia. Non riesco a far funzionare le forms aprendo la form 
da sincronizzare con un pulsante. I record non cambiano se mi sposto su 
altro record della form principale,
čE' una giornata intera che ci provo. Aiuto!!!
Ciao, Bruno 

 sito comune, ma il problema è che quando si apre la prima maschera "f1", in 
Ok. Personalmente pero' non conosco molto il software che sta sul sito
Lascia stare cio che fai.
Cosa vuoi fare?
--
ac

 ha scritto nel messaggio 
news:BgjWk.36225$8%.19915@tornado.fastwebnet.it...

-------------------
Ciao, da una form principale, con un pulsante di comando vorrei aprire 
un'altra form che sia sincronizzata, per intenderci... come se fosse una 
sottomaschera, al fine di poter inserire i dati (diversi record) da 
correlare alla tabella della form principale che possiede 2 chiavi primarie 
che sono: NrProgrTab2 e DataNrProgrTab. Le form da aprire sono circa 10, 
ovviamente da aprire una per volta, ed anno nella propria tabella i 2 campi 
denominati come quelli della form principale, naturalmente non sono chiavi 
primarie perchè devono poter contenere diversi record con stesso Nr e Data.
Oltre che poter correlare i dati, vorrei anche poterli visualizzare quando 
scorro i record della form principale. mamma mia che stanchezza oggi.
E' un macello questo codice VBA, anzi codice Matrix per me.
Grazie Alessandro!!
Bruno


Ciao Bruno, insisto, su una tabella e' possibile "unasolachiaveprimaria"
Quello che puoi avere sono "n" chiavi che identificano univocamente un
record ma solo una di queste e' definibile "primaria".
Una chiave (indice) poi può essere composta da piu' attributi (o colonne 
che dir si voglia).
Questo per la parte  teorica.
Private Sub Form_Current()
On Error Resume Next
     Dim X As Variant
     Dim strCond As String
     strCond = "codicebase = '" & Me.Codice & "'"
     Parent!sCodDettaglio.Form.FilterOn = True
     Parent!sCodDettaglio.Form.Filter = strCond
     Parent!sCodDettaglio.Visible = True
End Sub
questo codice fa esattamente quello che chiedi.
L'ho recuperato ad una applicazione che ho in "produzione"
Il contesto e' leggermente diverso dal tuo perche' sono sottomaschere di
una form padre (Parent) ma se sostituisci
Parent!sCodDettaglio.Form
con
Forms!nomeform
ottieni lo stesso effetto
e' sufficiente e necessario avviare alla form collegata il corretto 
criterio di filtro i.e. strCond nel codice soprariportato
Non mi sembra poi cosi' "Matrix"
Ciao Bruno.
--
ac

Bruno - S95 ha scritto:
P.S.
Nella mia applicazione non ci sono pulsanti.
E' chiaro che se tu usi un pulsante ad ogni "current" ti devi salvare il 
criterio di relazione e poi avviarlo al click del pulsante
--
ac


***** Ciao e grazie Alessandro, domani provo a smanettare un pochino e poi 
ti faccio sapere. Domani sera posto di nuovo, verso le 08.30 se non faccio 
tardi a lavoro.
Bruno 

 ha scritto nel messaggio 
news:mtkWk.36404$8%.1452@tornado.fastwebnet.it...

Abbi pazienza, non oso immaginare cosa mi diresti se mi avessi d'avanti a 
te, cosa intendi?
Puoi spiegarmelo in modo che io capisca meglio. Sono untantino imbarazzato 
per quanto sono di legno.
Grazie
Bruno 

 ha scritto nel messaggio 
news:mtkWk.36404$8%.1452@tornado.fastwebnet.it...

----------
Scusami ancora Alessandro, a prima vista, per come ho messo e cambiato il 
codice, sembra che funzioni.
Ho utilizzato una sola chiave nelle condizioni della stringa: strCond = 
"NrProgrTab2 = Forms!f1!NrProgrTab1", senza però riuscire a dargli anche il 
criterio della data, infatti non riesco a fargliele accettare entrambi. 
Forse sbaglio nello scrivere. Puoi vedere tu.
strCond = "NrProgrTab2 = Forms!f1!NrProgrTab1" & "DataNrProgrTab2 = 
Forms!f1!DataNrProgrTab1"
Scusami ancora e grazie
Bruno 

 ****** mi sento un pocchino imb... , cosa intendi per criterio i.e. strCond.
strCond e' una variabile che contiena la regola di filtro che vuoi 
applicare ad esempio
strCond=" campo1 = valore and campo2 = valore"
e' una "Where" senza la parola "where"
--
ac

 Forms!f1!DataNrProgrTab1"
strCond = "NrProgrTab2 = " & Forms!f1!NrProgrTab1" & " and 
DataNrProgrTab2 = " & controllodata
Attenzione agli apici o al diesis (#) nell'indicare la data
--
ac

 ha scritto nel messaggio 
news:njlWk.36456$8%.2400@tornado.fastwebnet.it...

-----------
Ancora mille grazie. Senti, vista l'ora, non č che sei mezzo vampiro. Io ti 
saluto e ti auguro una buona noces.
Bruno 

 ha scritto nel messaggio 
news:njlWk.36456$8%.2400@tornado.fastwebnet.it...

-----------------------
Ciao Alessandro, proprio non ci cavo piede. Con il permesso del News e 
confidando nella tua (spero) disponibilità ti chiedo se posso inviarti ib 
database. Sono solo due tabelle. Diversamente non riesco ad andare avanti.
Grazie
Bruno 

 ha scritto nel messaggio 
news:njlWk.36456$8%.2400@tornado.fastwebnet.it...

Dopo 3 giorni ho risolto definitivamente creando un valore univoco composto 
dalla seguente formula ed utilidando il codice a seguire.
ID_ODS_Query: Format([NrProgrTab1];"000") & 
Format(Month([DataNrProgrTab1]);"00") & Format(Day([DataNrProgrTab1]);"00") 
& Format(Year([DataNrProgrTab1]);"0000")
il codice viene imputato automaticamente nel campo della tabella primaria, 
anche in caso di modifica e la visualizzazione dei record con la form 
secondaria avviene regolarmente. Ovviamente ho messo le 2 tabelle in 
relazione 1 a molti con integrità referenziale.
Ciao a tutti e grazie ancora per il tempo dedicatomi.
Bruno
----------- Form principale ------------------
Option Compare Database
Private Sub Form_BeforeUpdate(Cancel As Integer)
 Me.ID_ODS.Value = Me.ID_ODS_Query
End Sub
Private Sub Form_Current()
     On Error Resume Next
     Dim X As Variant
     Dim strCond As String
     strCond = "ID_ODS = Forms!f1!ID_ODS"
     Forms!f2.Form.FilterOn = True
     Forms!f2.Form.Filter = strCond
     Forms!f2.Visible = True
End Sub
Private Sub Comando6_Click()
    On Error GoTo Err_Comando6_Click
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "f2"
    DoCmd.OpenForm stDocName, acFormDS, , stLinkCriteria
Exit_Comando6_Click:
    Exit Sub
Err_Comando6_Click:
    MsgBox Err.Description
    Resume Exit_Comando6_Click
End Sub
-------------------- form secondaria da aprire -----------------
Option Compare Database
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Me.ID_ODS.Value = Forms!f1!ID_ODS
End Sub
Private Sub Form_Current()
    Dim strCond As String
    strCond = "ID_ODS = Forms!f1!ID_ODS"
    Me.Filter = strCond
    Me.FilterOn = True
End Sub
Private Sub Form_Open(Cancel As Integer)
    Call Form_Current
End Sub