Discussione:
esseguire sub da un'altra Form
(troppo vecchio per rispondere)
Marco67
2017-09-15 06:50:37 UTC
Permalink
Buongiorno,
ho questo problema.

Ho la necessita' di passare il controllo alla sub xxx_AfterUpdate della
maschera A dopo aver aggiornato il valore dello stesso campo xxx.
Il problema e' che il valore xxx viene assegnato trovandomi con il focus
sulla form B.

Ho trovato anche un precedente post del 3 Marzo scorso di France dellavalle
che mi pare avesse lo stesso problema, ma proprio non riesco a risolvere.

Ho provato con questo:
...
Set frm = Forms![A]
frm![xxx].SetFocus
frm![xxx] = "valore assegnato"
Call frm.codice_AfterUpdate ' per eseguire l'azione 'Dopo
Aggiornamento' del campo X sulla Form A

E' qui l'errore su cui mi sono arenato: ho provato in vari modi, ma non
riesco proprio a capire...

Dove mi sono perso?

Grazie 1000 a tutti

Marco67
@Alex
2017-09-15 07:47:48 UTC
Permalink
Post by Marco67
Buongiorno,
ho questo problema.
Ho la necessita' di passare il controllo alla sub xxx_AfterUpdate della
maschera A dopo aver aggiornato il valore dello stesso campo xxx.
Il problema e' che il valore xxx viene assegnato trovandomi con il focus
sulla form B.
Ho trovato anche un precedente post del 3 Marzo scorso di France dellavalle
che mi pare avesse lo stesso problema, ma proprio non riesco a risolvere.
...
Set frm = Forms![A]
frm![xxx].SetFocus
frm![xxx] = "valore assegnato"
Call frm.codice_AfterUpdate ' per eseguire l'azione 'Dopo
Aggiornamento' del campo X sulla Form A
E' qui l'errore su cui mi sono arenato: ho provato in vari modi, ma non
riesco proprio a capire...
Dove mi sono perso?
Grazie 1000 a tutti
Marco67
Premesso che in quello che dici c'è qalche cosa che non torna affatto dal punto di vista tecnico... è veramente inconcepibile che tu faccia una modifica di un dato in una Maschera e poi tu debba lanciare un AfterUpdate di un'altra maschera per lo stesso dato... assurdo veramente.

Se devi interagire con i dati di una maschera su un'altra ci sono logiche ben precise che evitano questi incroci indefiniti... ma serve capire bene lo scenario.

Un esempio è gestire la FORM chiamata in modalità SINCRONA(acDialog) e, fatte le modifiche nella Form Chiamata, la si rende NON VISIBILE(invece di chiuderla) questo rimanda l'attivazione alla Form Chiamante, che può leggere il valore ed operare in modo regolare e sequenziale.

Detto questo, che vedrai tu... devi anche comprendere un ulteriore errore tecnico che stai introducendo.
Gli Eventi degli Oggetti sono PRIVATE, quindi impossibile raggiungerli dall'esterno.

Per questo motivo chi sviluppa deve ragionare in LOGICA Object Oriented.
Quindi si predispongono delle Interfacce PUBLIC, che possono essere Metodi/Proprietà o Eventi accessibili dall'esterno.

Nel tuo caso devi o dovresti creare una Function Public nella Form su cui agire in modo da poter interagire.

Es. nella Form Chiamata (chiamiamola B) devi predisporre:
Public Function ExtAfterUpdate()
Call Form_AfterUpdate()
End Function

Quindi dalla Form A scriviamo:
Call Forms("B").ExtAfterUpdate

Questa funzione Public poi rilancia sulla Private di Maschera.

Ti suggerisco in ogni caso di chiarirti le cose prima di fare troppe modifiche non adeguate.

@Alex
Marco67
2017-09-15 15:01:02 UTC
Permalink
Post by Marco67
Buongiorno,
ho questo problema.
Ho la necessita' di passare il controllo alla sub xxx_AfterUpdate della
maschera A dopo aver aggiornato il valore dello stesso campo xxx.
Il problema e' che il valore xxx viene assegnato trovandomi con il focus
sulla form B.
Ho trovato anche un precedente post del 3 Marzo scorso di France dellavalle
che mi pare avesse lo stesso problema, ma proprio non riesco a risolvere.
...
Set frm = Forms![A]
frm![xxx].SetFocus
frm![xxx] = "valore assegnato"
Call frm.codice_AfterUpdate ' per eseguire l'azione 'Dopo
Aggiornamento' del campo X sulla Form A
E' qui l'errore su cui mi sono arenato: ho provato in vari modi, ma non
riesco proprio a capire...
Dove mi sono perso?
Grazie 1000 a tutti
Marco67
Premesso che in quello che dici c'è qalche cosa che non torna affatto dal
punto di vista tecnico... è veramente inconcepibile che tu faccia una
modifica di un dato in una Maschera e poi tu debba lanciare un AfterUpdate
di un'altra maschera per lo stesso dato... assurdo veramente.

Se devi interagire con i dati di una maschera su un'altra ci sono logiche
ben precise che evitano questi incroci indefiniti... ma serve capire bene lo
scenario.

Un esempio è gestire la FORM chiamata in modalità SINCRONA(acDialog) e,
fatte le modifiche nella Form Chiamata, la si rende NON VISIBILE(invece di
chiuderla) questo rimanda l'attivazione alla Form Chiamante, che può leggere
il valore ed operare in modo regolare e sequenziale.

Detto questo, che vedrai tu... devi anche comprendere un ulteriore errore
tecnico che stai introducendo.
Gli Eventi degli Oggetti sono PRIVATE, quindi impossibile raggiungerli
dall'esterno.

Per questo motivo chi sviluppa deve ragionare in LOGICA Object Oriented.
Quindi si predispongono delle Interfacce PUBLIC, che possono essere
Metodi/Proprietà o Eventi accessibili dall'esterno.

Nel tuo caso devi o dovresti creare una Function Public nella Form su cui
agire in modo da poter interagire.

Es. nella Form Chiamata (chiamiamola B) devi predisporre:
Public Function ExtAfterUpdate()
Call Form_AfterUpdate()
End Function

Quindi dalla Form A scriviamo:
Call Forms("B").ExtAfterUpdate

Questa funzione Public poi rilancia sulla Private di Maschera.

Ti suggerisco in ogni caso di chiarirti le cose prima di fare troppe
modifiche non adeguate.

@Alex

Ho capito Alex,
provo l'apertura della maschera in modalita' AcDialog, poi utilizzero' la
funzione Public giustamente.

Grazie 1000 per il prezioso aiuto e, soprattutto, chiarezza.
Un saluto
Marco67
@Alex
2017-09-15 15:05:57 UTC
Permalink
Se usi la modalità SINCRONA non serve alcuna funzione... ti basta leggere la proprietà VALUE del controllo.

@Alex
Marco67
2017-09-15 15:58:59 UTC
Permalink
"@Alex" <***@libero.it> ha scritto nel messaggio news:25bf68c1-c877-4622-93fd-***@googlegroups.com...
Se usi la modalità SINCRONA non serve alcuna funzione... ti basta leggere la
proprietà VALUE del controllo.

@Alex

Alex,
ho risolto richiamando la function pubblica, come mi hai suggerito.

Pero', a titolo di conoscenza, penso di non aver capito l'utilizzo
dell'apertura sincrona di una form.

Ho provato ma, non mi cambia nulla:
ho aperto la mia form B dalla Form 'A' (che dovra' ricevere un valore in
base alla scelta in form 'B').
Una volta scelto un valore, lo stesso viene assegnato al campo x nella form
A.

Fin qui ok, ma il fatto e' che sulla form A deve risultare come fosse
inputato manualmente dall'utente, quindi automaticamente eseguire l'azione
afterUpdate, che anche nel caso di apertura SINCRONA (AcDialog), non
avviene.

Ripeto, ho risolto tranquillamente attraverso la public function, ma
certamente non ho capito il sistema di apertura AcDialog e come diversamente
si comporti.

Grazie ancora Alex

Continua a leggere su narkive:
Loading...