Automazione requery di combobox

di il
21 risposte

Automazione requery di combobox

Buongiorno,
ho il seguente inghippo che non so come risolvere.
Esplicito la situazione utilizzando nomi semplificati: ho tre tabelle tblOfferteclienti, tblOrdiniclienti e tblCommesse.

tblOfferteclienti con i campi: IDofferta (PK), IDCliente (FK), Numeroofferta, Revisioneofferta, Dataofferta, Linkofferta, Flagoffertaevasa
tblOrdiniclienti con i campi: IDordine (PK), IDCliente (FK), Numeroordine, Revisioneordine, Dataordine, Linkordine, Flagoordineevaso
tblCommesse con i campi: IDCommessa (PK), IDCliente (FK), IDofferta (FK), IDordine (FK), + altri campi

Per ognuna delle tre tabelle ho le relative forms di inserimento/interrogazione dati. 
La procedura corretta in ordine cronologico prevederebbe l'inserimento dell'anagrafica offerta fatta al cliente, poi a seguire l'inserimento dell'anagrafica ordine cliente ed infine le creazione della commessa di lavoro.
Quando inserisco la commessa di lavoro seleziono la relativa offerta cliente e l'ordine cliente da due combobox che mi propongono un elenco di dati non ancora evasi (flag=falso) per il Cliente selezionato.
Le combo si basano su query di selezione che hanno la seguente origine (questa e' quella delle offerte, analoga per gli ordini): 

SELECT DISTINCT tblOfferteclienti.IDofferta, tblOfferteclienti.Numeroofferta, tblOfferteclienti.Dataofferta, tblOfferteclienti.Revisioneofferta FROM tblOfferteclienti WHERE (((tblOfferteclienti.IDCliente)=[Maschere]![frmPRcommessaprincipale]![IDCliente]) AND ((tblOfferteclienti.FLAGtabOEoffertaevasa)=False)) ORDER BY tblOfferteclienti.DATAtabOEdataofferta DESC , tblOfferteclienti.DEStabOEnumeroofferta DESC , tblOfferteclienti.Revisioneofferta DESC;

E fin qui tutto bene. 
Quando devo interrogare l'offerta selezionata o se devo inserire una nuova offerta non ancora in elenco ho le seguente routine sul doppio click della combo:

Private Sub cboIDofferta_DblClick(Cancel As Integer)
On Error GoTo Err_cboIDofferta_DblClick
   Dim stDocName As String
   Dim stLinkCriteria As String
   stDocName = "frmOfferteclienti"
   If Not IsNull(Me.cboIDofferta.Value) Then
       stLinkCriteria = "[IDofferta]=" & Me![cboIDofferta]
       DoCmd.OpenForm stDocName, , , stLinkCriteria
   Else
       DoCmd.OpenForm stDocName, , , , acFormAdd
   End If
Exit_cboIDofferta_DblClick:
   Exit Sub
Err_cboIDofferta_DblClick:
   MsgBox Err.Description
   Resume Exit_cboIDofferta_DblClick
End Sub

Il problema me lo trovo dopo avere inserito la nuova offerta e chiudo la frmOfferteclienti, ritorno sulla frmCommessa con il fucus nella cboIDofferta pero' ovviamente non mi trovo il valore appena inserito finche' non c'e' il requery della combo e per fare cio' devo uscire dal controllo e poi rientrare (ho inserito sul gotfocus del controllo Me.cboIDofferta.Requery).

Sono quindi a chiedere un Vostro consiglio su come poter automatizzare questo requery, sempre che sia possibile, senza dover uscire e rientrare nel controllo (la situazione e' ovviamente analoga anche per l'ordine). 
Grazie in anticipo

21 Risposte

  • Re: Automazione requery di combobox

    Devi aprire le Form di Interazione secondaria in modalità [acDialog] o Sincrona Modale

    DoCmd.OpenForm stDocName, , , , acFormAdd, acDialog  ' quì il codice si ferma fino alla chiusura
    Me.Requery

    Questo ti consente di sapere quando viene chiusa la Form di Aggiunta, ed al rientro fai il Requery.

    Ovviamente si può fare qualche cosa di più “finito”, magari predisporre una Public Property nella Form che restituisca un True se hai aggiunto/modificato veramente… quindi invece di chiudere si rende VISIBLE=FALSE

    Private Sub Form_Unload(Cancel As Integer)
        Cancel = Me.Visible
        Me.Visible = False
    End Sub

    In questo modo quano chiudi la Form di inserimento, in realtà la rendi NON VISIBILE, dalla Form chiamante leggi la Public Property che creerai, ed in base al valore fai il Requery:

    DoCmd.OpenForm stDocName, , , , acFormAdd, acDialog  ' quì il codice si ferma fino alla chiusura
    If Forms(stDocName).Form.TuaSpecialProperty=True Then Me.Requery

    Se poi devi andare al Record di Inserimento allora la property la Valorizzi con l'ID dell'inserimento se esiste…

    ecc….

  • Re: Automazione requery di combobox

    Grazie Alex, ho risolto con la prima parte del Tuo suggerimento quindi aprendo la form in modalita' acDialog e fatto il requery .

    Unico aspetto “scomodo” e' la visione della maschera popup quindi non a tutto schermo…

  • Re: Automazione requery di combobox

    20/06/2023 - Mailman ha scritto:


    Unico aspetto “scomodo” e' la visione della maschera popup quindi non a tutto schermo…

    Fai questa prova, quando si apre, trascina i suoi bordi al massimo che puoi, tanto da coprire tutto, poi clicca con il tasto destro del mouse sull'intestazione e scegli Salva.

  • Re: Automazione requery di combobox

    20/06/2023 - Mailman ha scritto:


    Grazie Alex, ho risolto con la prima parte del Tuo suggerimento quindi aprendo la form in modalita' acDialog e fatto il requery .

    Unico aspetto “scomodo” e' la visione della maschera popup quindi non a tutto schermo…

    Inserisci un DoCmd.Maximize su Load di maschera.

  • Re: Automazione requery di combobox

    20/06/2023 - OsvaldoLaviosa ha scritto:


    20/06/2023 - Mailman ha scritto:


    Unico aspetto “scomodo” e' la visione della maschera popup quindi non a tutto schermo…

    Fai questa prova, quando si apre, trascina i suoi bordi al massimo che puoi, tanto da coprire tutto, poi clicca con il tasto destro del mouse sull'intestazione e scegli Salva.

    I bordi della maschera non sono editabili.

    20/06/2023 - @Alex ha scritto:


    20/06/2023 - Mailman ha scritto:


    Grazie Alex, ho risolto con la prima parte del Tuo suggerimento quindi aprendo la form in modalita' acDialog e fatto il requery .

    Unico aspetto “scomodo” e' la visione della maschera popup quindi non a tutto schermo…

    Inserisci un DoCmd.Maximize su Load di maschera.

    Avevo gia' provato il Tuo suggerimento Alex, ma non mi soddisfa perche' la maschera prende tutto lo schermo coprendo la barra multifunzione.

    La preferenza e' per una visualizzazione a schede di questo tipo, in cui la form che si apre prende in larghezza ed in lunghezza lo schermo ma mantenendo visibile la barra multifunzione e la barra di accesso rapido:

  • Re: Automazione requery di combobox

    Prova quest'altra soluzione:
    1. Togli acDialog e Me.Requery dal codice di cboIDofferta. In questo modo la maschera avrà le dimensioni che tu conosci.
    2. All'evento Su chiusura di frmOfferteclienti scrivi questo

    Forms!NomeMascheraPrincipale!cboIDofferta = Me!IDOfferta
    Forms!NomeMascheraPrincipale!cboIDofferta.Requery
  • Re: Automazione requery di combobox

    Devi accettare il compromesso grafico perche le popup sono fatte cosi apposta per essere sempre in primo piano finche non le chiudi, ma il metodo tecnicamente corretto è solo quello suggerito.

    Se non la rendi modale serve fare accrocchi insensati, che peraltro espongono a possibili problemi se sposti il focus su altre forms…

    Da considerare che gli oggetti si devono lasciare più indipendenti possibile, ovvero non si vincola il codice di una form ad un'altra, ipotiziamondi poterfare inserimenti da piu punti costringerebbe di dovwr fare N Forms identiche….vedi esempio di Osvaldo, non è buona tecnica di sviluppo.

    In ogni casoo. .. vedrai tu.

  • Re: Automazione requery di combobox

    20/06/2023 - @Alex ha scritto:


    Devi accettare il compromesso grafico perche le popup sono fatte cosi apposta per essere sempre in primo piano finche non le chiudi, ma il metodo tecnicamente corretto è solo quello suggerito.

    Se non la rendi modale serve fare accrocchi insensati, che peraltro espongono a possibili problemi se sposti il focus su altre forms…

    Da considerare che gli oggetti si devono lasciare più indipendenti possibile, ovvero non si vincola il codice di una form ad un'altra, ipotiziamondi poterfare inserimenti da piu punti costringerebbe di dovwr fare N Forms identiche….vedi esempio di Osvaldo, non è buona tecnica di sviluppo.

    In ogni casoo. .. vedrai tu.

    Ciao @Alex se posso approfittare ti volevo chiedere una cosa in merito al setFocus dove spesso ci sbatto il naso…

    Esempio:

    • Form principale “Pippo” con recordsouce una tabella
    • Il Corpo della form principale impostato su visible = False
      • nell' Intestazione Form “Pippo” ho un button per aprire una form “Pluto” in popup
        • dalla Form “Pluto" seleziono un record per il quale mi salvo il suo ID chiave primaria 
          • Chiusura della Form “Pluto” e ritorno alla routine del button della Form “Pippo”
      • se ho selezionato un ID chiave dalla form “Pluto” allora:
        • rendo Visibile il Corpo della Form “Pippo” 
        • imposto la Form “Pippo” su inserimento new record e  Me.AllowAdditions = True
        • Imposto il Focus su un controllo ma non ha nessun effetto …..
    ' INSERT NEW REWCORD
    Private Sub btnInsert_Click()
    ' set filter and form
    MySetFilterForm
    ' set buttons and form
    MySetButtons 1
    ' open document search
    lngIdDocTypeSearch = 0
    DoCmd.OpenForm "Frm_DocTypeSelect", acNormal, , , acFormReadOnly, acDialog
    ' check search return
    If lngIdDocTypeSearch > 0 Then
       ' set buttons and form
       MySetButtons 2	------->>>> in questa Sub viene impostato : Me.Corpo.Visible = True  e  Me.AllowAdditions = True		
       ' set form new record
       DoCmd.GoToRecord , , acNewRec
       Me.IdDocType = lngIdDocTypeSearch
       Me.IdClienti.SetFocus	-------->>>>> non prende il Focus (è una ComboBox con campo associato IdClienti nascosto e 
    End If									  la colonna visibile è la Descrizione del Cliente)
    End Sub

    Nel nuovo record in Insert, dopo aver impostato il tipo IdDocType proveniente dalla Form di popup, e fino a qui tutto bene, 
    non prende il Focus nel controllo Me.IdClienti

    e il cursore non sono riuscito a capire dove si è posizionato… in Testata della form non c'è, nel corpo della Form non c'è… ma dove caspita va a finire il Focus ?  (con i tasti di spostamento il cursore è come se non ci fosse più fin quando non seleziono almeno un controllo con il mouse)

    E' come se la Form principale non avesse più lo stato di attivo… possibile secondo te?

    Grazie

    P.S.  con il debug rilevo Me.ActiveControl.Name che è = a IdClienti , ma il focus non lo prende ;(

  • Re: Automazione requery di combobox

    Scenario Non chairo… da dentro la form non è possibile non prenda il focus probabilmente non comprendo bene.

    Ma la form secondaria è chiusa…? Credo di si… io non la chiudo per evitare di usare variabili globali ma la rendo non visibile e ne leggo le Public Properties Custom, non accedo ai controlli.

    Lette le proprietà la chiudo.

    Nel tuo caso penso che il problema possa essere nella sequenza… ovvero sposti il focus quando ancora il corpo non è ridisegnato attivo…?

    Dovrei vedere sono certo sia legato alla manipolazione del corpo, che peraltro non farei…

    Hai pensato a mettere la section(corpo) ad Altezza=0 invece che usare la proprietà Visible…?

  • Re: Automazione requery di combobox

    20/06/2023 - @Alex ha scritto:


    Scenario Non chairo… da dentro la form non è possibile non prenda il focus probabilmente non comprendo bene.

    Ma la form secondaria è chiusa…? Credo di si… io non la chiudo per evitare di usare variabili globali ma la rendo non visibile e ne leggo le Public Properties Custom, non accedo ai controlli.

    Lette le proprietà la chiudo.

    Nel tuo caso penso che il problema possa essere nella sequenza… ovvero sposti il focus quando ancora il corpo non è ridisegnato attivo…?

    Dovrei vedere sono certo sia legato alla manipolazione del corpo, che peraltro non farei…

    Hai pensato a mettere la section(corpo) ad Altezza=0 invece che usare la proprietà Visible…?

    Ci provo subito ,  grazie

  • Re: Automazione requery di combobox

    20/06/2023 - @Alex ha scritto:


    Scenario Non chairo… da dentro la form non è possibile non prenda il focus probabilmente non comprendo bene.

    Ma la form secondaria è chiusa…? Credo di si… io non la chiudo per evitare di usare variabili globali ma la rendo non visibile e ne leggo le Public Properties Custom, non accedo ai controlli.

    Lette le proprietà la chiudo.

    Nel tuo caso penso che il problema possa essere nella sequenza… ovvero sposti il focus quando ancora il corpo non è ridisegnato attivo…?

    Dovrei vedere sono certo sia legato alla manipolazione del corpo, che peraltro non farei…

    Hai pensato a mettere la section(corpo) ad Altezza=0 invece che usare la proprietà Visible…?

    Primo Test:
    non mi fa mettere altezza = 0 … probabilmente perche nel corpo c'è anche una subform ?

    Secondo Test:
    se lascio Corpo sempre visibile, il setfocus sul controllo funziona perfettamente 

    In pratica il ciclo è: 
    - openform dove visualizzare solo la Testata della Form
    - su Insert new record, dal ritorno ricerca tipo documento da creare:
       - visualizza nel corpo i controlli per i dati di testata documento
       - quando completato i dati di testa documento, nel corpo visualizza la sub form collegata con i dati di dettaglio

  • Re: Automazione requery di combobox

    21/06/2023 - By65Franco ha scritto:


    Primo Test:
    non mi fa mettere altezza = 0 … probabilmente perche nel corpo c'è anche una subform ?

    Se ci sono controlli ovviamente non consente di mettere a Zero, ma se hai solo la Sottomaschera, basta mettere a ZERO prima il Container della SubForm e poi il Corpo… se hai altri controlli non conviene, ovviamente al ripristino prima il Corpo poi la SubForm.

    Secondo Test:
    se lascio Corpo sempre visibile, il setfocus sul controllo funziona perfettamente 

    In pratica il ciclo è: 
    - openform dove visualizzare solo la Testata della Form
    - su Insert new record, dal ritorno ricerca tipo documento da creare:
       - visualizza nel corpo i controlli per i dati di testata documento
       - quando completato i dati di testa documento, nel corpo visualizza la sub form collegata con i dati di dettaglio

    Ma perchè non lasci sempre il corpo Visibile con i controlli Disabilitati o se proprio Non visibili…?
    Per la 2°(Non visibili) li metti in una Struttura a schede con solo una Pagina impostando lo “STILE”=NESSUNO, a quel punto ti basta rendere VISIBILE o NON VISIBILE la struttura schede… che viene usata come Container.

    Per il problema invece vero e proprio, dovrei fare qualche prova di dettaglio, ma sono certo abbia a che fare proprio con la corretta sequenza… 

  • Re: Automazione requery di combobox

    21/06/2023 - @Alex ha scritto:


    Per il problema invece vero e proprio, dovrei fare qualche prova di dettaglio, ma sono certo abbia a che fare proprio con la corretta sequenza… 

    Capito, faccio ulteriori test sulla base di quello che hai suggerito.

    Per il resto se vuoi fare delle verifiche sul mio DB ti metto il link da scaricare… è solo una piccola demo.
    Fammi sapere e lo metto….
    e grazie mille!

  • Re: Automazione requery di combobox

    Si Franco non ti garantisco tempi ma se hai un esempio usabile per replicare il problema, volentieri.

Devi accedere o registrarti per scrivere nel forum
21 risposte