Trasferire dati da una maschera all'altra

di il
12 risposte

Trasferire dati da una maschera all'altra

Buongiorno,

avrei un mezzo casino da cui non ne esco da ormai 2 settimane.
Ipotiziamo per un attimo che abbia un database con vari campi, chiamiamoli campo1 nella maschera 1 e campo 2 nella maschera 2, che fantasia.
Ipotiziamo che ci sia un sistema, nel campo 1 maschera1, che mi dice "occhio, non esiste questo valore, vuoi inserirlo?" nel momento in cui non esiste il valore. Dopo aver premuto "si" nel MSGBOX mi apre la maschera 2 e mi posiziona il focus sul campo 2, inserisco il mio dato inesistente fino a quel momento e lo salvo. A tal punto arriva la domanda: chiudendo la maschera 2 e riaprendo la maschera 1, come faccio a trovarmi il dato nuovo, appena aggiunto, nella maschera 1 campo 1?

12 Risposte

  • Re: Trasferire dati da una maschera all'altra

    Argomento trito e ritrito...
    Si apre la Form2 in modalità acAdd e acDialog, quindi su Unload si forza il cancel a True e si mette a Visible=False.
    A quel punto si torna al codice in Form1 e si fa il Requery spostandosi poi all'ultimo record appena inserito.

    Prova a buttar giù la logica descritta... sono 3 righe di codice.
  • Re: Trasferire dati da una maschera all'altra

    @Alex ha scritto:


    Argomento trito e ritrito...
    Si apre la Form2 in modalità acAdd e acDialog, quindi su Unload si forza il cancel a True e si mette a Visible=False.
    A quel punto si torna al codice in Form1 e si fa il Requery spostandosi poi all'ultimo record appena inserito.

    Prova a buttar giù la logica descritta... sono 3 righe di codice.
    Ok, ci provo. Non prometto che esca una cosa tanto sensata...
  • Re: Trasferire dati da una maschera all'altra

    @Alex ha scritto:


    Argomento trito e ritrito...
    Si apre la Form2 in modalità acAdd e acDialog, quindi su Unload si forza il cancel a True e si mette a Visible=False.
    A quel punto si torna al codice in Form1 e si fa il Requery spostandosi poi all'ultimo record appena inserito.

    Prova a buttar giù la logica descritta... sono 3 righe di codice.
    Perdonami la domanda, cancel = true e "visible=false" a cosa li devo applicare...?

    Fino ad aprire form 2 in modalità acadd e acdialog ci sono, il requery mi sembra semplice... (semplice requery sull'attivazione della maschera... giusto oppure ho fatto una castroneria?)

    E poi, finestra di dialogo... é d'obbligo per questa situazione?
  • Re: Trasferire dati da una maschera all'altra

    Paveyard ha scritto:


    @Alex ha scritto:


    Argomento trito e ritrito...
    Si apre la Form2 in modalità acAdd e acDialog, quindi su Unload si forza il cancel a True e si mette a Visible=False.
    A quel punto si torna al codice in Form1 e si fa il Requery spostandosi poi all'ultimo record appena inserito.

    Prova a buttar giù la logica descritta... sono 3 righe di codice.

    Paveyard ha scritto:


    Perdonami la domanda, cancel = true e "visible=false" a cosa li devo applicare...?
    Nella mia frase "si forza Cancel a True" qual'è il Soggetto...? "Evento Unload"...!!!!
    Guarda l'evento Unload... potresti avere qualche chiarimento...!
    Visibile a cosa può essere riferito... se non alla Form stessa...?

    Paveyard ha scritto:


    Fino ad aprire form 2 in modalità acadd e acdialog ci sono, il requery mi sembra semplice... (semplice requery sull'attivazione della maschera... giusto oppure ho fatto una castroneria?)
    E poi, finestra di dialogo... é d'obbligo per questa situazione?
    Questo è l'unica cosa importante, che rende SINCRONA l'esecuzione della Form2... altrimenti appena apri la Form2 esegui il requery e non conta nulla, mentre con [acDialog] il codice si sospende, e riprende appena la Form2 diventa NON VISIBILIE o si chiude..., nel tuo caso anche il close va bene..., quindi ancora più semplice non devi scrivere nulla nella Form...
  • Re: Trasferire dati da una maschera all'altra

    @Alex ha scritto:


    Paveyard ha scritto:


    @Alex ha scritto:


    Argomento trito e ritrito...
    Si apre la Form2 in modalità acAdd e acDialog, quindi su Unload si forza il cancel a True e si mette a Visible=False.
    A quel punto si torna al codice in Form1 e si fa il Requery spostandosi poi all'ultimo record appena inserito.

    Prova a buttar giù la logica descritta... sono 3 righe di codice.

    Paveyard ha scritto:


    Perdonami la domanda, cancel = true e "visible=false" a cosa li devo applicare...?
    Nella mia frase "si forza Cancel a True" qual'è il Soggetto...? "Evento Unload"...!!!!
    Guarda l'evento Unload... potresti avere qualche chiarimento...!
    Visibile a cosa può essere riferito... se non alla Form stessa...?

    Paveyard ha scritto:


    Fino ad aprire form 2 in modalità acadd e acdialog ci sono, il requery mi sembra semplice... (semplice requery sull'attivazione della maschera... giusto oppure ho fatto una castroneria?)
    E poi, finestra di dialogo... é d'obbligo per questa situazione?
    Questo è l'unica cosa importante, che rende SINCRONA l'esecuzione della Form2... altrimenti appena apri la Form2 esegui il requery e non conta nulla, mentre con [acDialog] il codice si sospende, e riprende appena la Form2 diventa NON VISIBILIE o si chiude..., nel tuo caso anche il close va bene..., quindi ancora più semplice non devi scrivere nulla nella Form...
    Son riuscito a fare qualcosa, sembra funzionare.
    A parte questo, visto che l'argomento é trito e ritrito, metti qualche link allora.
  • Re: Trasferire dati da una maschera all'altra

    Non mi sembra tu sia limitato nell'uso delle mani a tal punto da non riuscire a fare una ricerca...
  • Re: Trasferire dati da una maschera all'altra

    @Alex ha scritto:


    Non mi sembra tu sia limitato nell'uso delle mani a tal punto da non riuscire a fare una ricerca...
    Come se non avessi provato a cercare... Il titolo della discussione dice tanto a volte.
    Potresti spiegarti meglio sul metodo che dicevi te? Il "cancel" non ha fatto altro che crearmi problemi con le maschere e sopratutto non c'ho capito niente sul come impostarlo.
  • Re: Trasferire dati da una maschera all'altra

    Ovviamente alla base c'è l'apertura SINCRONA ottenuta con la modalità AcDialog.

    Ti ho scritto che nel tuo caso, non dovendo recuperare alcunché dalla Form2, puoi eseguire il Close in modo incondizionato.
    Se avessi dovuto recuperare un Valore, non potevi chiuderla quindi si sfrutta la proprietà Visible=False per ottenere lo stesso effetto del Close, e far proseguire il codice.
    A quel punto invece del Requery oppure prima... si legge il valore dalla Form2, quindi la si chiude e si procede.

    Per gestire la finta chiusura si sfrutta l'evento Unload.
    
    Private Sub Form_Unload(Cancel As Integer)
        Cancel=Me.Visible
        Me.Visible=False
    End Sub
    
    Quando premi il Close in realtà annulla la chiusura, ma rende la Form2 non visibile e verrà chiusa dalla Form1.

    Ora hai tutti gli elementi.
  • Re: Trasferire dati da una maschera all'altra

    @Alex ha scritto:


    Ovviamente alla base c'è l'apertura SINCRONA ottenuta con la modalità AcDialog.

    Ti ho scritto che nel tuo caso, non dovendo recuperare alcunché dalla Form2, puoi eseguire il Close in modo incondizionato.
    Se avessi dovuto recuperare un Valore, non potevi chiuderla quindi si sfrutta la proprietà Visible=False per ottenere lo stesso effetto del Close, e far proseguire il codice.
    A quel punto invece del Requery oppure prima... si legge il valore dalla Form2, quindi la si chiude e si procede.

    Per gestire la finta chiusura si sfrutta l'evento Unload.
    
    Private Sub Form_Unload(Cancel As Integer)
        Cancel=Me.Visible
        Me.Visible=False
    End Sub
    
    Quando premi il Close in realtà annulla la chiusura, ma rende la Form2 non visibile e verrà chiusa dalla Form1.

    Ora hai tutti gli elementi.
    Scherzi spero... allora come mai si bloccava access se forzavo il cancel a true e se lo toglievo funzionava come sempre?
    Avevo provato a mettere la condizione che mi hai appena scritto ma continuava a bloccarsi tutto, come se fosse freezzato.
  • Re: Trasferire dati da una maschera all'altra

    Uso quella riga di codice sempre... pertanto devo intuire che il tuo problema sia generato da qualche cosa d'altro di cui hai una consapevolezza di collisione non sufficiente.
  • Re: Trasferire dati da una maschera all'altra

    Prova a cambiare il codice nel modo seguente:
    nella maschera Equipaggiamento cambiare
    
    Private Sub id_tipologia_Change()
        If Me.id_tipologia.ListIndex = -1 Then
            Dim Msg, Style, Title, Help, Ctxt, Response, MyString
            Msg = "Dato mancante, vuoi aggiungerlo?"
            Style = vbYesNo + vbCritical + vbDefaultButton2
            Title = "Dato mancante"
            Ctxt = 1000
            Response = MsgBox(Msg, Style, Title, Help, Ctxt)
            Me.Undo
            If Response = vbYes Then
                DoCmd.OpenForm "Tipologie", acNormal, , , acFormAdd, acWindowNormal
            End If
        End If
    End Sub
    
    nella maschera Tipologie cambiare
    
    Private Sub btn_save_close_Click()
        If Not IsNull(Me.tipologia) Then
            Me.Recordset.MoveLast
            Form_Equipaggiamento.id_tipologia.Requery
            Form_Equipaggiamento.id_tipologia = Me.id_tipologia
            Form_Equipaggiamento.id_tipologia.SetFocus
        End If
        DoCmd.Close
    End Sub
    
    Comunque non è buona abitudine chiamare i controlli con lo stesso nome dell'Origine dello stesso.
    Inoltre la struttura delle tabelle dovrebbe essere più curata ovvero il campo tipologia nella Tbl_Tipologie attualmente la proprietà Dimensione campo è impostata a 255, come da default, creando un spreco di spazio occupato nel database la proprietà Richiesto è impostato a No mentre dovrebbe essere impostato a e la proprietà Consenti lunghezza zero a No, per evitare l'inerimento di un record vuoto.
  • Re: Trasferire dati da una maschera all'altra

    Esprimo un mio parere, anche sui suggerimenti di Carletto che reputo errati in senso tecnico, a partire dal suggerimento di NON NOMINARE i controlli come i campi... cosa che invece io trovo la cosa estremamente comoda e funzionale, quindi magari spieghiamo perchè di questo assunto...., stessa cosa per i campi VUOTI... la proprietà di definizione la si usa con intenzionalità e non di default...!

    In prima cosa, se non si gestisce la modalità [acDialog] la tecnica richiede che la Form di ADD sia vincolata con codice incrociato e questa è una cosa da evitare...!
    Seconda cosa, le combobox espongono l'evento NOTINLIST, ed è quello da usare per l'inserimento del NUOVO aprendo la Form di Inserimento.
    Il Digitato si passa come OpenArgs e si definisce come Value nella Form aperta in Aggiunta al Controllo associato.
    Le variabili devono essere dichiarare in modo corretto, e questo non lo è assolutamente, è un errore che va capito e corretto.
    
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Si deve inserire la dichiarazione ESPLICITA delle VARIABILI che si trova negli STRUMENTI--->OPZIONI--->EDITOR del VBA
    
    Option Compare Database
    Option Explicit
    In questo modo il codice nella Form Equipaggiamento, corretto da usare è questo:
    
    Private Sub id_tipologia_NotInList(NewData As String, Response As Integer)
        If MsgBox("Value is not in list. Add it?", vbOKCancel) = vbOK Then
            ' Set Response argument to indicate that data
            ' is being added.
            Response = acDataErrAdded
            ' Add string in NewData argument to row source.
            DoCmd.OpenForm "Tipologie", acNormal, , , acFormAdd, acDialog, NewData
        Else
            ' If user chooses Cancel, suppress error message
            ' and undo changes.
            Response = acDataErrContinue
            Me.id_tipologia.Undo
        End If
    End Sub
    Mentre nella Form [Tipologie]:
    
    Option Compare Database
    Option Explicit
    
    
    Private Sub form_load()
        If Len(Me.OpenArgs) > 0 Then
            Me.tipologia.Value = Me.OpenArgs
            Me.tipologia.SetFocus
        End If
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
        DoCmd.RunCommand acCmdSaveRecord
    End Sub
    Detto questo in realtà siccome l'inserimento in questo caso è di quanto già digitato nella TextBox senza altri dati aggiunti, si può assolutamente evitare di avere una MASCHERA... il che è esattamente quanto viene riportato nella GUIDA MS:
    https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-notinlist-event-access

    In pratica si apre un RS sulla Tabella Tipologie, e recuperando il Parametro NEWDATA dell'evento NotInlist si aggiunge direttamente.
    Il tutto porterebbe quindi ad eliminare la Maschera Tipologie ed a modificare il codice dell'Evento NOTINLIST della Combo:
    
    Private Sub id_tipologia_NotInList(NewData As String, Response As Integer)
        Dim oRS As DAO.Recordset, i As Integer, sMsg As String
        If MsgBox("Value is not in list. Add it?", vbOKCancel) = vbOK Then
            ' Set Response argument to indicate that data
            ' is being added.
            Response = acDataErrAdded
            Set oRS = DBEngine(0)(0).OpenRecordset("Tbl_Tipologie")
            oRS.AddNew
            oRS.Fields("tipologia").Value = NewData
            oRS.Update
            oRS.Close
            Set oRS=Nothiung
        Else
            ' If user chooses Cancel, suppress error message
            ' and undo changes.
            Response = acDataErrContinue
            Me.id_tipologia.Undo
        End If
    End Sub
Devi accedere o registrarti per scrivere nel forum
12 risposte