Accodare con maschere aperte

di il
5 risposte

Accodare con maschere aperte

Riprendendo lo stesso scenario maschere di questo post
https://www.iprogrammatori.it/forum-programmazione/access/casella-combinata-non-mostra-subito-t15656.html
mi può capitare quanto segue:
Normalmente tento di scegliere un valore dalla casella combinata X, se non c'è ecc...
Supponiamo il caso che io devo inserire 20 Nuovi valori in X, piuttosto che solleticare il campo X 20 volte con continue aperture della maschera C, preferirei aprire direttamente C, inserire i 20 nuovi valori e "accodare" il tutto in X.
Secondo le mie conoscenze attuali, ho sempre preferito evitare accodamenti su maschere aperte, spesso mi si bloccava tutto. Allora con una serie di azioni macro, preferisco seguire la seguente sequenza logica:
1) Memorizzare il record in corso di lavoro di A (mi servirà nel punto 5))
2) Aprire C e inserire i 20 Nuovi valori
3) Chiudere tutte le maschere
4) Accodare i 20 valori di C nel corrispondente campo X (con query di accodamento)
5) Riaprire la maschera A, riposizionandola sul record in corso di lavoro (sfruttando il discorso del punto 1)).
Raccontato così posso dire che tutto sommato funziona, ma esisterebbe una soluzione più elegante (senza chiudere/aprire maschere)?
È tanto tempo che non ritento la strada di accodare mantenendo le maschere aperte, sarebbe ancora quella la strada giusta?
Requery o RieseguiQuery sarebbero utilizzabili anche in questo caso?

5 Risposte

  • Re: Accodare con maschere aperte

    Non sono certo di aver capito...

    In tutti i casi provo a riassumere.
    La Combo(X) ha un'origine dati, nella quale devi inserire N Records, ed ovviamente la procedura ipotizzata di gestione NOTINLIST è ovviamente meglio adattabile all'inserimento Singolo.
    Vorresti quindi aprire una Maschera C, preposta all'inserimento massivo degli N Records, quindi alla chiusura aggiornare la COMBO(X).

    Bene, ti basta aprire la Form in modalità [acDialog] ovvero modalità Sincrona, nella Form inserisci tutti i records che vuoi, quindi su Unload, Forzi il CANCEL=True se VISIBLE, quindi la rendi NON VISIBILE, a quel punto il codice riprende nella Form chiamante ed esegui il Requery della COMBO...
    
    ' Dalla Form con la COMBO questo:
    DoCmd.OpenForm "FormC", , , , acFormAdd, acDialog
    Me!NomeCombo.Requery
    Docmd.Close acForm, "FormC"
    
    ' nella Form di Aggiunta "C" questo
    Private Sub Form_Unload(Cancel As Integer)
        If Me.Visible Then
            Cancel = True
            Me.Visible = False
        End If
    End Sub
    Con le macro vedi tu...
  • Re: Accodare con maschere aperte

    @Alex ha scritto:


    La Combo(X) ha un'origine dati, nella quale devi inserire N Records, ed ovviamente la procedura ipotizzata di gestione NOTINLIST è ovviamente meglio adattabile all'inserimento Singolo.
    Vorresti quindi aprire una Maschera C, preposta all'inserimento massivo degli N Records, quindi alla chiusura aggiornare la COMBO(X).
    Hai capito benissimo, ma oltre ad aggiornare la lista interna della combo X, vorrei accodare gli N Records e ovviamente vederli.

    Vuoi forse dirmi che acDialog garantisce un automatico inserimento da C verso X? Non credo!

    @Alex ha scritto:


    DoCmd.OpenForm "FormC", , , , acFormAdd, acDialog
    Queste 4 virgole vuote sono messe a caso e quindi metterne solo una sarebbe lo stesso, oppure devo copiare integralmente la sintassi di questo rigo?

    Perchè preferisci Unload da OnClose? Dopo OnClose si perderebbe la sincronia?

    Che cos'è CANCEL?

    Non colgo la strategia di giocare sulla proprietà Visible. Passare l'attenzione sulla maschera A/B.X con qualche altra istruzione non sarebbe lo stesso?

    acFormAdd sarebbe obbligatorio o convenevole? Voglio dire, se posiziono C semplicemente su Record Nuovo (mi può tornare utile sfruttare qualche valore di campo record precedente), può funzionare lo stesso?

    Riguardo l'accodamento, vorrei segnalarti che, almeno nel mio specifico database, accade che ogni valore di C ha un senso se inserito in B. Quindi ho una query momentanea "CnonB" che significa "filtrami tutti i record di C che non stanno in B" che potrei sfruttare in accodamento successivo. Può tornare utile alla causa?
  • Re: Accodare con maschere aperte

    OsvaldoLaviosa ha scritto:


    Hai capito benissimo, ma oltre ad aggiornare la lista interna della combo X, vorrei accodare gli N Records e ovviamente vederli.

    Vuoi forse dirmi che acDialog garantisce un automatico inserimento da C verso X? Non credo!
    Se ho capito bene prova prima di diffidare...!

    OsvaldoLaviosa ha scritto:


    @Alex ha scritto:


    DoCmd.OpenForm "FormC", , , , acFormAdd, acDialog
    Queste 4 virgole vuote sono messe a caso e quindi metterne solo una sarebbe lo stesso, oppure devo copiare integralmente la sintassi di questo rigo?
    Mi stai prendendo in giro...? Se si dillo subito... smetto...
    Secondo te metto virgole a caso...????????????????????????
    Se apri la guida del VBA, capisci perchè ho messo tutte quelle virgole.

    OsvaldoLaviosa ha scritto:


    Perchè preferisci Unload da OnClose? Dopo OnClose si perderebbe la sincronia?
    Che cos'è CANCEL?
    I 2 Eventi sono diversi...
    [Unload] che espone il Parametro CANCEL consente di essere annullato e si verifica PRIMA di far chiudere la Maschera, ne consegue che annullandolo la Form rimane aperta...
    [OnClose] si verifica mentre la Form si chiude ed è impossibile annullarlo...
    Quanto ti ho suggerito si basa proprio sul concetto di non far chiudere la Form... e sotto ti spiego perchè.

    OsvaldoLaviosa ha scritto:


    Non colgo la strategia di giocare sulla proprietà Visible. Passare l'attenzione sulla maschera A/B.X con qualche altra istruzione non sarebbe lo stesso?
    La Form aperta in modalità [acDialog] come ti dicevo è SINCRONA, quindi il codice della Form chiamante viene sospeso, finchè la Form(C nel tuo caso) non viene chiusa o finchè non diventa VISIBLE=False... questo corrisponde a quando hai finito di inserire i 30 Records...
    La differenza è che se la chiudo e devo leggere dei dati nella form non riesco, nel tuo caso effettivamente questo non servirebbe...

    OsvaldoLaviosa ha scritto:


    acFormAdd sarebbe obbligatorio o convenevole? Voglio dire, se posiziono C semplicemente su Record Nuovo (mi può tornare utile sfruttare qualche valore di campo record precedente), può funzionare lo stesso?
    E' una scelta operativa... dipende solo da come vuoi che venga aperta.

    OsvaldoLaviosa ha scritto:


    Riguardo l'accodamento, vorrei segnalarti che, almeno nel mio specifico database, accade che ogni valore di C ha un senso se inserito in B. Quindi ho una query momentanea "CnonB" che significa "filtrami tutti i record di C che non stanno in B" che potrei sfruttare in accodamento successivo. Può tornare utile alla causa?
    Non ho capito...

    P.S. come ti dicevo non tutto si fa con le MACRO, ma se passi al VBA devi aprire il Visualizzatore Oggetti ed imparare ad usarlo ed a leggere le istruzioni delle funzioni.
  • Re: Accodare con maschere aperte

    Nel frattempo forse sono venuto a capo di analoghe azioni macro, leggendo l'argomento della guida in linea dal titolo "Aprire temporaneamente qualsiasi maschera come finestra di dialogo" in cui parla delle proprietà Dialogo e Visible ecc...
    Ho provato ad applicare sia macro, sia i tuoi codici VBA, ma ottengo, come risultato finale, soltanto la RieseguiQuery (Requery) nella combo, ma non l'accodamento.
    Continuo a non comprendere l'utilità dell'impostazione
    Cancel=Vero
    Se non la includo, funziona analogamente lo stesso.
    Se la dovessi includere, dove deve andare a finire? Sul pulsante di ritorno di C?

    Il discorso della query accodamento CnonB ora non ha più senso.
  • Re: Accodare con maschere aperte

    Dal clic di un pulsante sulla maschera C è possibile far funzionare la seguente sequenza di azioni macro:
    Chiudi: Maschera C
    VaiAControllo: sottomaschera B
    RieseguiQuery: X
    ApriQuery: CnonB
    ApriMaschera: A
    VaiAControllo: IDA
    EseguiComando: SelezionaRecord
    EseguiComando: Aggiorna
    Mi sembra molto più semplice, anche se l'azione
    ApriMaschera: A
    era l'unico modo per riportare l'attenzione sulla maschera A. VaiAControllo non permette di selezionare controlli gerarchicamente superiori, per lo meno non ho capito come fare.
    IDA è un controllo qualsiasi dove attirare l'attenzione: questa azione si è resa indispensabile, altrimenti le successive azioni non funzionavano.
    EseguiComando: SelezionaRecord è del tutto facoltativa, funziona anche senza.
    EseguiComando: Aggiorna corrisponde al comando da menu Record | Aggiorna e dopo la sua esecuzione, come per incanto mi mostra l'accodarsi di tutti i record nuovi di C.
Devi accedere o registrarti per scrivere nel forum
5 risposte